// Path: src/main/java/com/oskopek/studyguide/constraint/Constraint.java
// @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,
//                 name = "CourseGroupCreditsPercentageConstraint"),
//         @JsonSubTypes.Type(value = CourseGroupCreditsSumConstraint.class,
//                 name = "CourseGroupCreditsSumConstraint"),
//         @JsonSubTypes.Type(value = CourseGroupFulfilledAllConstraint.class,
//                 name = "CourseGroupFulfilledAllConstraint"),
//         @JsonSubTypes.Type(value = GlobalCourseMaxFulfilledConstraint.class,
//                 name = "GlobalCourseMaxFulfilledConstraint"),
//         @JsonSubTypes.Type(value = GlobalCourseRepeatedEnrollmentConstraint.class,
//                 name = "GlobalCourseRepeatedEnrollmentConstraint"),
//         @JsonSubTypes.Type(value = GlobalCreditsSumConstraint.class,
//                 name = "GlobalCreditsSumConstraint"),
//         @JsonSubTypes.Type(value = GlobalCreditsSumUntilSemesterConstraint.class,
//                 name = "GlobalCreditsSumUntilSemesterConstraint"),
//         @JsonSubTypes.Type(value = GlobalLongStudyFeeConstraint.class,
//                 name = "GlobalLongStudyFeeConstraint")})
// public interface Constraint {
// 
//     /**
//      * The method should verify if the given constraint was broken, and if so,
//      * call the {@link #fireBrokenEvent(String, Course)} with the specific reason.
//      */
//     void validate();
// 
//     /**
//      * Used for firing a broken constraint event if the constraint is broken.
//      *
//      * @param message the reason why the constraint is broken
//      * @param changed the course that triggered the constraint breakage
//      */
//     void fireBrokenEvent(String message, Course changed);
// 
//     /**
//      * Used for firing a broken constraint event if the constraint is broken.
//      *
//      * @param message the reason why the constraint is broken
//      * @param changed the course enrollment that triggered the constraint breakage
//      */
//     void fireBrokenEvent(String message, CourseEnrollment changed);
// 
//     /**
//      * Used for firing a fixed constraint event if the constraint is fixed.
//      *
//      * @param originallyBroken the originally broken (now fixed) constraint
//      */
//     void fireFixedEvent(Constraint originallyBroken);
// }


import com.oskopek.studyguide.constraint.Constraint;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import java.util.ResourceBundle;
package com.oskopek.studyguide.constraint.event;



/**
 * Event with a message contained. Used for sending useful tooltip contents to the UI controllers do display to the
 * user.
 */
public abstract class StringMessageEvent {

    protected final transient ResourceBundle messages;

    private final String message;
// Path: src/main/java/com/oskopek/studyguide/constraint/Constraint.java
// @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,
//                 name = "CourseGroupCreditsPercentageConstraint"),
//         @JsonSubTypes.Type(value = CourseGroupCreditsSumConstraint.class,
//                 name = "CourseGroupCreditsSumConstraint"),
//         @JsonSubTypes.Type(value = CourseGroupFulfilledAllConstraint.class,
//                 name = "CourseGroupFulfilledAllConstraint"),
//         @JsonSubTypes.Type(value = GlobalCourseMaxFulfilledConstraint.class,
//                 name = "GlobalCourseMaxFulfilledConstraint"),
//         @JsonSubTypes.Type(value = GlobalCourseRepeatedEnrollmentConstraint.class,
//                 name = "GlobalCourseRepeatedEnrollmentConstraint"),
//         @JsonSubTypes.Type(value = GlobalCreditsSumConstraint.class,
//                 name = "GlobalCreditsSumConstraint"),
//         @JsonSubTypes.Type(value = GlobalCreditsSumUntilSemesterConstraint.class,
//                 name = "GlobalCreditsSumUntilSemesterConstraint"),
//         @JsonSubTypes.Type(value = GlobalLongStudyFeeConstraint.class,
//                 name = "GlobalLongStudyFeeConstraint")})
// public interface Constraint {
// 
//     /**
//      * The method should verify if the given constraint was broken, and if so,
//      * call the {@link #fireBrokenEvent(String, Course)} with the specific reason.
//      */
//     void validate();
// 
//     /**
//      * Used for firing a broken constraint event if the constraint is broken.
//      *
//      * @param message the reason why the constraint is broken
//      * @param changed the course that triggered the constraint breakage
//      */
//     void fireBrokenEvent(String message, Course changed);
// 
//     /**
//      * Used for firing a broken constraint event if the constraint is broken.
//      *
//      * @param message the reason why the constraint is broken
//      * @param changed the course enrollment that triggered the constraint breakage
//      */
//     void fireBrokenEvent(String message, CourseEnrollment changed);
// 
//     /**
//      * Used for firing a fixed constraint event if the constraint is fixed.
//      *
//      * @param originallyBroken the originally broken (now fixed) constraint
//      */
//     void fireFixedEvent(Constraint originallyBroken);
// }


// Path: src/main/java/com/oskopek/studyguide/constraint/event/StringMessageEvent.java
import com.oskopek.studyguide.constraint.Constraint;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import java.util.ResourceBundle;

package com.oskopek.studyguide.constraint.event;



/**
 * Event with a message contained. Used for sending useful tooltip contents to the UI controllers do display to the
 * user.
 */
public abstract class StringMessageEvent {

    protected final transient ResourceBundle messages;

    private final String message;
    private final Constraint brokenConstraint;