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 CollectionCourse
.
* @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 StudentRecord
s for this Course
.
* @return StudentRecord
s 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 CollectionStudentRecord
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 Assignment
s for this Course
.
* @return all Assignment
s 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 CollectionAssignmentCategory
'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 CollectionAssignmentSubmission
s 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 CollectionAssignmentSubmission
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 AssignmentGrade
s 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 CollectionSnapshot
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();
}