From 23b84f45cf8146befa70ac4b6095093287695648 Mon Sep 17 00:00:00 2001 From: andrewlalis Date: Tue, 23 Oct 2018 16:52:46 +0200 Subject: [PATCH 1/2] Setting a new team for a user works, although have not used live github code. --- .../andrewlalis/model/database/DbHelper.java | 12 ++++ .../model/database/TransactionContent.java | 16 +++++ .../student_actions/SetTeamListener.java | 39 +++++++++- .../andrewlalis/ui/view/ManagementView.java | 22 ++++-- .../ui/view/dialogs/TeamChooserDialog.java | 72 ++++++++++++++++++- .../table_models/StudentTeamTableModel.java | 7 ++ 6 files changed, 159 insertions(+), 9 deletions(-) create mode 100644 src/main/java/nl/andrewlalis/model/database/TransactionContent.java diff --git a/src/main/java/nl/andrewlalis/model/database/DbHelper.java b/src/main/java/nl/andrewlalis/model/database/DbHelper.java index f8f007c..716f21d 100644 --- a/src/main/java/nl/andrewlalis/model/database/DbHelper.java +++ b/src/main/java/nl/andrewlalis/model/database/DbHelper.java @@ -53,4 +53,16 @@ public class DbHelper { return studentTeams; } + /** + * Executes some transaction content. + * @param content The content to execute. + */ + public static void executeTransactionContent(TransactionContent content) { + Session session = DbUtil.getSessionFactory().openSession(); + Transaction tx = session.beginTransaction(); + content.doTransaction(session); + tx.commit(); + session.close(); + } + } diff --git a/src/main/java/nl/andrewlalis/model/database/TransactionContent.java b/src/main/java/nl/andrewlalis/model/database/TransactionContent.java new file mode 100644 index 0000000..c4dd1f0 --- /dev/null +++ b/src/main/java/nl/andrewlalis/model/database/TransactionContent.java @@ -0,0 +1,16 @@ +package nl.andrewlalis.model.database; + +import org.hibernate.Session; + +/** + * Defines a series of operations done within a transaction. + */ +public interface TransactionContent { + + /** + * Performs a transaction. Implement this method by updating, inserting, or deleting entities. + * @param session The session in which operations are being done. + */ + void doTransaction(Session session); + +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java index 0456f61..cb5233e 100644 --- a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java @@ -2,9 +2,12 @@ package nl.andrewlalis.ui.control.listeners.management_view.student_actions; import nl.andrewlalis.model.Student; import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.DbHelper; import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener; +import nl.andrewlalis.ui.view.ManagementView; import nl.andrewlalis.ui.view.dialogs.TeamChooserDialog; import nl.andrewlalis.ui.view.table_models.StudentTableModel; +import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; import javax.swing.*; import java.awt.event.ActionEvent; @@ -17,8 +20,20 @@ import java.awt.event.ActionEvent; */ public class SetTeamListener extends TableRowListener { - public SetTeamListener(JTable table) { + /** + * The teamModel is a reference to the current team model for student teams. + */ + private StudentTeamTableModel teamModel; + + /** + * A reference to the management view, which is used to tell the management view when to update the models. + */ + private ManagementView managementView; + + public SetTeamListener(ManagementView managementView, JTable table, StudentTeamTableModel teamModel) { super(table); + this.managementView = managementView; + this.teamModel = teamModel; } @Override @@ -26,6 +41,26 @@ public class SetTeamListener extends TableRowListener { StudentTableModel model = (StudentTableModel) this.getTable().getModel(); Student student = model.getStudentAt(this.getSelectedRow()); - StudentTeam chosenTeam = (StudentTeam) new TeamChooserDialog(SwingUtilities.getWindowAncestor(this.getTable())).getSelectedTeam(); + StudentTeam[] teams = new StudentTeam[this.teamModel.getRowCount()]; + this.teamModel.getTeams().toArray(teams); + + StudentTeam chosenTeam = (StudentTeam) new TeamChooserDialog( + SwingUtilities.getWindowAncestor(this.getTable()), + teams + ).getSelectedTeam(); + + // Perform the updates to the database here. + DbHelper.executeTransactionContent(session -> { + student.getAssignedTeam().removeMember(student); + session.update(student.getAssignedTeam()); + + chosenTeam.addMember(student); + session.update(chosenTeam); + + student.assignToTeam(chosenTeam); + session.update(student); + }); + + this.managementView.updateModels(); } } diff --git a/src/main/java/nl/andrewlalis/ui/view/ManagementView.java b/src/main/java/nl/andrewlalis/ui/view/ManagementView.java index 5e890f1..723121b 100644 --- a/src/main/java/nl/andrewlalis/ui/view/ManagementView.java +++ b/src/main/java/nl/andrewlalis/ui/view/ManagementView.java @@ -5,6 +5,7 @@ import nl.andrewlalis.model.database.DbHelper; import nl.andrewlalis.model.database.DbUtil; import nl.andrewlalis.ui.control.listeners.management_view.PopupSelector; import nl.andrewlalis.ui.control.listeners.management_view.student_actions.RemoveFromCourseListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_actions.SetTeamListener; import nl.andrewlalis.ui.view.components.DetailPanel; import nl.andrewlalis.ui.view.table_models.StudentTableModel; import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; @@ -63,6 +64,9 @@ public class ManagementView extends AbstractView { this.detailPanel = new DetailPanel(); + this.studentsModel = new StudentTableModel(DbHelper.getStudents()); + this.studentTeamModel = new StudentTeamTableModel(); + contentPane.add(this.buildCommandPanel(), BorderLayout.WEST); contentPane.add(this.detailPanel, BorderLayout.EAST); contentPane.add(this.buildOverviewPanel(), BorderLayout.CENTER); @@ -140,17 +144,26 @@ public class ManagementView extends AbstractView { */ private JPanel buildStudentsTablePanel() { // Initialize the model, table, and a surrounding scroll pane. - this.studentsModel = new StudentTableModel(DbHelper.getStudents()); - JTable table = new JTable(this.studentsModel); table.setFillsViewportHeight(true); table.getSelectionModel().addListSelectionListener(listSelectionEvent -> { - detailPanel.setDetailableEntity(studentsModel.getStudentAt(table.getSelectedRow())); + int row = table.getSelectedRow(); + if (row >= 0 && row < studentsModel.getRowCount()) { + detailPanel.setDetailableEntity(studentsModel.getStudentAt(row)); + } }); + + // A context menu for the table. JPopupMenu menu = new JPopupMenu("Menu"); + // Item for setting a student's team. + JMenuItem setTeamItem = new JMenuItem("Set team"); + setTeamItem.addActionListener(new SetTeamListener(this, table, this.studentTeamModel)); + menu.add(setTeamItem); + // Item for removing a student from the course. JMenuItem removeItem = new JMenuItem("Remove from course"); removeItem.addActionListener(new RemoveFromCourseListener(table)); menu.add(removeItem); + menu.addPopupMenuListener(new PopupSelector(table)); table.setComponentPopupMenu(menu); @@ -161,7 +174,8 @@ public class ManagementView extends AbstractView { * @return A JPanel to be put into a tab for display of a list of student teams. */ private JPanel buildStudentTeamsTablePanel() { - this.studentTeamModel = new StudentTeamTableModel(DbHelper.getStudentTeams()); + // Make sure that the model has the latest student teams. + this.studentTeamModel.setStudentTeamsList(DbHelper.getStudentTeams()); JTable table = new JTable(this.studentTeamModel); table.setFillsViewportHeight(true); diff --git a/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java b/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java index 3431df4..c62b2f1 100644 --- a/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java +++ b/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java @@ -1,18 +1,84 @@ package nl.andrewlalis.ui.view.dialogs; +import nl.andrewlalis.model.StudentTeam; import nl.andrewlalis.model.Team; import javax.swing.*; import java.awt.*; +/** + * With this dialog, a user can choose from a list of teams. This works for any type of team. + * The user should have the option to create a new team. + */ public class TeamChooserDialog extends JDialog { - public TeamChooserDialog(Window parent) { - super(parent); + /** + * The combo box used in selecting a team. Will be populated by all team numbers. + */ + private JComboBox teamChooserBox; + + /** + * The team which is selected. + */ + private Team selectedTeam; + + /** + * The model containing the list of teams. + */ + private StudentTeam[] teams; + + public TeamChooserDialog(Window parent, StudentTeam[] teams) { + super(parent, "Team Chooser", ModalityType.APPLICATION_MODAL); + this.teams = teams; + this.setContentPane(this.buildContentPane()); + this.pack(); + this.setLocationRelativeTo(null); + this.setDefaultCloseOperation(DISPOSE_ON_CLOSE); + this.setVisible(true); } + /** + * @return The dialog's content pane, containing all user interface elements. + */ + private JPanel buildContentPane() { + JPanel contentPane = new JPanel(new BorderLayout()); + + contentPane.add(new JLabel("Choose a team."), BorderLayout.NORTH); + + // Main selection panel. + // Create a list of numbers to represent the teams. + Integer[] teamNumbers = new Integer[this.teams.length]; + for (int row = 0; row < this.teams.length; row++) { + teamNumbers[row] = this.teams[row].getNumber(); + } + + this.teamChooserBox = new JComboBox<>(teamNumbers); + contentPane.add(this.teamChooserBox, BorderLayout.CENTER); + + // Button panel for confirming or cancelling selection. + JPanel confirmPanel = new JPanel(); + JButton doneButton = new JButton("Done"); + // Add a small action listener to set the selected team and dispose of the dialog. + doneButton.addActionListener(actionEvent -> { + selectedTeam = teams[teamChooserBox.getSelectedIndex()]; + dispose(); + }); + confirmPanel.add(doneButton); + + JButton cancelButton = new JButton("Cancel"); + // Add a small action listener to dispose of the dialog and return the null selected team. + cancelButton.addActionListener(actionEvent -> dispose()); + confirmPanel.add(cancelButton); + contentPane.add(confirmPanel, BorderLayout.SOUTH); + + return contentPane; + } + + /** + * @return The team which was selected by the user. + */ public Team getSelectedTeam() { - return null; + return this.selectedTeam; } } diff --git a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java index a6300af..0810ba6 100644 --- a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java +++ b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java @@ -63,6 +63,13 @@ public class StudentTeamTableModel extends AbstractTableModel { return null; } + /** + * @return A list of all teams in this model. + */ + public List getTeams() { + return this.studentTeamsList; + } + @Override public int getRowCount() { return this.studentTeamsList.size(); -- 2.34.1 From aedea10442109983451151f117474391415abd80 Mon Sep 17 00:00:00 2001 From: andrewlalis Date: Mon, 26 Nov 2018 15:38:18 +0100 Subject: [PATCH 2/2] Added design documentation, many updates to the user interface, and program is approaching the MVP at an alarming rate. --- design/managementModule.odg | Bin 0 -> 10642 bytes design/managementModule.png | Bin 0 -> 21635 bytes design/modules.odg | Bin 0 -> 10456 bytes design/modules.png | Bin 0 -> 17199 bytes .../requirements/image/managementModule.png | Bin 0 -> 21635 bytes design/requirements/image/modules.png | Bin 0 -> 17199 bytes design/requirements/requirements.pdf | Bin 0 -> 150766 bytes design/requirements/requirements.tex | 233 ++++++++++++++++++ src/main/java/nl/andrewlalis/Main.java | 3 + .../nl/andrewlalis/git_api/GithubManager.java | 58 ++++- .../java/nl/andrewlalis/model/Person.java | 8 +- .../java/nl/andrewlalis/model/Student.java | 1 - .../nl/andrewlalis/model/StudentTeam.java | 2 - .../java/nl/andrewlalis/model/TATeam.java | 18 +- .../andrewlalis/model/TeachingAssistant.java | 9 +- src/main/java/nl/andrewlalis/model/Team.java | 8 +- .../model/database/BaseEntity.java | 23 +- .../andrewlalis/model/database/DbHelper.java | 8 +- .../EntityTablePopupMenuListener.java | 58 +++++ .../student_actions/NewStudentListener.java | 21 ++ .../RemoveFromCourseListener.java | 60 ++++- .../student_actions/SetTeamListener.java | 34 +-- .../student_actions/StudentListener.java | 44 ++++ .../ArchiveRepositoryListener.java | 65 +++++ .../DeleteRepositoryListener.java | 57 +++++ .../GenerateRepositoryListener.java | 73 ++++++ .../RemoveTeamListener.java | 67 +++++ .../StudentTeamListener.java | 42 ++++ .../andrewlalis/ui/view/ManagementView.java | 74 ++---- .../ui/view/components/DetailPanel.java | 31 +-- .../ui/view/components/Detailable.java | 5 - .../view/components/tables/EntityTable.java | 61 +++++ .../tables/EntityTableCellRenderer.java | 45 ++++ .../components/tables/StudentTeamsTable.java | 69 ++++++ .../view/components/tables/StudentsTable.java | 54 ++++ .../tables/popup_menu/EntityMenuItem.java | 30 +++ .../popup_menu/EntitySelectionType.java | 11 + .../ui/view/dialogs/TeamChooserDialog.java | 13 +- .../table_models/AbstractEntityModel.java | 19 ++ .../view/table_models/StudentTableModel.java | 17 +- .../table_models/StudentTeamTableModel.java | 22 +- src/main/resources/hibernate.cfg.xml | 17 +- 42 files changed, 1202 insertions(+), 158 deletions(-) create mode 100644 design/managementModule.odg create mode 100644 design/managementModule.png create mode 100644 design/modules.odg create mode 100644 design/modules.png create mode 100644 design/requirements/image/managementModule.png create mode 100644 design/requirements/image/modules.png create mode 100644 design/requirements/requirements.pdf create mode 100644 design/requirements/requirements.tex create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/EntityTablePopupMenuListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/NewStudentListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/StudentListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/ArchiveRepositoryListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/DeleteRepositoryListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/GenerateRepositoryListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/RemoveTeamListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/StudentTeamListener.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTable.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTableCellRenderer.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/components/tables/StudentTeamsTable.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/components/tables/StudentsTable.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntityMenuItem.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntitySelectionType.java create mode 100644 src/main/java/nl/andrewlalis/ui/view/table_models/AbstractEntityModel.java diff --git a/design/managementModule.odg b/design/managementModule.odg new file mode 100644 index 0000000000000000000000000000000000000000..b3b7cbad933e74f0aa22b9053f885b97c55e6485 GIT binary patch literal 10642 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 literal 0 HcmV?d00001 diff --git a/design/managementModule.png b/design/managementModule.png new file mode 100644 index 0000000000000000000000000000000000000000..4e03bf5bcc7e57fac247f7e5646252c56681288a GIT binary patch literal 21635 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 z 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%0DH6(HU9f*W6x;I&VJgaNnf6pT<^ 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 Z6Bjoxm#;MgaC~hG*x)EBC6pxL{sX&&CZzxX literal 0 HcmV?d00001 diff --git a/design/requirements/requirements.tex b/design/requirements/requirements.tex new file mode 100644 index 0000000..1021926 --- /dev/null +++ b/design/requirements/requirements.tex @@ -0,0 +1,233 @@ +\documentclass{article} + +\usepackage[a4paper]{geometry} +\usepackage{graphicx} + +\title{\textbf{Gitgroup Course Manager}\\ + \textit{Requirements, Design, and Planning}} +\author{Andrew Lalis\\ + \texttt{S3050831}} + +\begin{document} + +\maketitle + +\tableofcontents + +\newpage + +\section{Introduction} + Being a teaching assistant for both the introductory and advanced object oriented programming courses at the University of Groningen, I could not help but notice certain inefficiencies in how the courses are managed with regard to student groups and their associated git repositories.\\ + + \noindent + In particular, when the course is first created, all students must enter their information in a "sign-up form" (usually a Google Form). Then, a simple Python script is used to generate repositories for each student group. While quite straightforward and seemingly an elegant solution, limiting the automation of the course to the creation of repositories leads to a lot more difficulty in practice.\\ + + \noindent + It is given that some students will drop the course, and this leads to a lot of single-student groups, all of which must be dealt with manually on a case-by-case basis. As a teaching assistant for such courses, I see firsthand the issues this causes. First, teaching assistants such as myself are more reluctant to make modifications to existing groups, not only because it takes a significant amount of time and administrative effort to manually change repository configurations, but also because from an organizational perspective, it is a challenge to keep every single teaching assistant up-to-date. Additionally, the sources of information regarding each student group are quite scattered, and as of right now, there is no one single, definitive source of information on which all teaching assistants can rely. Having a way to unify all the different components of managing Github-utilizing courses is where the \textbf{Gitgroup Course Manager} gets its inspiration. + + \subsection{Vision} + When this project is done, managing a course as the lead teaching assistant should be quick and painless, not just when creating student-group repositories, but also when making changes during the course's duration. The application should make basic tasks, such as moving students between groups or removing a student, trivial compared to the current state of affairs.\\ + + \noindent + While using this application, the teaching assistant should be able to find information about any student in a matter of seconds, rather than minutes, and changes should be made with only a few clicks, rather than spending a quarter of an hour navigating the settings page of Github.\\ + + \noindent + More specifically, the \textbf{Gitgroup Course Manager} is intended as a desktop application, to be used by the lead teaching assistant to perform all administrative tasks, and to serve as the definitive authority on the state of the course, in terms of current student groups and repositories. + +\section{Requirements} + While the vision provides a very subjective and vague overview of the application and its functionality, this section will go into more detail on the functional and non-functional requirements. The functional requirements will describe the explicit details of what the application should do, and the non-functional requirements will cover more abstract concepts such as reliability, security, and ease of use.\\ + + \noindent + However, before beginning to describe these requirements, it is important to define the different types of users of this application. Luckily this application is not very large, so all potential users of the system can be categorized into the following two groups. + + \subsection{Users} + + \begin{itemize} + \item \textbf{Teaching Assistants (TA)} - Administrators of the application who have full access to all functionality and student group information. + + \item \textbf{Students} - Entities in the application, with no interactive permissions. Essentially, students make up the raw data used by the system, but may not make changes to the system. + \end{itemize} + + \noindent + To ease the process of defining functional requirements, some user stories are included here which describe in layman's terms the essential features of the application, which can then be extrapolated upon in later sections. Note that user stories are written from the point of view of one of the two user types given above, and each story will identify this by starting with, \textit{"As a ..., I want ..."}. However, the vast majority of user stories will be from the teaching assistant's perspective, obviously. + + \subsubsection{User Stories} + \begin{enumerate} + \item As a teaching assistant, I want to be able to use a Google Form's CSV output to generate a list of student groups, because this is the first step in initializing a new course. + + \item As a teaching assistant, I want to let students enroll for groups using Nestor's built-in group enroll feature, because this makes enrollment much easier for students. + + \item As a teaching assistant, I want the application to automatically assign students to groups based on their preferred partners, because this is a good feature to have for the students' benefit. + + \item As a teaching assistant, I want to generate repositories for newly generated groups, possibly on a case-by-case basis, because this gives me the same precision as manually creating repositories, while also providing the ease of complete automation if preferred. + + \item As a teaching assistant, I want to be able to view all students, the group they're in, and what repository is related to that group, if any, because this is needed for basic day-to-day productivity for all teaching assistants. + + \item As a teaching assistant, I want to have access to all a student's information, and have the ability to modify it, because there are cases where students may incorrectly enter personal information. + + \item As a teaching assistant, I want to be able to create a new empty student group, because this functionality is needed for when students are late in signing up for the course, or in other extraneous situations. + + \item As a teaching assistant, I want to be able to remove empty student groups (including any associated repositories), because this is necessary housekeeping for an administrator of the course. + + \item As a teaching assistant, I want to be able to add or remove a student from a group, because this is necessary when some students leave the course, or new ones join. + + \item As a teaching assistant, I want to be able to assign a teaching assistant team to a group, so that they are responsible for micro-management of that group's activities and grades. + + \item As a teaching assistant, I want to filter student groups by which teaching assistant they are assigned to, because this makes management easier for other teaching assistants. + + \item As a teaching assistant, I want to see all open issues and pull requests on every group's repository, so that it is easier to view all open issues in one place, as opposed to the current workflow on Github. + + \item As a teaching assistant, I want to provide short answers to simple issues from the application itself without having to navigate to the issue on Github's website. + + \item As a teaching assistant, I want to be able to see the time at which a pull request was made, so that it is easy to determine if the pull request passed a certain deadline or not. + + \item As a teaching assistant, I want to add branch protection rules and continuous integration to a branch for many groups at once, since this is by far the most tedious part of manually creating new repositories. + + \item As a teaching assistant, I want the application to save everything permanently, so that even if, for example, a group is removed, their repository is not simply deleted but instead just archived, and individual student information is not deleted but archived. + + \item As a teaching assistant, I want use the mapping of TA teams to student teams to create spreadsheets (using Google Sheets) which can be filled in with grades for each student group. + + \item As a teaching assistant, I want to store filled-in grade sheets so that I can look up a student group's grade for a particular assignment, or even a particular category in an assignment, and make changes later if needed. + + \item As a teaching assistant, I want to be able to export a CSV file containing the student group grades so that it can be uploaded to Nestor and made official. + + \item As a teaching assistant, I want to retrieve some statistics about past assignments in terms of average grades, average grades per teaching assistant, per group, etc. because this will help in identifying cases where there is a discrepancy grading standards that can be addressed. + + \item As a student, I want to provide my personal information to this course as few times as possible, because by complicating the sign-up process, more students are discouraged from signing up. + + \item As a student, I want to be certain that my information is stored securely. + \end{enumerate} + + \subsection{Functional Requirements} + As can be seen from the large amount of user stories that can be generated about this application, simply listing all the functional requirements is a rather cumbersome task. To better organize the requirements and make the list conceptually easier to understand, the requirements will be split into several categories based on the section of the application to which they apply. + + \subsubsection{Course Initialization} + In this first section, the requirements will be listed which pertain directly to course initialization, or the basic functionality that must be present for starting the course, creating groups and repositories, etc. + + \begin{itemize} + \item The application can parse CSV data about students from a Google Forms sign-up form, or from Nestor's group-enroll mechanic. + + \item A list of groups can be generated from the parsed information about students, taking into account each students' preference for partners. + + \item The application can automatically generate all repositories for newly generated groups, including adding branch protection and continuous integration to a branch. + + \item Students are automatically invited to the repository for the group they're assigned to. + + \item The application can parse CSV data about teaching assistants to build a list of all teaching assistants in the course, and optionally, if they are grouped together into teams. + + \item A teaching assistant team can be assigned to each student group. + \end{itemize} + + \subsubsection{Course Management} + In this section will be found all the requirements for general management of the course, for the duration of the course. + + \begin{itemize} + \item The user (teaching assistant) is able to view a list of students in the course, a list of student groups, a list of repositories, a list of teaching assistants, and a list of teaching assistant groups, such that it is possible to view a list of all entities in the application. + + \item The teaching assistant may modify some information of an entity, while other information may be forbidden from editing. + + \item Student groups can be created, edited (changing the members in a group), or removed by a teaching assistant. + + \item The application should be able to provide a list of all open issues in all student group repositories, and a list of all open pull requests (including time and date, especially with regard to pull requests). + + \item Teaching assistants may provide simple replies to issues from within the application, and if that is not enough, a link is provided to the issue online. + + \item A command prompt should be available for advanced users to execute commands separately than through the interface. + \end{itemize} + + \subsubsection{Grading} + In this section, there are a few requirements specific to grading which can be addressed separately from others, and in fact, the grading system will be implemented as a sub-system of the main application, as will be seen in the design section of this document. + + \begin{itemize} + \item The application can generate grading sheets for a certain assignment, given the number of categories (and grading weights), and that each group is assigned a teaching assistant team. + + \item The application can parse filled-in grading sheets for a certain assignment, and stores each group's grade for that assignment. + + \item A CSV file can be exported, containing grades in such a format as to be accepted by Nestor's grade center. + + \item Reports can be generated for students or student groups, giving a detailed overview of the grades and any comments that were given along with the grade itself. + \end{itemize} + + \subsection{Non-Functional Requirements} + For this application, because it will function as a desktop application, does not need to concern itself with the performance issues which are commonplace in web applications. Additionally, by operating on the local system, it does not suffer from uptime issues that web apps can deal with. Therefore, the non-functional requirements for this application are simplified to a subset of what many modern projects must deal with. + + \begin{itemize} + \item \textbf{Ease of use} - The application should be intuitive to use, and have necessary redundancies such that the user's interactive experience is similar to many other desktop applications. However, due to the time constraints, this may not be fully achieved. + + \item \textbf{Data safety} - All changes to the data should be permanent, so that when the user sees an updated value in the interface, the user is confident that the value has been saved to the hard drive, and will persist so long as the computer does. + + \item \textbf{Data security} - While not quite as large of an issue as it would be with a web application, steps should be taken to ensure a high level of security, especially with regard to student grades, so that data is consolidated in one place, accessible only to the teaching assistant. + \end{itemize} + +\section{Design} + The application can be divided into three main conceptual components, the initialization of a new course, the management of an existing course, and grade recording. These three modules form the basis of the application design. + + \begin{figure}[h] + \centering + \includegraphics[width=0.4\textwidth]{image/modules.png} + \caption{The modules in this application, as well as the user's starting point.} + \end{figure} + + \noindent + As shown in Figure 1, the user may begin the application either by initializing a new course, or continuing directly to the management module. From within the management module, the user may interact with the grading module. + + \subsection{Initialization Module} + In this first module, the teaching assistant is prompted to enter all information needed to initialize a course. This includes: + + \begin{itemize} + \item The Github Organization name. + + \item The teaching assistant's access token. + + \item The name of the repository which contains the assignments for the course. + + \item Data about teaching assistants (Names, emails, Github usernames, etc.). + + \item Student CSV data. + \end{itemize} + + \noindent + With this information, it is then possible to let the application populate its database with all the student and teaching assistant information, and generate groups based on student preference. From there, the user is directed to the management module, wherein they will have access to all entities (students, groups, teaching assistants, etc.), and where most functionality of the application is implemented. + + \subsection{Management Module} + In the management module is where the user will spend the majority of their time with the application. It will consist of three sub-modules: the command-line interface, the entity list view, and the entity detail view. + + \begin{figure}[h] + \centering + \includegraphics[width=0.6\textwidth]{image/managementModule.png} + \caption{The management module.} + \end{figure} + + \subsubsection{Command-line Interface} + In this section of the managment module, the user will be able to see program output in a console-like format, with some extra logging details available. The user will also be able to enter text commands in an input field, as a means of being able to perform all actions without having to navigate the interface. Additionally, this interface can serve as a useful debugging tool during development, as it gives the developer the ability to test all functiontionality of the application via the command line, instead of being forced to create all the user interfaces to gain access to abstract commands. + + \subsubsection{Entity List View} + This view will make up the majority of the management module's screen space, and is intended to command the majority of the user's attention. It is in this view that the user will be able to see a list of entities (students, student groups, teaching assistants, repositories, etc.) and interact with them. Selecting an entity in this list will display more detailed information about it in the entity detail view, which is discussed in the next section.\\ + + \noindent + Context menus will be used to provide the majority of functionality, so that when a user right-clicks on any entity, that entity will provide a list of actions which could be done to it, and clicking any one of the associated menu buttons will trigger some action. Multiple entities may be selected at once, and then only certain \textit{multiple-entity actions} may be performed, such as removing the entity, assigning multiple students to the same group, etc. + + \subsubsection{Entity Detail View} + In this section will be shown all the detailed information about an entity which, in some cases, cannot all be displayed in the entity list view. Inside the entity detail view, it will be possible to edit the properties of an entity which could not be changed in the entity list view. + + \subsection{Grading Module} + This module, accessed in the same view as the management module, will provide additional functionalities that help a teaching assistant to organize grading. In particular, this module will provide the following facilities: + + \begin{itemize} + \item \textbf{Assignment sheet creation} - Guides the user through the creation of a grading sheet which can be filled in by teaching assistants during grading, with one or more weighted categories. + + \item \textbf{Assignment sheet reading} - The user may provide a filled-in grading sheet which was created previously in the application, and use this for recording the grades of student groups. + + \item \textbf{Grade reports} - The application will be able to generate PDF reports for individual students or student groups, which contain all grades, comments and other feedback for the included students. + + \item \textbf{Export for Nestor} - Ideally, grades managed in this application should be able to be transferred to Nestor in only a few clicks, and this can be done by generating a CSV sheet which can be uploaded to Nestor. + \end{itemize} + +\newpage +\section{Planning} + With a solid plan for the application, as well as the lack of a way to perform comprehensive large-scale testing of the system as a whole, the waterfall model will be used for development of this project. While many software development platfoms are starting to use "Agile" development models in which a minimum viable product is released in a matter of one or two weeks, an application like this is not really viable until the majority of the requirements mentioned in this document are met. Otherwise, it is simply more effective to manually manage a course's student groups and repositories.\\ + + \noindent + Therefore, the project will be divided into three phases of development: Planning and Design, Application Development, and finally, Testing and Bug Fixing. This document itself represents the majority of the Planning and Design phase, and then soon the project will move into the development phase, where the design is fixed while the product is being made. Once all requirements in this document are met, the project has reached the Testing and Bug Fixing phase, in which the application is tested with large data sets and many extraneous situations to ensure that normal use will not result in critical errors if and when the application is deployed into real-world use. + +\end{document} \ No newline at end of file diff --git a/src/main/java/nl/andrewlalis/Main.java b/src/main/java/nl/andrewlalis/Main.java index a3d727f..ba5852b 100644 --- a/src/main/java/nl/andrewlalis/Main.java +++ b/src/main/java/nl/andrewlalis/Main.java @@ -48,6 +48,9 @@ public class Main { initializeTestingData(); StartView startView = new StartView(manager, "InitializerTesting", userOptions.get("token")); + manager.setAccessToken(startView.getAccessToken()); + manager.setOrganizationName(startView.getOrganizationName()); + manager.deleteAllRepositories("AOOP"); } /** diff --git a/src/main/java/nl/andrewlalis/git_api/GithubManager.java b/src/main/java/nl/andrewlalis/git_api/GithubManager.java index fe15ce7..0dfbc9a 100644 --- a/src/main/java/nl/andrewlalis/git_api/GithubManager.java +++ b/src/main/java/nl/andrewlalis/git_api/GithubManager.java @@ -260,6 +260,45 @@ public class GithubManager { this.inviteStudentsToRepos(team, assignmentsRepo); } + /** + * Creates a student team's repository, without inviting students or doing anything extra. + * @param team The student team to create the repository for. + * @param prefix A prefix to the repository name. + * @return The name of the repository created, or null if an error occurred. + */ + public String setupStudentRepo(StudentTeam team, String prefix) { + GHRepository repo; + try { + repo = this.createRepository(team.generateUniqueName(prefix), null, team.generateRepoDescription(), false, true, false); + this.createDevelopmentBranch(repo); + return repo.getName(); + } catch (IOException e) { + logger.severe("Repository for student team " + team.getNumber() + " could not be created."); + e.printStackTrace(); + return null; + } + } + + /** + * Deletes the repository with the given name. + * @param name The name of the repository to delete. + * @return True if the deletion was successful, or false if an error occurred. + */ + public boolean deleteRepository(String name) { + try { + GHRepository repo = this.getOrganization().getRepository(name); + if (repo == null) { + return false; + } + repo.delete(); + return true; + } catch (IOException e) { + logger.severe("Could not delete repository: " + name); + e.printStackTrace(); + return false; + } + } + /** * Deletes all repositories in the organization. * @param substring The substring which repository names should contain to be deleted. @@ -302,12 +341,25 @@ public class GithubManager { } } + /** + * Archives a repository with the given name. + * @param name The name of the repository to archive. + * @return True if successful, false otherwise. + */ + public boolean archiveRepository(String name) { + try { + return this.archiveRepository(this.getOrganization().getRepository(name)); + } catch (IOException e) { + return false; + } + } + /** * Archives a repository so that it can no longer be manipulated. * TODO: Change to using Github API instead of Apache HttpUtils. * @param repo The repository to archive. */ - private void archiveRepository(GHRepository repo) { + private boolean archiveRepository(GHRepository repo) { try { HttpPatch patch = new HttpPatch("https://api.github.com/repos/" + repo.getFullName() + "?access_token=" + this.accessToken); CloseableHttpClient client = HttpClientBuilder.create().build(); @@ -321,9 +373,11 @@ public class GithubManager { throw new IOException("Could not archive repository: " + repo.getName() + ". Code: " + response.getStatusLine().getStatusCode()); } logger.info("Archived repository: " + repo.getFullName()); + return true; } catch (IOException e) { logger.severe("Could not archive repository: " + repo.getName()); e.printStackTrace(); + return false; } } @@ -429,7 +483,7 @@ public class GithubManager { builder.issues(hasIssues); builder.description(description); builder.gitignoreTemplate("Java"); - builder.private_(false); // TODO: Testing value of false. Production uses true. + builder.private_(isPrivate); // TODO: Testing value of false. Production uses true. GHRepository repo = builder.create(); logger.fine("Created repository: " + repo.getName()); return repo; diff --git a/src/main/java/nl/andrewlalis/model/Person.java b/src/main/java/nl/andrewlalis/model/Person.java index d374761..9417a29 100644 --- a/src/main/java/nl/andrewlalis/model/Person.java +++ b/src/main/java/nl/andrewlalis/model/Person.java @@ -1,7 +1,6 @@ package nl.andrewlalis.model; import nl.andrewlalis.model.database.BaseEntity; -import nl.andrewlalis.ui.view.components.Detailable; import nl.andrewlalis.util.Pair; import javax.persistence.Column; @@ -16,7 +15,7 @@ import java.util.List; */ @Entity(name = "Person") @Table(name = "persons") -public abstract class Person extends BaseEntity implements Detailable { +public abstract class Person extends BaseEntity { /** * The unique identification number for this person. (P- or S-Number) @@ -148,11 +147,6 @@ public abstract class Person extends BaseEntity implements Detailable { return this.getName() + ", " + this.getNumber(); } - @Override - public String getDetailDescription() { - return null; - } - @Override public List> getDetailPairs() { List> pairs = new ArrayList<>(); diff --git a/src/main/java/nl/andrewlalis/model/Student.java b/src/main/java/nl/andrewlalis/model/Student.java index 0ded9a1..fb085d0 100644 --- a/src/main/java/nl/andrewlalis/model/Student.java +++ b/src/main/java/nl/andrewlalis/model/Student.java @@ -11,7 +11,6 @@ import java.util.logging.Logger; * Represents one student's github information. */ @Entity(name = "Student") -@Table(name="students") public class Student extends Person { private static final Logger logger = Logger.getLogger(Student.class.getName()); diff --git a/src/main/java/nl/andrewlalis/model/StudentTeam.java b/src/main/java/nl/andrewlalis/model/StudentTeam.java index c545771..92ea460 100644 --- a/src/main/java/nl/andrewlalis/model/StudentTeam.java +++ b/src/main/java/nl/andrewlalis/model/StudentTeam.java @@ -5,7 +5,6 @@ import nl.andrewlalis.util.Pair; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.ManyToOne; -import javax.persistence.Table; import java.util.Arrays; import java.util.List; @@ -13,7 +12,6 @@ import java.util.List; * Represents one or more students' collective information. */ @Entity(name = "StudentTeam") -@Table(name = "student_teams") public class StudentTeam extends Team { /** diff --git a/src/main/java/nl/andrewlalis/model/TATeam.java b/src/main/java/nl/andrewlalis/model/TATeam.java index cc26560..ae204e5 100644 --- a/src/main/java/nl/andrewlalis/model/TATeam.java +++ b/src/main/java/nl/andrewlalis/model/TATeam.java @@ -2,10 +2,7 @@ package nl.andrewlalis.model; import org.kohsuke.github.GHTeam; -import javax.persistence.Entity; -import javax.persistence.OneToMany; -import javax.persistence.Table; -import javax.persistence.Transient; +import javax.persistence.*; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -14,7 +11,6 @@ import java.util.List; * Represents a teaching assistant team, which is itself a 'team' in the organization. */ @Entity(name = "TATeam") -@Table(name = "ta_teams") public class TATeam extends Team { /** @@ -32,8 +28,20 @@ public class TATeam extends Team { * A list of all student teams for which this TA team is responsible. */ @OneToMany + @JoinTable( + name = "ta_teams_student_teams", + joinColumns = { @JoinColumn(name = "ta_team_id") }, + inverseJoinColumns = { @JoinColumn(name = "student_team_id") } + ) private List studentTeams; + /** + * Constructs an empty TA team. + */ + public TATeam() { + // Do nothing here, since the no-arg constructor of Team will be called. + } + /** * Constructs a team without any teaching assistant members. * @param name The name of the team. diff --git a/src/main/java/nl/andrewlalis/model/TeachingAssistant.java b/src/main/java/nl/andrewlalis/model/TeachingAssistant.java index 1c2787b..1e6f818 100644 --- a/src/main/java/nl/andrewlalis/model/TeachingAssistant.java +++ b/src/main/java/nl/andrewlalis/model/TeachingAssistant.java @@ -1,15 +1,20 @@ package nl.andrewlalis.model; import javax.persistence.Entity; -import javax.persistence.Table; /** * Represents an administrator in the organization, who manages student teams. */ @Entity(name = "TeachingAssistant") -@Table(name = "teaching_assistants") public class TeachingAssistant extends Person { + /** + * Constructs an empty Teaching Assistant object. + */ + public TeachingAssistant() { + super(); + } + /** * Constructs a Teaching Assistant from only a github username. * @param githubUsername The person's github username. diff --git a/src/main/java/nl/andrewlalis/model/Team.java b/src/main/java/nl/andrewlalis/model/Team.java index 0f153f8..5d3b229 100644 --- a/src/main/java/nl/andrewlalis/model/Team.java +++ b/src/main/java/nl/andrewlalis/model/Team.java @@ -1,7 +1,6 @@ package nl.andrewlalis.model; import nl.andrewlalis.model.database.BaseEntity; -import nl.andrewlalis.ui.view.components.Detailable; import nl.andrewlalis.util.Pair; import javax.persistence.*; @@ -15,7 +14,7 @@ import java.util.List; */ @Entity(name = "Team") @Table(name = "teams") -public abstract class Team extends BaseEntity implements Detailable { +public abstract class Team extends BaseEntity { /** * An identification number unique to this team alone. @@ -176,11 +175,6 @@ public abstract class Team extends BaseEntity implements Detailable { return String.valueOf(this.getNumber()); } - @Override - public String getDetailDescription() { - return null; - } - @Override public List> getDetailPairs() { List> pairs = new ArrayList<>(); diff --git a/src/main/java/nl/andrewlalis/model/database/BaseEntity.java b/src/main/java/nl/andrewlalis/model/database/BaseEntity.java index a31e294..49d574b 100644 --- a/src/main/java/nl/andrewlalis/model/database/BaseEntity.java +++ b/src/main/java/nl/andrewlalis/model/database/BaseEntity.java @@ -1,15 +1,14 @@ package nl.andrewlalis.model.database; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.MappedSuperclass; +import nl.andrewlalis.ui.view.components.Detailable; + +import javax.persistence.*; /** * Defines a base entity which all others in the database extend from. */ @MappedSuperclass -public abstract class BaseEntity { +public abstract class BaseEntity implements Detailable { /** * The number for this entity. @@ -18,6 +17,12 @@ public abstract class BaseEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + /** + * Whether or not this entity is archived. + */ + @Column(name = "archived", nullable = false) + private boolean archived = false; + public Long getId() { return id; } @@ -25,4 +30,12 @@ public abstract class BaseEntity { public void setId(Long id) { this.id = id; } + + public boolean isArchived() { + return archived; + } + + public void setArchived(boolean archived) { + this.archived = archived; + } } diff --git a/src/main/java/nl/andrewlalis/model/database/DbHelper.java b/src/main/java/nl/andrewlalis/model/database/DbHelper.java index 716f21d..7ccde97 100644 --- a/src/main/java/nl/andrewlalis/model/database/DbHelper.java +++ b/src/main/java/nl/andrewlalis/model/database/DbHelper.java @@ -19,7 +19,9 @@ public class DbHelper { */ public static List getStudents() { Session session = DbUtil.getSessionFactory().openSession(); - List students = (List) session.createQuery("from Student").list(); + List students = (List) session.createQuery( + "SELECT student FROM Student student" + ).getResultList(); session.close(); return students; } @@ -48,7 +50,9 @@ public class DbHelper { */ public static List getStudentTeams() { Session session = DbUtil.getSessionFactory().openSession(); - List studentTeams = (List) session.createQuery("from StudentTeam").list(); + List studentTeams = (List) session.createQuery( + "SELECT team FROM StudentTeam team" + ).getResultList(); session.close(); return studentTeams; } diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/EntityTablePopupMenuListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/EntityTablePopupMenuListener.java new file mode 100644 index 0000000..eef47ed --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/EntityTablePopupMenuListener.java @@ -0,0 +1,58 @@ +package nl.andrewlalis.ui.control.listeners.management_view; + +import nl.andrewlalis.ui.view.components.tables.EntityTable; +import nl.andrewlalis.ui.view.components.tables.popup_menu.EntityMenuItem; +import nl.andrewlalis.ui.view.components.tables.popup_menu.EntitySelectionType; + +import javax.swing.*; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; +import java.awt.*; + +/** + * Listener to be attached to popup menus for entity tables, so that certain menu items are either enabled or disabled + * depending on the type of selection in the table. Some menu items should always be enabled, some should only be + * enabled for single selections, and some should be enabled for multi-selections. + */ +public class EntityTablePopupMenuListener implements PopupMenuListener { + + /** + * The table on which the menu for this listener is attached. + */ + private EntityTable table; + + public EntityTablePopupMenuListener(EntityTable table) { + this.table = table; + } + + @Override + public void popupMenuWillBecomeVisible(PopupMenuEvent popupMenuEvent) { + JPopupMenu menu = (JPopupMenu) popupMenuEvent.getSource(); + + // First, determine the selection type. + int selectionType = 0; + if (this.table.getSelectedRowCount() == 1) { + selectionType |= EntitySelectionType.SINGLE; + } else if (this.table.getSelectedRowCount() > 1) { + selectionType |= EntitySelectionType.MULTIPLE; + } + + // Iterate over all menu items, and let them decide to enable or disable themselves. + for (Component component: menu.getComponents()) { + if (component instanceof EntityMenuItem) { + EntityMenuItem menuItem = (EntityMenuItem) component; + menuItem.willBecomeVisible(selectionType); + } + } + } + + @Override + public void popupMenuWillBecomeInvisible(PopupMenuEvent popupMenuEvent) { + + } + + @Override + public void popupMenuCanceled(PopupMenuEvent popupMenuEvent) { + + } +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/NewStudentListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/NewStudentListener.java new file mode 100644 index 0000000..184ec54 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/NewStudentListener.java @@ -0,0 +1,21 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_actions; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +public class NewStudentListener extends StudentListener { + + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + */ + public NewStudentListener(JTable table) { + super(table); + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + System.out.println("New Student"); + } +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/RemoveFromCourseListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/RemoveFromCourseListener.java index c0c9c3b..c9c9fe3 100644 --- a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/RemoveFromCourseListener.java +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/RemoveFromCourseListener.java @@ -1,28 +1,74 @@ package nl.andrewlalis.ui.control.listeners.management_view.student_actions; -import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener; +import nl.andrewlalis.model.Student; +import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.DbHelper; import nl.andrewlalis.ui.view.table_models.StudentTableModel; +import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; import javax.swing.*; import java.awt.event.ActionEvent; +import java.util.List; /** * Listens for when the user intends to remove a selected student from the course entirely. This entails a few things: * 1. Remove them from any team they are in. - * 2. Archive any repository that is empty as a result of removing them. - * 3. Remove the student from the list of students. + * 2. Remove the student from the list of students. * (This should not actually remove the record, just set it as removed.) */ -public class RemoveFromCourseListener extends TableRowListener { +public class RemoveFromCourseListener extends StudentListener { - public RemoveFromCourseListener(JTable table) { + /** + * A reference to the team table model, used for updating that table when a student is removed. + */ + private StudentTeamTableModel teamModel; + + public RemoveFromCourseListener(JTable table, StudentTeamTableModel teamModel) { super(table); + this.teamModel = teamModel; } @Override public void actionPerformed(ActionEvent actionEvent) { - StudentTableModel model = (StudentTableModel) this.getTable().getModel(); + StudentTableModel model = this.getModel(); - System.out.println(model.getStudentAt(this.getSelectedRow())); + // Get all the selected students. + List studentsToRemove = this.getSelectedStudents(); + + if (studentsToRemove.isEmpty()) { + return; + } + + // First get confirmation that the student should be removed. + int response = JOptionPane.showConfirmDialog( + SwingUtilities.getWindowAncestor(this.getTable()), + "Are you sure you wish to remove the student(s)?\nThis action is permanent.", + "Remove students", + JOptionPane.YES_NO_OPTION + ); + if (response == JOptionPane.NO_OPTION) { + return; + } + + // First remove the student from any team they were in. + // Then set the student as archived. + DbHelper.executeTransactionContent(session -> { + for (Student student : studentsToRemove) { + + StudentTeam team = student.getAssignedTeam(); + // Only if the student's team is still active, should they be removed from it. + if (team != null && !team.isArchived()) { + student.getAssignedTeam().removeMember(student); + session.update(student.getAssignedTeam()); + } + + student.setArchived(true); + session.update(student); + } + }); + + // Update the models afterwards. + model.setStudentsList(DbHelper.getStudents()); + this.teamModel.setStudentTeamsList(DbHelper.getStudentTeams()); } } diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java index cb5233e..c7fdfcf 100644 --- a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/SetTeamListener.java @@ -3,14 +3,13 @@ package nl.andrewlalis.ui.control.listeners.management_view.student_actions; import nl.andrewlalis.model.Student; import nl.andrewlalis.model.StudentTeam; import nl.andrewlalis.model.database.DbHelper; -import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener; -import nl.andrewlalis.ui.view.ManagementView; import nl.andrewlalis.ui.view.dialogs.TeamChooserDialog; import nl.andrewlalis.ui.view.table_models.StudentTableModel; import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; import javax.swing.*; import java.awt.event.ActionEvent; +import java.util.List; /** * Listens for when the user wishes to set the team of a certain student. This should do the following: @@ -18,37 +17,41 @@ import java.awt.event.ActionEvent; * 2. StudentTeam object is created or modified. * 3. The repository is updated automatically. */ -public class SetTeamListener extends TableRowListener { +public class SetTeamListener extends StudentListener { /** - * The teamModel is a reference to the current team model for student teams. + * A reference to the student teams model, which needs to update in conjunction with the students table. */ private StudentTeamTableModel teamModel; /** - * A reference to the management view, which is used to tell the management view when to update the models. + * Creates a new listener for when a user sets a student's team to a new team. + * @param table The table on which this listener is listening. + * @param teamModel The model representing this list of teams. This is needed to update after a change. */ - private ManagementView managementView; - - public SetTeamListener(ManagementView managementView, JTable table, StudentTeamTableModel teamModel) { + public SetTeamListener(JTable table, StudentTeamTableModel teamModel) { super(table); - this.managementView = managementView; this.teamModel = teamModel; } @Override public void actionPerformed(ActionEvent actionEvent) { - StudentTableModel model = (StudentTableModel) this.getTable().getModel(); - Student student = model.getStudentAt(this.getSelectedRow()); - - StudentTeam[] teams = new StudentTeam[this.teamModel.getRowCount()]; - this.teamModel.getTeams().toArray(teams); + StudentTableModel model = this.getModel(); + Student student = model.getStudentAt(this.getTable().convertRowIndexToModel(this.getSelectedRow())); + List teams = this.teamModel.getTeams(); + // Get the selected team via a dialog. StudentTeam chosenTeam = (StudentTeam) new TeamChooserDialog( SwingUtilities.getWindowAncestor(this.getTable()), teams ).getSelectedTeam(); + // Check that the new team is not the current team. + if (chosenTeam.equals(student.getAssignedTeam())) { + JOptionPane.showMessageDialog(this.getTable(), "You must choose a new team.", "Same team", JOptionPane.WARNING_MESSAGE); + return; + } + // Perform the updates to the database here. DbHelper.executeTransactionContent(session -> { student.getAssignedTeam().removeMember(student); @@ -61,6 +64,7 @@ public class SetTeamListener extends TableRowListener { session.update(student); }); - this.managementView.updateModels(); + this.teamModel.setStudentTeamsList(DbHelper.getStudentTeams()); + model.setStudentsList(DbHelper.getStudents()); } } diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/StudentListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/StudentListener.java new file mode 100644 index 0000000..47e4cda --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_actions/StudentListener.java @@ -0,0 +1,44 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_actions; + +import nl.andrewlalis.model.Student; +import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener; +import nl.andrewlalis.ui.view.table_models.StudentTableModel; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +/** + * An abstract listener for action which is triggered from the Students table. + */ +public abstract class StudentListener extends TableRowListener { + + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + */ + public StudentListener(JTable table) { + super(table); + } + + /** + * @return The students model that this listener applies to. + */ + public StudentTableModel getModel() { + return (StudentTableModel) this.getTable().getModel(); + } + + /** + * @return A list of selected students. + */ + public List getSelectedStudents() { + StudentTableModel model = (StudentTableModel) this.getTable().getModel(); + List selectedStudents = new ArrayList<>(); + for (int row : this.getTable().getSelectedRows()) { + selectedStudents.add(model.getStudentAt(this.getTable().convertRowIndexToModel(row))); + } + return selectedStudents; + } + +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/ArchiveRepositoryListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/ArchiveRepositoryListener.java new file mode 100644 index 0000000..0eaa6e9 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/ArchiveRepositoryListener.java @@ -0,0 +1,65 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_team_actions; + +import nl.andrewlalis.git_api.GithubManager; +import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.DbHelper; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * Listens for when the user wants to archive one or more repositories. + */ +public class ArchiveRepositoryListener extends StudentTeamListener { + + /** + * The manager, for interacting with Github, to perform the archiving. + */ + private GithubManager manager; + + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + * @param manager The manager used to interact with Github. + */ + public ArchiveRepositoryListener(JTable table, GithubManager manager) { + super(table); + this.manager = manager; + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + for (StudentTeam team : this.getSelectedStudentTeams()) { + if (team.isArchived()) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Team " + team.getNumber() + " is already archived.", + "Already archived", + JOptionPane.WARNING_MESSAGE + ); + } + if (team.getRepositoryName() == null) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Team " + team.getNumber() + " does not have a repository to archive." , + "No repository", + JOptionPane.WARNING_MESSAGE + ); + } + + if (!team.isArchived() && team.getRepositoryName() != null) { + new Thread(() -> { + boolean success = this.manager.archiveRepository(team.getRepositoryName()); + if (success) { + DbHelper.executeTransactionContent(session -> { + team.setArchived(true); + session.update(team); + this.getModel().fireTableDataChanged(); + }); + } + }).start(); + } + } + } +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/DeleteRepositoryListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/DeleteRepositoryListener.java new file mode 100644 index 0000000..89304a2 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/DeleteRepositoryListener.java @@ -0,0 +1,57 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_team_actions; + +import nl.andrewlalis.git_api.GithubManager; +import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.DbHelper; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * Listens for when the user wishes to delete one or more repositories. + */ +public class DeleteRepositoryListener extends StudentTeamListener { + + /** + * The GithubManager used for deleting the repositories. + */ + private GithubManager manager; + + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + */ + public DeleteRepositoryListener(JTable table, GithubManager manager) { + super(table); + this.manager = manager; + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + for (StudentTeam team : this.getSelectedStudentTeams()) { + + if (team.getRepositoryName() == null) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Team " + team.getNumber() + " does not have a repository.", + "No repository", + JOptionPane.WARNING_MESSAGE + ); + } + + if (team.getRepositoryName() != null) { + new Thread(() -> { + boolean success = this.manager.deleteRepository(team.getRepositoryName()); + if (success) { + DbHelper.executeTransactionContent(session -> { + team.setRepositoryName(null); + this.getModel().fireTableDataChanged(); + session.update(team); + }); + } + }).start(); + } + } + } +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/GenerateRepositoryListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/GenerateRepositoryListener.java new file mode 100644 index 0000000..d5b49d6 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/GenerateRepositoryListener.java @@ -0,0 +1,73 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_team_actions; + +import nl.andrewlalis.git_api.GithubManager; +import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.DbHelper; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * Listens for when the user wishes to create a repository for one or more selected teams. + */ +public class GenerateRepositoryListener extends StudentTeamListener { + + /** + * The GithubManager object used to manipulate repositories on Github. + */ + private GithubManager manager; + + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + */ + public GenerateRepositoryListener(JTable table, GithubManager manager) { + super(table); + this.manager = manager; + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + + String prefix = JOptionPane.showInputDialog( + SwingUtilities.getWindowAncestor(this.getTable()), + "Please give a prefix for the repository(s).", + "Repository Prefix", + JOptionPane.QUESTION_MESSAGE + ); + if (prefix == null) return; + + for (StudentTeam team : this.getSelectedStudentTeams()) { + + if (team.isArchived()) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Team " + team.getNumber() + " is archived.", + "Team archived", + JOptionPane.WARNING_MESSAGE + ); + } + + if (team.getRepositoryName() != null) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Team " + team.getNumber() + " already has a repository.", + "Repository exists", + JOptionPane.WARNING_MESSAGE + ); + } + + if (!team.isArchived() && team.getRepositoryName() == null) { + new Thread(() -> { + DbHelper.executeTransactionContent(session -> { + String name = this.manager.setupStudentRepo(team, prefix); + team.setRepositoryName(name); + this.getModel().fireTableDataChanged(); + session.update(team); + }); + }).start(); + } + } + } +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/RemoveTeamListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/RemoveTeamListener.java new file mode 100644 index 0000000..01b7691 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/RemoveTeamListener.java @@ -0,0 +1,67 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_team_actions; + +import nl.andrewlalis.git_api.GithubManager; +import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.DbHelper; + +import javax.swing.*; +import java.awt.event.ActionEvent; + +/** + * Listens for when the user wants to remove a team from the list of teams. This should then archive that team, so that + * it cannot be interacted with further, and all its information essentially becomes read-only. + */ +public class RemoveTeamListener extends StudentTeamListener { + + /** + * The Github manager for interacting with Github. + */ + private GithubManager manager; + + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + * @param manager The manager to interact + */ + public RemoveTeamListener(JTable table, GithubManager manager) { + super(table); + this.manager = manager; + } + + @Override + public void actionPerformed(ActionEvent actionEvent) { + for (StudentTeam team : this.getSelectedStudentTeams()) { + + if (team.isArchived()) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Team " + team.getNumber() + " is already archived.", + "Already archived", + JOptionPane.WARNING_MESSAGE + ); + } + + if (!team.isArchived()) { + new Thread(() -> { + DbHelper.executeTransactionContent(session -> { + if (team.getRepositoryName() != null) { + boolean success = this.manager.archiveRepository(team.getRepositoryName()); + if (!success) { + JOptionPane.showMessageDialog( + this.getTable().getTopLevelAncestor(), + "Could not archive team " + team.getNumber() + "'s repository.", + "Could not archive", + JOptionPane.ERROR_MESSAGE + ); + return; + } + } + team.setArchived(true); + session.update(team); + }); + }).start(); + } + } + } +} diff --git a/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/StudentTeamListener.java b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/StudentTeamListener.java new file mode 100644 index 0000000..79bcf40 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/control/listeners/management_view/student_team_actions/StudentTeamListener.java @@ -0,0 +1,42 @@ +package nl.andrewlalis.ui.control.listeners.management_view.student_team_actions; + +import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.ui.control.listeners.management_view.TableRowListener; +import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; + +import javax.swing.*; +import java.util.ArrayList; +import java.util.List; + +/** + * An abstract table row listener designed for use with only the student teams model. + */ +public abstract class StudentTeamListener extends TableRowListener { + /** + * Constructs a table row listener. + * + * @param table The table on which to get selected rows. + */ + public StudentTeamListener(JTable table) { + super(table); + } + + /** + * @return The student teams model that this listener applies to. + */ + public StudentTeamTableModel getModel() { + return (StudentTeamTableModel) this.getTable().getModel(); + } + + /** + * @return A list of teams which the user has selected. + */ + public List getSelectedStudentTeams() { + StudentTeamTableModel model = (StudentTeamTableModel) this.getTable().getModel(); + List selectedTeams = new ArrayList<>(); + for (int row : this.getTable().getSelectedRows()) { + selectedTeams.add(model.getStudentTeamAt(this.getTable().convertRowIndexToModel(row))); + } + return selectedTeams; + } +} diff --git a/src/main/java/nl/andrewlalis/ui/view/ManagementView.java b/src/main/java/nl/andrewlalis/ui/view/ManagementView.java index 723121b..dbfa0dc 100644 --- a/src/main/java/nl/andrewlalis/ui/view/ManagementView.java +++ b/src/main/java/nl/andrewlalis/ui/view/ManagementView.java @@ -3,10 +3,9 @@ package nl.andrewlalis.ui.view; import nl.andrewlalis.git_api.GithubManager; import nl.andrewlalis.model.database.DbHelper; import nl.andrewlalis.model.database.DbUtil; -import nl.andrewlalis.ui.control.listeners.management_view.PopupSelector; -import nl.andrewlalis.ui.control.listeners.management_view.student_actions.RemoveFromCourseListener; -import nl.andrewlalis.ui.control.listeners.management_view.student_actions.SetTeamListener; import nl.andrewlalis.ui.view.components.DetailPanel; +import nl.andrewlalis.ui.view.components.tables.StudentTeamsTable; +import nl.andrewlalis.ui.view.components.tables.StudentsTable; import nl.andrewlalis.ui.view.table_models.StudentTableModel; import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; @@ -106,9 +105,15 @@ public class ManagementView extends AbstractView { // The real container for all the data views. JTabbedPane tabbedPane = new JTabbedPane(); - tabbedPane.addTab("Students", this.buildStudentsTablePanel()); - tabbedPane.addTab("Student Teams", this.buildStudentTeamsTablePanel()); - tabbedPane.addTab("Teaching Assistants", this.buildTAsTablePanel()); + tabbedPane.addTab("Students", this.buildGenericTablePanel( + new StudentsTable(this.studentsModel, this.studentTeamModel, this.detailPanel) + )); + tabbedPane.addTab("Student Teams", this.buildGenericTablePanel( + new StudentTeamsTable(this.studentTeamModel, this.detailPanel, this.getGithubManager()) + )); + tabbedPane.addTab("Teaching Assistants", this.buildGenericTablePanel( + null + )); overviewPanel.add(tabbedPane, BorderLayout.CENTER); @@ -125,6 +130,12 @@ public class ManagementView extends AbstractView { searchPanel.add(new JLabel("Search", SwingConstants.LEFT), BorderLayout.WEST); searchPanel.add(new JTextField(), BorderLayout.CENTER); + JButton refreshButton = new JButton("Refresh Tables"); + refreshButton.addActionListener(actionEvent -> { + this.updateModels(); + }); + searchPanel.add(refreshButton, BorderLayout.EAST); + return searchPanel; } @@ -139,57 +150,6 @@ public class ManagementView extends AbstractView { return surroundingPanel; } - /** - * @return A JPanel to be put into a tab for display of a list of students. - */ - private JPanel buildStudentsTablePanel() { - // Initialize the model, table, and a surrounding scroll pane. - JTable table = new JTable(this.studentsModel); - table.setFillsViewportHeight(true); - table.getSelectionModel().addListSelectionListener(listSelectionEvent -> { - int row = table.getSelectedRow(); - if (row >= 0 && row < studentsModel.getRowCount()) { - detailPanel.setDetailableEntity(studentsModel.getStudentAt(row)); - } - }); - - // A context menu for the table. - JPopupMenu menu = new JPopupMenu("Menu"); - // Item for setting a student's team. - JMenuItem setTeamItem = new JMenuItem("Set team"); - setTeamItem.addActionListener(new SetTeamListener(this, table, this.studentTeamModel)); - menu.add(setTeamItem); - // Item for removing a student from the course. - JMenuItem removeItem = new JMenuItem("Remove from course"); - removeItem.addActionListener(new RemoveFromCourseListener(table)); - menu.add(removeItem); - - menu.addPopupMenuListener(new PopupSelector(table)); - table.setComponentPopupMenu(menu); - - return this.buildGenericTablePanel(table); - } - - /** - * @return A JPanel to be put into a tab for display of a list of student teams. - */ - private JPanel buildStudentTeamsTablePanel() { - // Make sure that the model has the latest student teams. - this.studentTeamModel.setStudentTeamsList(DbHelper.getStudentTeams()); - - JTable table = new JTable(this.studentTeamModel); - table.setFillsViewportHeight(true); - table.getSelectionModel().addListSelectionListener(listSelectionEvent -> { - detailPanel.setDetailableEntity(studentTeamModel.getStudentTeamAt(table.getSelectedRow())); - }); - - return this.buildGenericTablePanel(table); - } - - private JPanel buildTAsTablePanel() { - return new JPanel(); - } - /** * Updates all models in the management view in accordance with the database. */ diff --git a/src/main/java/nl/andrewlalis/ui/view/components/DetailPanel.java b/src/main/java/nl/andrewlalis/ui/view/components/DetailPanel.java index fe279cb..16ba2b3 100644 --- a/src/main/java/nl/andrewlalis/ui/view/components/DetailPanel.java +++ b/src/main/java/nl/andrewlalis/ui/view/components/DetailPanel.java @@ -4,6 +4,7 @@ import nl.andrewlalis.ui.view.table_models.DetailPairsModel; import javax.swing.*; import java.awt.*; +import java.util.ArrayList; /** * The detail panel is meant for displaying the details of a specific entity. The actual content/details to display is @@ -16,11 +17,6 @@ public class DetailPanel extends JPanel { */ private JTextField nameField; - /** - * The description area shows the entity's description. - */ - private JTextArea descriptionTextArea; - /** * A model to represent the key-value pairs of this entity. */ @@ -34,7 +30,6 @@ public class DetailPanel extends JPanel { this.setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); this.add(new JLabel("Details", SwingConstants.CENTER)); this.add(this.buildNamePanel()); - this.add(this.buildDescriptionPanel()); this.add(this.buildPairsTablePanel()); } @@ -43,9 +38,13 @@ public class DetailPanel extends JPanel { * @param entity The entity to get details from. */ public void setDetailableEntity(Detailable entity) { - this.nameField.setText(entity.getDetailName()); - this.descriptionTextArea.setText(entity.getDetailDescription()); - this.detailPairsModel.setPairs(entity.getDetailPairs()); + if (entity == null) { + this.nameField.setText(null); + this.detailPairsModel.setPairs(new ArrayList<>()); + } else { + this.nameField.setText(entity.getDetailName()); + this.detailPairsModel.setPairs(entity.getDetailPairs()); + } } /** @@ -62,20 +61,6 @@ public class DetailPanel extends JPanel { return namePanel; } - /** - * @return A JPanel containing the description text area. - */ - private JPanel buildDescriptionPanel() { - this.descriptionTextArea = new JTextArea(); - this.descriptionTextArea.setEditable(false); - - JPanel descriptionPanel = new JPanel(new BorderLayout()); - descriptionPanel.add(new JLabel("Description:", SwingConstants.CENTER), BorderLayout.NORTH); - descriptionPanel.add(this.descriptionTextArea, BorderLayout.CENTER); - - return descriptionPanel; - } - /** * @return A JPanel containing a table of properties. */ diff --git a/src/main/java/nl/andrewlalis/ui/view/components/Detailable.java b/src/main/java/nl/andrewlalis/ui/view/components/Detailable.java index 241c29b..775d19c 100644 --- a/src/main/java/nl/andrewlalis/ui/view/components/Detailable.java +++ b/src/main/java/nl/andrewlalis/ui/view/components/Detailable.java @@ -14,11 +14,6 @@ public interface Detailable { */ String getDetailName(); - /** - * @return Some more information to display below the name for this object. - */ - String getDetailDescription(); - /** * @return A String-to-String mapping for some key value pairs of properties to display. */ diff --git a/src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTable.java b/src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTable.java new file mode 100644 index 0000000..aef7e6b --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTable.java @@ -0,0 +1,61 @@ +package nl.andrewlalis.ui.view.components.tables; + +import nl.andrewlalis.ui.view.components.DetailPanel; +import nl.andrewlalis.ui.view.table_models.AbstractEntityModel; + +import javax.swing.*; + +/** + * An extension to the JTable component for displaying any arbitrary entity in the management view. + * + * Also sets some default settings for the table. + */ +public abstract class EntityTable extends JTable { + + /** + * The panel on which to display details of the selected entity. + */ + private DetailPanel detailPanel; + + /** + * Constructs a new table with the given model and a reference to a detail panel to show extra details about the entity. + * @param model The table model to apply to this table. + * @param detailPanel The panel on which to display details of the selected entity. + */ + protected EntityTable(AbstractEntityModel model, DetailPanel detailPanel) { + super(model); + this.detailPanel = detailPanel; + } + + /** + * This method should be called by child classes once all variables and additional requirements for the popup menu + * are initialized. Also adds a list selection listener to display the selected entity by default. + */ + protected void setupTable() { + AbstractEntityModel model = (AbstractEntityModel) this.getModel(); + + this.setFillsViewportHeight(true); + this.getSelectionModel().addListSelectionListener(listSelectionEvent -> { + int row = this.getSelectedRow(); + if (row >= 0 && row < model.getRowCount()) { + this.detailPanel.setDetailableEntity(model.getEntityAt(this.convertRowIndexToModel(row))); + } + }); + + EntityTableCellRenderer renderer = new EntityTableCellRenderer(model); + this.setDefaultRenderer(Integer.class, renderer); + this.setDefaultRenderer(String.class, renderer); + this.setDefaultRenderer(int.class, renderer); + + this.setFont(this.getFont().deriveFont(14.0f)); + + this.setComponentPopupMenu(this.getPopupMenu()); + this.setAutoCreateRowSorter(true); + } + + /** + * @return The popup menu for this table. This is defined by child classes. + */ + protected abstract JPopupMenu getPopupMenu(); + +} diff --git a/src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTableCellRenderer.java b/src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTableCellRenderer.java new file mode 100644 index 0000000..0a093e2 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/components/tables/EntityTableCellRenderer.java @@ -0,0 +1,45 @@ +package nl.andrewlalis.ui.view.components.tables; + +import nl.andrewlalis.model.database.BaseEntity; +import nl.andrewlalis.ui.view.table_models.AbstractEntityModel; + +import javax.swing.*; +import javax.swing.table.DefaultTableCellRenderer; +import java.awt.*; + +/** + * This class extends the default table cell renderer to allow for some custom rendering of table cells for entity + * tables. + */ +public class EntityTableCellRenderer extends DefaultTableCellRenderer { + + /** + * The model which is applied to the table that this cell renderer is applied to. + */ + private AbstractEntityModel model; + + /** + * Constructs a new cell renderer which is linked to the given model. + * @param model A model of entities which is used for rendering cells. + */ + public EntityTableCellRenderer(AbstractEntityModel model) { + this.model = model; + } + + @Override + public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { + Component parentRenderer = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); + + if (value != null && !isSelected) { + BaseEntity entity = this.model.getEntityAt(row); + if (entity.isArchived()) { + parentRenderer.setBackground(Color.LIGHT_GRAY); + } else { + parentRenderer.setBackground(Color.WHITE); + } + } + + return parentRenderer; + } + +} diff --git a/src/main/java/nl/andrewlalis/ui/view/components/tables/StudentTeamsTable.java b/src/main/java/nl/andrewlalis/ui/view/components/tables/StudentTeamsTable.java new file mode 100644 index 0000000..0e4c547 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/components/tables/StudentTeamsTable.java @@ -0,0 +1,69 @@ +package nl.andrewlalis.ui.view.components.tables; + +import nl.andrewlalis.git_api.GithubManager; +import nl.andrewlalis.ui.control.listeners.management_view.student_team_actions.ArchiveRepositoryListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_team_actions.DeleteRepositoryListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_team_actions.GenerateRepositoryListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_team_actions.RemoveTeamListener; +import nl.andrewlalis.ui.view.components.DetailPanel; +import nl.andrewlalis.ui.view.components.tables.popup_menu.EntityMenuItem; +import nl.andrewlalis.ui.view.components.tables.popup_menu.EntitySelectionType; +import nl.andrewlalis.ui.view.table_models.AbstractEntityModel; + +import javax.swing.*; + +public class StudentTeamsTable extends EntityTable { + + /** + * A reference to the github manager, for cases where it's needed to interact with github repositories. + */ + private GithubManager manager; + + /** + * Constructs a new table with the given model and a reference to a detail panel to show extra details about the entity. + * + * @param model The table model to apply to this table. + * @param detailPanel The panel on which to display details of the selected entity. + * @param manager The GithubManager object used to interact with Github. + */ + public StudentTeamsTable(AbstractEntityModel model, DetailPanel detailPanel, GithubManager manager) { + super(model, detailPanel); + this.manager = manager; + this.setupTable(); + } + + @Override + protected JPopupMenu getPopupMenu() { + + JPopupMenu menu = new JPopupMenu("menu"); + + // Item for generating the repository of a given team. + JMenuItem generateRepositoryItem = new EntityMenuItem("Generate Repository", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + generateRepositoryItem.addActionListener(new GenerateRepositoryListener(this, this.manager)); + menu.add(generateRepositoryItem); + + // Item for assigning a TA team to a student team. + JMenuItem assignTATeamItem = new EntityMenuItem("Assign to TA Team", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + assignTATeamItem.addActionListener(actionEvent -> { + System.out.println("Assign to TA team"); + }); + menu.add(assignTATeamItem); + + // Item for archiving the repository of a student team. + JMenuItem archiveRepositoryItem = new EntityMenuItem("Archive Repository", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + archiveRepositoryItem.addActionListener(new ArchiveRepositoryListener(this, this.manager)); + menu.add(archiveRepositoryItem); + + // Item for deleting a repository. TODO: Remove this for production version! Only archiving is allowed. + JMenuItem deleteRepositoryItem = new EntityMenuItem("Delete Repository", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + deleteRepositoryItem.addActionListener(new DeleteRepositoryListener(this, this.manager)); + menu.add(deleteRepositoryItem); + + // Item for removing a team. + JMenuItem removeTeamItem = new EntityMenuItem("Remove Team", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + removeTeamItem.addActionListener(new RemoveTeamListener(this, this.manager)); + menu.add(removeTeamItem); + + return menu; + } +} diff --git a/src/main/java/nl/andrewlalis/ui/view/components/tables/StudentsTable.java b/src/main/java/nl/andrewlalis/ui/view/components/tables/StudentsTable.java new file mode 100644 index 0000000..c8fbe93 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/components/tables/StudentsTable.java @@ -0,0 +1,54 @@ +package nl.andrewlalis.ui.view.components.tables; + +import nl.andrewlalis.ui.control.listeners.management_view.EntityTablePopupMenuListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_actions.NewStudentListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_actions.RemoveFromCourseListener; +import nl.andrewlalis.ui.control.listeners.management_view.student_actions.SetTeamListener; +import nl.andrewlalis.ui.view.components.DetailPanel; +import nl.andrewlalis.ui.view.components.tables.popup_menu.EntityMenuItem; +import nl.andrewlalis.ui.view.components.tables.popup_menu.EntitySelectionType; +import nl.andrewlalis.ui.view.table_models.StudentTableModel; +import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel; + +import javax.swing.*; + +/** + * This table displays a list of students, and offers the user the ability to interact with entities in the list. + */ +public class StudentsTable extends EntityTable { + + /** + * A reference to the model for student teams. + */ + private StudentTeamTableModel studentTeamModel; + + public StudentsTable(StudentTableModel studentTableModel, StudentTeamTableModel studentTeamModel, DetailPanel detailPanel) { + super(studentTableModel, detailPanel); + this.studentTeamModel = studentTeamModel; + this.setupTable(); + } + + @Override + protected JPopupMenu getPopupMenu() { + // A context menu for the table. + JPopupMenu menu = new JPopupMenu("Menu"); + + // Item for creating a new student (for example, if someone registered for the course late). + JMenuItem newStudentItem = new EntityMenuItem("New Student", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + newStudentItem.addActionListener(new NewStudentListener(this)); + + // Item for setting a student's team. + JMenuItem setTeamItem = new EntityMenuItem("Set team", EntitySelectionType.SINGLE); + setTeamItem.addActionListener(new SetTeamListener(this, this.studentTeamModel)); + menu.add(setTeamItem); + + // Item for removing a student from the course. + JMenuItem removeItem = new EntityMenuItem("Remove from course", EntitySelectionType.SINGLE | EntitySelectionType.MULTIPLE); + removeItem.addActionListener(new RemoveFromCourseListener(this, this.studentTeamModel)); + menu.add(removeItem); + + menu.addPopupMenuListener(new EntityTablePopupMenuListener(this)); + + return menu; + } +} diff --git a/src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntityMenuItem.java b/src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntityMenuItem.java new file mode 100644 index 0000000..ac82b16 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntityMenuItem.java @@ -0,0 +1,30 @@ +package nl.andrewlalis.ui.view.components.tables.popup_menu; + +import javax.swing.*; + +/** + * An extension of the default menu item, with this type being able to enable/disable depending on the current selection + * type of the table. + */ +public class EntityMenuItem extends JMenuItem { + + /** + * An integer representing the bitwise OR of possibly many selection types. + */ + private int enabledSelectionTypes; + + public EntityMenuItem(String name, int enabledSelectionTypes) { + super(name); + this.enabledSelectionTypes = enabledSelectionTypes; + } + + /** + * This method is called just before the menu item is shown, thus allowing this menu item to enable or disable + * itself depending on the selection type. + * @param selectionType The type of selection that the user currently has on the table. + */ + public void willBecomeVisible(int selectionType) { + this.setEnabled((selectionType & this.enabledSelectionTypes) > 0); + } + +} diff --git a/src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntitySelectionType.java b/src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntitySelectionType.java new file mode 100644 index 0000000..48e0588 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/components/tables/popup_menu/EntitySelectionType.java @@ -0,0 +1,11 @@ +package nl.andrewlalis.ui.view.components.tables.popup_menu; + +/** + * Describes different selection values. These are used when determining if a menu item should be shown or not. + */ +public class EntitySelectionType { + + public static final int SINGLE = 1; + public static final int MULTIPLE = 2; + +} diff --git a/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java b/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java index c62b2f1..3115119 100644 --- a/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java +++ b/src/main/java/nl/andrewlalis/ui/view/dialogs/TeamChooserDialog.java @@ -5,6 +5,7 @@ import nl.andrewlalis.model.Team; import javax.swing.*; import java.awt.*; +import java.util.List; /** * With this dialog, a user can choose from a list of teams. This works for any type of team. @@ -25,9 +26,9 @@ public class TeamChooserDialog extends JDialog { /** * The model containing the list of teams. */ - private StudentTeam[] teams; + private List teams; - public TeamChooserDialog(Window parent, StudentTeam[] teams) { + public TeamChooserDialog(Window parent, List teams) { super(parent, "Team Chooser", ModalityType.APPLICATION_MODAL); this.teams = teams; this.setContentPane(this.buildContentPane()); @@ -47,9 +48,9 @@ public class TeamChooserDialog extends JDialog { // Main selection panel. // Create a list of numbers to represent the teams. - Integer[] teamNumbers = new Integer[this.teams.length]; - for (int row = 0; row < this.teams.length; row++) { - teamNumbers[row] = this.teams[row].getNumber(); + Integer[] teamNumbers = new Integer[this.teams.size()]; + for (int row = 0; row < this.teams.size(); row++) { + teamNumbers[row] = this.teams.get(row).getNumber(); } this.teamChooserBox = new JComboBox<>(teamNumbers); @@ -60,7 +61,7 @@ public class TeamChooserDialog extends JDialog { JButton doneButton = new JButton("Done"); // Add a small action listener to set the selected team and dispose of the dialog. doneButton.addActionListener(actionEvent -> { - selectedTeam = teams[teamChooserBox.getSelectedIndex()]; + selectedTeam = teams.get(teamChooserBox.getSelectedIndex()); dispose(); }); confirmPanel.add(doneButton); diff --git a/src/main/java/nl/andrewlalis/ui/view/table_models/AbstractEntityModel.java b/src/main/java/nl/andrewlalis/ui/view/table_models/AbstractEntityModel.java new file mode 100644 index 0000000..7c83120 --- /dev/null +++ b/src/main/java/nl/andrewlalis/ui/view/table_models/AbstractEntityModel.java @@ -0,0 +1,19 @@ +package nl.andrewlalis.ui.view.table_models; + +import nl.andrewlalis.model.database.BaseEntity; + +import javax.swing.table.AbstractTableModel; + +/** + * A table model representing any possible entity that would be displayed in a table. + */ +public abstract class AbstractEntityModel extends AbstractTableModel { + + /** + * Gets the entity at a particular row in the model. + * @param row The row at which to get the entity. + * @return The entity in a certain row in the model. + */ + public abstract BaseEntity getEntityAt(int row); + +} diff --git a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTableModel.java b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTableModel.java index 6234223..75188ce 100644 --- a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTableModel.java +++ b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTableModel.java @@ -1,14 +1,14 @@ package nl.andrewlalis.ui.view.table_models; import nl.andrewlalis.model.Student; +import nl.andrewlalis.model.database.BaseEntity; -import javax.swing.table.AbstractTableModel; import java.util.List; /** * This table model is used for the representation of a list of persons, with their basic information. */ -public class StudentTableModel extends AbstractTableModel { +public class StudentTableModel extends AbstractEntityModel { /** * The list of data that is used in the table. @@ -49,6 +49,11 @@ public class StudentTableModel extends AbstractTableModel { return null; } + @Override + public BaseEntity getEntityAt(int row) { + return this.getStudentAt(row); + } + @Override public int getRowCount() { return studentsList.size(); @@ -64,6 +69,14 @@ public class StudentTableModel extends AbstractTableModel { return this.columns[i]; } + @Override + public Class getColumnClass(int i) { + if (this.studentsList.isEmpty()) { + return Object.class; + } + return getValueAt(0, i).getClass(); + } + @Override public Object getValueAt(int row, int col) { Student student = this.getStudentAt(row); diff --git a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java index 0810ba6..2849d5c 100644 --- a/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java +++ b/src/main/java/nl/andrewlalis/ui/view/table_models/StudentTeamTableModel.java @@ -2,15 +2,15 @@ package nl.andrewlalis.ui.view.table_models; import nl.andrewlalis.model.Student; import nl.andrewlalis.model.StudentTeam; +import nl.andrewlalis.model.database.BaseEntity; -import javax.swing.table.AbstractTableModel; import java.util.ArrayList; import java.util.List; /** * This table model represents the list of student teams. */ -public class StudentTeamTableModel extends AbstractTableModel { +public class StudentTeamTableModel extends AbstractEntityModel { /** * The container for the data objects. @@ -63,6 +63,11 @@ public class StudentTeamTableModel extends AbstractTableModel { return null; } + @Override + public BaseEntity getEntityAt(int row) { + return this.getStudentTeamAt(row); + } + /** * @return A list of all teams in this model. */ @@ -89,6 +94,19 @@ public class StudentTeamTableModel extends AbstractTableModel { } } + @Override + public Class getColumnClass(int i) { + if (this.studentTeamsList.isEmpty()) { + return Object.class; + } + Object value = this.getValueAt(0, i); + if (value != null) { + return value.getClass(); + } else { + return null; + } + } + @Override public Object getValueAt(int i, int i1) { StudentTeam team = this.getStudentTeamAt(i); diff --git a/src/main/resources/hibernate.cfg.xml b/src/main/resources/hibernate.cfg.xml index de5ea3a..f4a2c61 100644 --- a/src/main/resources/hibernate.cfg.xml +++ b/src/main/resources/hibernate.cfg.xml @@ -1,27 +1,28 @@ + "http://www.hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> - org.h2.Driver - jdbc:h2:./initializer.h2 - org.hibernate.dialect.H2Dialect - root - root + com.mysql.cj.jdbc.Driver + jdbc:mysql://localhost:3306/gitgroup?autoReconnect=true&useSSL=false + org.hibernate.dialect.MySQL57Dialect + gitgroup_user + password - 1 + 100 false - create-drop + create + -- 2.34.1