Skip to content

Commit

Permalink
Fixes #9, added constraint
Browse files Browse the repository at this point in the history
  • Loading branch information
oskopek committed May 25, 2016
1 parent 2b87c48 commit 2830e74
Show file tree
Hide file tree
Showing 12 changed files with 158 additions and 6 deletions.
2 changes: 1 addition & 1 deletion config/checkstyle/studyguide_style.xml
Expand Up @@ -57,7 +57,7 @@
</module>
<module name="MethodLength"/>
<module name="ParameterNumber">
<property name="max" value="8"/>
<property name="max" value="10"/>
</module>
<!-- Checks for whitespace -->
<!-- See http://checkstyle.sf.net/config_whitespace.html -->
Expand Down
Expand Up @@ -11,6 +11,8 @@
@JsonTypeInfo(include = JsonTypeInfo.As.WRAPPER_OBJECT, use = JsonTypeInfo.Id.NAME)
@JsonSubTypes({@JsonSubTypes.Type(value = CourseEnrollmentCorequisiteConstraint.class,
name = "CourseEnrollmentCorequisiteConstraint"),
@JsonSubTypes.Type(value = CourseEnrollmentEnrolledInConstraint.class,
name = "CourseEnrollmentEnrolledInConstraint"),
@JsonSubTypes.Type(value = CourseEnrollmentPrerequisiteConstraint.class,
name = "CourseEnrollmentPrerequisiteConstraint"),
@JsonSubTypes.Type(value = CourseGroupCreditsPercentageConstraint.class,
Expand Down
@@ -0,0 +1,85 @@
package com.oskopek.studyguide.constraint;

import com.oskopek.studyguide.constraint.event.StringMessageEvent;
import com.oskopek.studyguide.model.CourseEnrollment;
import com.oskopek.studyguide.model.Semester;
import com.oskopek.studyguide.model.courses.EnrollableIn;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Checks if the course is enrolled only in the allowed semester.
*
* @see EnrollableIn
*/
public class CourseEnrollmentEnrolledInConstraint extends CourseEnrollmentConstraint {

private final String message = "constraint.enrolledInInvalid";

private final transient Logger logger = LoggerFactory.getLogger(getClass());

/**
* Private default constructor, needed by CDI.
*/
protected CourseEnrollmentEnrolledInConstraint() {
// needed for CDI
}

/**
* Default constructor.
*
* @param enrollment the enrollment to check
*/
public CourseEnrollmentEnrolledInConstraint(CourseEnrollment enrollment) {
super(enrollment);
}

@Override
public void validate() {
EnrollableIn enrollableIn = getCourseEnrollment().getCourse().getEnrollableIn();
if (EnrollableIn.BOTH.equals(enrollableIn)) {
fireFixedEvent(this);
return;
}
Semester semester = getCourseEnrollment().getSemester();
int semesterIndex = getSemesterPlan().getSemesterList().indexOf(semester);
if (semesterIndex < 0) {
throw new IllegalStateException("Semester " + semester + " not found in semester plan " + semesterPlan);
}

semesterIndex += 1; // count from one
switch (enrollableIn) {
case BOTH:
fireFixedEvent(this);
return;
case SUMMER:
if (semesterIndex % 2 == 0) {
fireFixedEvent(this);
return;
}
break;
case WINTER:
if (semesterIndex % 2 == 1) {
fireFixedEvent(this);
return;
}
break;
default:
throw new IllegalStateException("Unknown enrollableIn: " + enrollableIn);
}
fireBrokenEvent(generateMessage(semesterIndex % 2 == 1 ? EnrollableIn.WINTER : EnrollableIn.SUMMER,
enrollableIn), getCourseEnrollment());
}

/**
* Generates a message from the given parameters (localized). Used for populating the message of
* {@link StringMessageEvent}s (usually upon breaking a constraint).
*
* @param enrolledIn the type of semester the course is currently enrolled in
* @param enrollableIn the allowed type
* @return the String to use as a message, localized
*/
protected String generateMessage(EnrollableIn enrolledIn, EnrollableIn enrollableIn) {
return String.format(messages.getString(message), enrolledIn, enrollableIn);
}
}
Expand Up @@ -88,9 +88,9 @@ public EnrollableIn fromString(String string) {
}

{
valueMap.put(EnrollableIn.BOTH, messages.getString("semester.bothLong"));
valueMap.put(EnrollableIn.SUMMER, messages.getString("semester.summerLong"));
valueMap.put(EnrollableIn.WINTER, messages.getString("semester.winterLong"));
valueMap.put(EnrollableIn.BOTH, EnrollableIn.BOTH.print(messages));
valueMap.put(EnrollableIn.SUMMER, EnrollableIn.SUMMER.print(messages));
valueMap.put(EnrollableIn.WINTER, EnrollableIn.WINTER.print(messages));
}
});
teacherNamesProperty = new StringListStringProperty();
Expand Down
Expand Up @@ -151,11 +151,17 @@ public void addAllCourseEnrollmentConstraints(CourseEnrollment courseEnrollment,
CourseEnrollmentConstraint c1 = BeanManagerUtil.createBeanInstance(CourseEnrollmentCorequisiteConstraint.class);
c1.setCourseEnrollment(courseEnrollment);
c1.setSemesterPlan(semesterPlan);

CourseEnrollmentConstraint c2 = BeanManagerUtil
.createBeanInstance(CourseEnrollmentPrerequisiteConstraint.class);
c2.setCourseEnrollment(courseEnrollment);
c2.setSemesterPlan(semesterPlan);
courseEnrollmentConstraintList.addAll(c1, c2);

CourseEnrollmentConstraint c3 = BeanManagerUtil.createBeanInstance(CourseEnrollmentEnrolledInConstraint.class);
c3.setCourseEnrollment(courseEnrollment);
c3.setSemesterPlan(semesterPlan);

courseEnrollmentConstraintList.addAll(c1, c2, c3);
}

/**
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/com/oskopek/studyguide/model/courses/Course.java
Expand Up @@ -158,10 +158,20 @@ public void setCredits(Credits credits) {
this.credits.set(credits);
}

/**
* The type of semester this course is enrollable in.
*
* @return the enrollable in type
*/
public EnrollableIn getEnrollableIn() {
return enrollableIn.get();
}

/**
* Setter into {@link #enrollableInProperty()}.
*
* @param enrollableIn the enrollable in semester type
*/
public void setEnrollableIn(EnrollableIn enrollableIn) {
this.enrollableIn.set(enrollableIn);
}
Expand Down Expand Up @@ -368,6 +378,11 @@ public ObjectProperty<Credits> creditsProperty() {
return credits;
}

/**
* The JavaFX property for {@link #getEnrollableIn()}.
*
* @return the property of {@link #getEnrollableIn()}
*/
public ObjectProperty<EnrollableIn> enrollableInProperty() {
return enrollableIn;
}
Expand Down
@@ -1,5 +1,44 @@
package com.oskopek.studyguide.model.courses;

import java.util.ResourceBundle;

/**
* Semester types for constraining course enrollments.
*/
public enum EnrollableIn {
WINTER, SUMMER, BOTH

/**
* Winter/fall semester. Usually semesters with a semesterIndex % 2 == 1 (counted from 1).
*/
WINTER,

/**
* Summer/spring semester. Usually semesters with a semesterIndex % 2 == 0 (counted from 1).
*/
SUMMER,

/**
* Both of the above (covers all semesters).
*/
BOTH;

/**
* Print a localized string representing the given value.
*
* @param messages the resource bundle to use
* @return localized string representation
* @throws IllegalStateException if this is not a known enrollable in type
*/
public String print(ResourceBundle messages) {
switch (this) {
case WINTER:
return messages.getString("semester.winterLong");
case SUMMER:
return messages.getString("semester.summerLong");
case BOTH:
return messages.getString("semester.bothLong");
default:
throw new IllegalStateException("No known enrollable in: " + this);
}
}
}
Expand Up @@ -58,3 +58,4 @@ course.enrollableIn=Enrollable in
semester.winterLong=Fall
semester.summerLong=Spring
semester.bothLong=Both
constraint.enrolledInInvalid=Enrolled in "%s" (only allowed in "%s")
Expand Up @@ -58,3 +58,4 @@ course.enrollableIn=Zapsateln\u00E9
semester.winterLong=zimn\u00ED
semester.summerLong=letn\u00ED
semester.bothLong=oba
constraint.enrolledInInvalid=Zapsan\u00E9 v "%s" (vyu\u010Dov\u00E1no jen v "%s")
Expand Up @@ -58,3 +58,4 @@ course.enrollableIn=Einschreibbar
semester.winterLong=Winter
semester.summerLong=Sommer
semester.bothLong=Beide
constraint.enrolledInInvalid=Eingeschrieben in "%s" (nur m\u00F6glich in "%s")
Expand Up @@ -58,3 +58,4 @@ course.enrollableIn=Enrollable in
semester.winterLong=Fall
semester.summerLong=Spring
semester.bothLong=Both
constraint.enrolledInInvalid=Enrolled in "%s" (only allowed in "%s")
Expand Up @@ -58,3 +58,4 @@ course.enrollableIn=Zap\u00EDsate\u013En\u00E9
semester.winterLong=zimn\u00FD
semester.summerLong=letn\u00FD
semester.bothLong=oba
constraint.enrolledInInvalid=Zap\u00EDsan\u00E9 v "%s" (vyu\u010Dovan\u00E9 len v "%s")

0 comments on commit 2830e74

Please sign in to comment.