package course; import admin.*; import assignment.Assignment; import assignment.AssignmentCategory; import assignment.AssignmentGrade; import assignment.AssignmentSubmission; import user.student.StudentRecord; import java.util.Collection; // this is needed for Spest validation. import util.SpestConsts; /** * A Course consists of several fields necessary for class organization. The * RoleManager manages the access a user has to the class. The Name indicates * the offered name of a course within a catalog; this is * paired with a catalog Description of the course. There is also a GradeSchema * and LatePolicy associated with each course, both set by the professor. *

* CommandTarget is implemented by Course to perform commands on a course * spreadsheet, and GraderData is implemented so that a user may add, modify, * or remove grade data to a spreadsheet. */ public abstract class AbstractCourse implements Course { /** * Manages user role assignments. Used by CommandTarget to authorize users * who issue commands. */ public RoleManager roleManager; public Session session; /** * A GradeSchema contains a function to convert a raw score to a LetterGrade. * This can be set by a professor to customize a grading scale. GraderData * is implemented to set a letter grade based on the raw score. */ public GradeSchema gradeSchema; /** * A policy for calculating a grade penalty on late assignments. */ public LatePolicy latePolicy; /** * Name of the course. */ public String name; /** * A read only version of the course for students. */ public CourseAccessor snapShot; /** * Data model for the grade book spreadsheet. */ public Collection studentRecords; /** * All assignment categories in a course. */ public Collection assignmentCategories; /** * Accessor for the name of this Course. * @return name of this Course. * pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( ) post: name' == name */ public abstract String getName(); /** * Sets the name of this Course. * @param n desired name of this Course. *

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains(PERMISSION_UPDATE_COURSE_NAME ) post: name' == n */ public abstract void setName(String n); /** * Accessor fot the GradeSchema for this Course. * @return GradeSchema for this Course. *

* pre: session != null && session.currentUser != null && gradeSchema != null && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_COURSE_GRADE_SCHEMA) post: (gradeSchema' == gradeSchema) */ public abstract GradeSchema getGradeSchema(); /** * Sets the GradeSchema for this Course. * @param g desired GradeSchema. *

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.UPDATE_COURSE_GRADE_SCHEMA) post: gradeSchema' == g */ public abstract void setGradeSchema(GradeSchema g); /** * Accessor fot the LatePolicy for this Course. * @return LatePolicy for this Course. *

* pre: session != null && session.currentUser != null && latePolicy != null && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_COURSE_LATE_POLICY) post: (latePolicy' == latePolicy) */ public abstract LatePolicy getLatePolicy(); /** * Sets the LatePolicy for this Course. * @param l desired LatePolicy. * pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.UPDATE_COURSE_LATE_POLICY) post: latePolicy' == l */ public abstract void setLatePolicy(LatePolicy l); /** * Accessor fot the StudentRecords for this Course. * @return StudentRecords for this Course. *

* session != null && studentRecords != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_STUDENT_GRADE) && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_STUDENT_PERSONAL_DATA) post: studentRecords' == studentRecord */ public abstract Collection getStudentRecords(); /** * Accessor fot the StudentRecord for this Course. * @return StudentRecord for this Course. *

* pre: session != null && session.currentUser != null && studentRecords != null && (studentRecords.size() > 0) && (student.equals(session.currentUser) || (roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_STUDENT_GRADE) && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_STUDENT_PERSONAL_DATA))) post: studentRecord' == studentRecord */ public abstract StudentRecord getStudentRecord(User student); /** * Accessor fot the Assignments for this Course. * @return all Assignments from every * AssignmentCategory contained in this Course. *

pre: session != null && session.currentUser != null && assignmentCategories != null && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_ASSIGNMENT) post: */ public abstract Collection getAssignments(); /** * Accessor fot the AssignmentCategory's * for this Course. * * @return StudentRecord for this Course. pre: session != null && session.currentUser != null && assignmentCategories != null && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_ASSIGNMENT_CATEGORY) post: assignmentCategories' == assignmentCategories */ public abstract Collection getAssignmentCategories(); /** * Accessor for the AssignmentSubmissions for the given * Assignment. * @param assignment Assignment that the submissions are under. * @return submissions submitted under the Assignment. *

pre: session != null && session.currentUser != null && assignment != null && roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_ASSIGNMENT_SUBMISSION) post: // none */ public abstract Collection getAssignmentSubmissions( Assignment assignment); /** * Accessor for the AssignmentSubmission of the given * User and Assignment. * @param assignment assignment associated with the submission to get. * @param student student who submitted the submission. * @return AssignmentSubmission * for the specified assignment and the student. *

* pre: session != null && session.currentUser != null && (session.currentUser.equals(student) || roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_ASSIGNMENT_SUBMISSION)) post: // none */ public abstract AssignmentSubmission getAssignmentSubmission( Assignment assignment, User student); /** * Accessor for all AssignmentGrades for the specified * Assignment. * @param assignment assignment to access grades for. * @return All grades for the given assignment. * pre: session != null && session.currentUser != null && (roleManager.getPerms(session.currentUser).contains( Permission.ACCESS_ASSIGNMENT_GRADE)) post: // none */ public abstract Collection getAssignmentGrades( Assignment assignment); /** * Gets the grade the student earned on an assignment * @param assignment The assignment that you like to access the grade for * @param student The student user to access a grade for * @return The grade received on the given assignment by the given user * pre: session != null && session.currentUser != null && ( roleManager.getPerms(session.currentUser).contains(ACCESS_ASSIGNMENT_GRADE_PERMISSION) || ( session.currentUser.equals(student) && roleManager.getRoles(session.currentUser).contains(STUDENT_ROLE) ) ) post: // none yet */ public abstract AssignmentGrade getAssignmentGrade( Assignment assignment, User student); /** * Creates a Snapshot of the course. *

* pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.CREATE_COURSE_SNAPSHOT) post: roleManage.equals(snapShot.roleManager) && gradeSchema.equals(snapShot.gradeSchema) && latePolicy.equals(snapShot.latePolicy) && name.equals(snapShot.name) && studentRecords.equals(snapShot.studentRecords) && assignmentCategories.equals(snapShot.assignmentCategories) && roleManage'.equals(snapShot.roleManager) && gradeSchema'.equals(snapShot.gradeSchema) && latePolicy'.equals(snapShot.latePolicy) && name'.equals(snapShot.name) && studentRecords'.equals(snapShot.studentRecords) && assignmentCategories'.equals(snapShot.assignmentCategories) */ public abstract void createSnapshot(); /** * Adds an assignment to the course * @param assignment The assignment to add to this course * pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.ADD_ASSIGNMENT) post: */ public abstract void addAssignment(Assignment assignment); /** * Updates an specified Assignment. * @param assignment The Assignment to update. * pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.UPDATE_ASSIGNMENT) post: */ public abstract void updateAssignment(Assignment assignment); /** * Adds an assignment category to the course * @param assignmentCategory The assignment category to add to this course

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.ADD_ASSIGNMENT_CATEGORY) post: // none */ public abstract void addAssignmentCategory( AssignmentCategory assignmentCategory); /** * Updates the AssignmentCategory as the given one. * @param assignmentCategory new AssignmentCategory. *

* pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains( Permission.UPDATE_ASSIGNMENT_CATEGORY) post: // none */ public abstract void updateAssignmentCategory( AssignmentCategory assignmentCategory); /** * Adds the given AssignmentSubmission. * @param submission AssignmentSubmission to add. *

* pre: session != null && session.currentUser != null && ( session.currentUser.equals(submission.student) && roleManager.getRoles(session.currentUser).contains(STUDENT_ROLE) ) || roleManager.getPerms(session.currentUser).contains(PERMISSION_ADD_ASSIGNMENT_SUBMISSION) post: // none */ public abstract void addAssignmentSubmission( AssignmentSubmission submission); /** * Updates the AssignmentSubmission as the given one. * @param submission new AssignmentSubmission. *

* pre: session != null && session.currentUser != null && (session.currentUser.equals(submission.student) && if ( forall ( Role role; roleManager.getRoles(session.currentUser).contains(role); role == STUDENT_ROLE ) ) submission.student != null && submission.student.equals(session.currentUser) && roleManager.getPerms(session.currentUser).contains(PERMISSION_UPDATE_ASSIGNMENT_SUBMISSION) else roleManager.getPerms(session.currentUser).contains( Permission.UPDATE_ASSIGNMENT_SUBMISSION)) post: // none */ public abstract void updateAssignmentSubmission( AssignmentSubmission submission); /** * Updates the AssignmentGrade as the given one. * @param assignmentGrade new AssignmentGrade. *

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains(PERMISSION_UPDATE_ASSIGNMENT_GRADE) post: // none */ public abstract void updateAssignmentGrade( AssignmentGrade assignmentGrade); /** * Gets the current AbstractCourseSnapshot. * @return a snapshot for the current course * or null if no snapshot was created. *

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains(PERMISSION_ACCESS_COURSE_SNAPSHOT) post: snapShot == snapShot' */ public abstract AbstractCourseSnapshot getSnapshot(); /** * Adds a student to the student record this AbstractCourse * holds. * @param student student User to add to this course. *

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains(PERMISSION_ADD_STUDENT) post: studentRecords.size() == studentRecords'.size() - 1 && exists (AbstractStudentRecord rec; rec.getStudentUserInfo(student)) */ public abstract void addStudent(User student); /** * Removes a student from the student record this AbstractCourse * holds. * @param student student User to remove from this course. * @return true if successful, false otherwise. *

pre: session != null && session.currentUser != null && roleManager.getPerms(session.currentUser).contains(PERMISSION_REMOVE_STUDENT) post: studentRecords.size() == studentRecords'.size() + 1 && !exists (AbstractStudentRecord rec; rec.getStudentUserInfo(student)) */ public abstract boolean removeStudent(User student); /** * Updates the student roster. */ public abstract void updateStudentRoster(); }