Improvements and new version in development #5
			
				
			
		
		
		
	| 
						 | 
				
			
			@ -59,8 +59,7 @@ public class Main {
 | 
			
		|||
 | 
			
		||||
    private static void initializeTestingData() {
 | 
			
		||||
        try {
 | 
			
		||||
            List<StudentTeam> teams = TeamGenerator.generateFromCSV("/home/andrew/Documents/School/ta/GithubInitializer/sampleAOOP.csv", 2);
 | 
			
		||||
            System.out.println(teams);
 | 
			
		||||
            List<StudentTeam> teams = TeamGenerator.generateFromCSV("/home/andrew/Documents/School/ta/GithubInitializer/student-groups.csv", 2);
 | 
			
		||||
            DbHelper.saveStudentTeams(teams);
 | 
			
		||||
            managementView.updateModels();
 | 
			
		||||
        } catch (IOException e) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -112,4 +112,9 @@ public class StudentTeam extends Team {
 | 
			
		|||
    public void setTaTeam(TATeam team) {
 | 
			
		||||
        this.taTeam = team;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getDetailName() {
 | 
			
		||||
        return this.generateRepoDescription();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
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.*;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
| 
						 | 
				
			
			@ -13,7 +15,7 @@ import java.util.List;
 | 
			
		|||
 */
 | 
			
		||||
@Entity(name = "Team")
 | 
			
		||||
@Table(name = "teams")
 | 
			
		||||
public abstract class Team extends BaseEntity {
 | 
			
		||||
public abstract class Team extends BaseEntity implements Detailable {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * An identification number unique to this team alone.
 | 
			
		||||
| 
						 | 
				
			
			@ -24,7 +26,7 @@ public abstract class Team extends BaseEntity {
 | 
			
		|||
    /**
 | 
			
		||||
     * A list of members of this team.
 | 
			
		||||
     */
 | 
			
		||||
    @OneToMany
 | 
			
		||||
    @OneToMany(fetch = FetchType.EAGER)
 | 
			
		||||
    @JoinTable(
 | 
			
		||||
            name = "team_members",
 | 
			
		||||
            joinColumns = {@JoinColumn(name = "team_id")},
 | 
			
		||||
| 
						 | 
				
			
			@ -41,6 +43,13 @@ public abstract class Team extends BaseEntity {
 | 
			
		|||
        this.members = new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Constructs an empty team with a default id of -1.
 | 
			
		||||
     */
 | 
			
		||||
    protected Team() {
 | 
			
		||||
        this(-1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @param newId The new number number to assign to this team.
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -162,4 +171,25 @@ public abstract class Team extends BaseEntity {
 | 
			
		|||
        return sb.toString();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getDetailName() {
 | 
			
		||||
        return String.valueOf(this.getNumber());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getDetailDescription() {
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<Pair<String, String>> getDetailPairs() {
 | 
			
		||||
        List<Pair<String, String>> pairs = new ArrayList<>();
 | 
			
		||||
        pairs.add(new Pair<>("Number", this.getDetailName()));
 | 
			
		||||
 | 
			
		||||
        for (int i = 0; i < this.memberCount(); i++) {
 | 
			
		||||
            pairs.add(new Pair<>("Member " + (i + 1), this.members.get(i).getDetailName()));
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return pairs;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,6 @@ package nl.andrewlalis.model.database;
 | 
			
		|||
import nl.andrewlalis.model.Student;
 | 
			
		||||
import nl.andrewlalis.model.StudentTeam;
 | 
			
		||||
import org.hibernate.Session;
 | 
			
		||||
import org.hibernate.SessionFactory;
 | 
			
		||||
import org.hibernate.Transaction;
 | 
			
		||||
 | 
			
		||||
import java.util.List;
 | 
			
		||||
| 
						 | 
				
			
			@ -11,6 +10,7 @@ import java.util.List;
 | 
			
		|||
/**
 | 
			
		||||
 * This class will contain some static methods to help in the retrieval of commonly used information.
 | 
			
		||||
 */
 | 
			
		||||
@SuppressWarnings("unchecked")
 | 
			
		||||
public class DbHelper {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
| 
						 | 
				
			
			@ -18,8 +18,7 @@ public class DbHelper {
 | 
			
		|||
     * @return A list of students.
 | 
			
		||||
     */
 | 
			
		||||
    public static List<Student> getStudents() {
 | 
			
		||||
        SessionFactory sessionFactory = DbUtil.getSessionFactory();
 | 
			
		||||
        Session session = sessionFactory.openSession();
 | 
			
		||||
        Session session = DbUtil.getSessionFactory().openSession();
 | 
			
		||||
        List<Student> students = (List<Student>) session.createQuery("from Student").list();
 | 
			
		||||
        session.close();
 | 
			
		||||
        return students;
 | 
			
		||||
| 
						 | 
				
			
			@ -43,4 +42,15 @@ public class DbHelper {
 | 
			
		|||
        session.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a list of student teams in the database.
 | 
			
		||||
     * @return A list of student teams.
 | 
			
		||||
     */
 | 
			
		||||
    public static List<StudentTeam> getStudentTeams() {
 | 
			
		||||
        Session session = DbUtil.getSessionFactory().openSession();
 | 
			
		||||
        List<StudentTeam> studentTeams = (List<StudentTeam>) session.createQuery("from StudentTeam").list();
 | 
			
		||||
        session.close();
 | 
			
		||||
        return studentTeams;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,6 +5,7 @@ import nl.andrewlalis.model.database.DbHelper;
 | 
			
		|||
import nl.andrewlalis.model.database.DbUtil;
 | 
			
		||||
import nl.andrewlalis.ui.view.components.DetailPanel;
 | 
			
		||||
import nl.andrewlalis.ui.view.table_models.StudentTableModel;
 | 
			
		||||
import nl.andrewlalis.ui.view.table_models.StudentTeamTableModel;
 | 
			
		||||
 | 
			
		||||
import javax.swing.*;
 | 
			
		||||
import java.awt.*;
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +22,11 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
     */
 | 
			
		||||
    private StudentTableModel studentsModel;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The model for the student teams table.
 | 
			
		||||
     */
 | 
			
		||||
    private StudentTeamTableModel studentTeamModel;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * A panel which displays the details of selected entities.
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +95,7 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
        JPanel overviewPanel = new JPanel(new BorderLayout());
 | 
			
		||||
        overviewPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
 | 
			
		||||
 | 
			
		||||
        overviewPanel.add(new JLabel("Overview", SwingConstants.CENTER), BorderLayout.NORTH);
 | 
			
		||||
        overviewPanel.add(this.buildSearchPanel(), BorderLayout.NORTH);
 | 
			
		||||
 | 
			
		||||
        // The real container for all the data views.
 | 
			
		||||
        JTabbedPane tabbedPane = new JTabbedPane();
 | 
			
		||||
| 
						 | 
				
			
			@ -103,6 +109,30 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
        return overviewPanel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Builds a JPanel containing utilities to search the data in the various tables in the application.
 | 
			
		||||
     * @return A JPanel containing search functionality.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel buildSearchPanel() {
 | 
			
		||||
        JPanel searchPanel = new JPanel(new BorderLayout());
 | 
			
		||||
 | 
			
		||||
        searchPanel.add(new JLabel("Search", SwingConstants.LEFT), BorderLayout.WEST);
 | 
			
		||||
        searchPanel.add(new JTextField(), BorderLayout.CENTER);
 | 
			
		||||
 | 
			
		||||
        return searchPanel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Provides a JScrollPane and JPanel to surround a table.
 | 
			
		||||
     * @param table The table to wrap.
 | 
			
		||||
     * @return The JPanel containing the table, wrapped in a JScrollPane.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel buildGenericTablePanel(JTable table) {
 | 
			
		||||
        JPanel surroundingPanel = new JPanel(new BorderLayout());
 | 
			
		||||
        surroundingPanel.add(new JScrollPane(table), BorderLayout.CENTER);
 | 
			
		||||
        return surroundingPanel;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return A JPanel to be put into a tab for display of a list of students.
 | 
			
		||||
     */
 | 
			
		||||
| 
						 | 
				
			
			@ -110,21 +140,27 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
        // Initialize the model, table, and a surrounding scroll pane.
 | 
			
		||||
        this.studentsModel = new StudentTableModel(DbHelper.getStudents());
 | 
			
		||||
 | 
			
		||||
        JPanel surroundingPanel = new JPanel(new BorderLayout());
 | 
			
		||||
 | 
			
		||||
        JTable table = new JTable(this.studentsModel);
 | 
			
		||||
        table.setFillsViewportHeight(true);
 | 
			
		||||
        table.getSelectionModel().addListSelectionListener(listSelectionEvent -> {
 | 
			
		||||
            detailPanel.setDetailableEntity(studentsModel.getStudentAt(table.getSelectedRow()));
 | 
			
		||||
        });
 | 
			
		||||
        JScrollPane scrollPane = new JScrollPane(table);
 | 
			
		||||
 | 
			
		||||
        surroundingPanel.add(scrollPane, BorderLayout.CENTER);
 | 
			
		||||
        return surroundingPanel;
 | 
			
		||||
        return this.buildGenericTablePanel(table);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * @return A JPanel to be put into a tab for display of a list of student teams.
 | 
			
		||||
     */
 | 
			
		||||
    private JPanel buildStudentTeamsTablePanel() {
 | 
			
		||||
        return new JPanel();
 | 
			
		||||
        this.studentTeamModel = new StudentTeamTableModel(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() {
 | 
			
		||||
| 
						 | 
				
			
			@ -136,6 +172,6 @@ public class ManagementView extends AbstractView {
 | 
			
		|||
     */
 | 
			
		||||
    public void updateModels() {
 | 
			
		||||
        this.studentsModel.setStudentsList(DbHelper.getStudents());
 | 
			
		||||
 | 
			
		||||
        this.studentTeamModel.setStudentTeamsList(DbHelper.getStudentTeams());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -0,0 +1,142 @@
 | 
			
		|||
package nl.andrewlalis.ui.view.table_models;
 | 
			
		||||
 | 
			
		||||
import nl.andrewlalis.model.Student;
 | 
			
		||||
import nl.andrewlalis.model.StudentTeam;
 | 
			
		||||
 | 
			
		||||
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 {
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The container for the data objects.
 | 
			
		||||
     */
 | 
			
		||||
    private List<StudentTeam> studentTeamsList;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * The column headers for this model. In addition to these headers, this model will dynamically create headers for
 | 
			
		||||
     * each additional student to be listed in the table.
 | 
			
		||||
     */
 | 
			
		||||
    private final String[] staticColumns = {"Number", "Member Count"};
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Dynamic columns which are generated depending on the teams.
 | 
			
		||||
     */
 | 
			
		||||
    private String[] columns = {};
 | 
			
		||||
 | 
			
		||||
    public StudentTeamTableModel() {
 | 
			
		||||
        this.studentTeamsList = new ArrayList<>();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public StudentTeamTableModel(List<StudentTeam> teams) {
 | 
			
		||||
        super();
 | 
			
		||||
        this.setStudentTeamsList(teams);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Sets a new list of student teams as the data for this list model.
 | 
			
		||||
     * @param newList A list of student teams to display in the table model.
 | 
			
		||||
     */
 | 
			
		||||
    public void setStudentTeamsList(List<StudentTeam> newList) {
 | 
			
		||||
        this.studentTeamsList = newList;
 | 
			
		||||
        int maxMembers = this.getMaxMemberCount();
 | 
			
		||||
        if (this.columns.length != maxMembers) {
 | 
			
		||||
            this.generateColumnNames(maxMembers);
 | 
			
		||||
            this.fireTableStructureChanged();
 | 
			
		||||
        }
 | 
			
		||||
        this.fireTableDataChanged();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the student team in a particular row.
 | 
			
		||||
     * @param row The row of the table.
 | 
			
		||||
     * @return The student team object at the specified row, or null if none is found.
 | 
			
		||||
     */
 | 
			
		||||
    public StudentTeam getStudentTeamAt(int row) {
 | 
			
		||||
        if (row >= 0 && row < this.studentTeamsList.size()) {
 | 
			
		||||
            return this.studentTeamsList.get(row);
 | 
			
		||||
        }
 | 
			
		||||
        return null;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getRowCount() {
 | 
			
		||||
        return this.studentTeamsList.size();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public int getColumnCount() {
 | 
			
		||||
        return this.columns.length;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getColumnName(int i) {
 | 
			
		||||
        if (i >= 0 && i < this.columns.length) {
 | 
			
		||||
            return this.columns[i];
 | 
			
		||||
        } else {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public Object getValueAt(int i, int i1) {
 | 
			
		||||
        StudentTeam team = this.getStudentTeamAt(i);
 | 
			
		||||
 | 
			
		||||
        switch (i1) {
 | 
			
		||||
            case 0:
 | 
			
		||||
                return team.getId();
 | 
			
		||||
            case 1:
 | 
			
		||||
                return team.memberCount();
 | 
			
		||||
            default:
 | 
			
		||||
                return this.getMemberInColumn(team, i1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets a particular student name in a column of the table. This is used for the staticColumns which show all members in
 | 
			
		||||
     * the team.
 | 
			
		||||
     * @param team The team for which to search for a student in.
 | 
			
		||||
     * @param column The table column.
 | 
			
		||||
     * @return The student detail name in a particular column, or null if none exists.
 | 
			
		||||
     */
 | 
			
		||||
    private String getMemberInColumn(StudentTeam team, int column) {
 | 
			
		||||
        Student[] students = team.getStudents();
 | 
			
		||||
        int index = column - this.staticColumns.length; // Subtract the number of static staticColumns.
 | 
			
		||||
        if (index >= 0 && index < students.length) {
 | 
			
		||||
            return students[index].getDetailName();
 | 
			
		||||
        } else {
 | 
			
		||||
            return null;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Gets the highest member count in the list of student teams.
 | 
			
		||||
     * @return The maximum member count of all teams.
 | 
			
		||||
     */
 | 
			
		||||
    private int getMaxMemberCount() {
 | 
			
		||||
        int max = 0;
 | 
			
		||||
        for (StudentTeam team : this.studentTeamsList) {
 | 
			
		||||
            if (team.memberCount() > max) {
 | 
			
		||||
                max = team.memberCount();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return max;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Generates column names, including some procedurally generated headers based on the number of members in the team.
 | 
			
		||||
     * @param maxMembers The highest number of members a team has.
 | 
			
		||||
     */
 | 
			
		||||
    private void generateColumnNames(int maxMembers) {
 | 
			
		||||
        this.columns = new String[this.staticColumns.length + maxMembers];
 | 
			
		||||
        this.columns[0] = this.staticColumns[0];
 | 
			
		||||
        this.columns[1] = this.staticColumns[1];
 | 
			
		||||
        for (int i = 0; i < maxMembers; i++) {
 | 
			
		||||
            this.columns[i + 2] = "Member " + (i + 1);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue