private RuleResult createImpossibleRuleResult(
     final RestrictionDoneDegreeModule rule,
     final IDegreeModuleToEvaluate sourceDegreeModuleToEvaluate) {
   return RuleResult.createImpossible(
       sourceDegreeModuleToEvaluate.getDegreeModule(),
       "curricularRules.ruleExecutors.RestrictionDoneDegreeModuleExecutor.student.is.not.approved.to.precendenceDegreeModule",
       rule.getDegreeModuleToApplyRule().getName(),
       rule.getPrecedenceDegreeModule().getName());
 }
  @Override
  protected RuleResult executeEnrolmentWithRulesAndTemporaryEnrolment(
      final ICurricularRule curricularRule,
      final IDegreeModuleToEvaluate sourceDegreeModuleToEvaluate,
      final EnrolmentContext enrolmentContext) {

    final RestrictionDoneDegreeModule rule = (RestrictionDoneDegreeModule) curricularRule;
    final ExecutionSemester executionSemester = enrolmentContext.getExecutionPeriod();

    if (!canApplyRule(enrolmentContext, rule)) {
      return RuleResult.createNA(sourceDegreeModuleToEvaluate.getDegreeModule());
    }

    final CurricularCourse curricularCourse = rule.getPrecedenceDegreeModule();

    if (isEnrolling(enrolmentContext, curricularCourse)
        || isEnroled(enrolmentContext, curricularCourse, executionSemester)) {
      return RuleResult.createFalse(
          sourceDegreeModuleToEvaluate.getDegreeModule(),
          "curricularRules.ruleExecutors.RestrictionDoneDegreeModuleExecutor.cannot.enrol.simultaneously.to.degreeModule.and.precedenceDegreeModule",
          rule.getDegreeModuleToApplyRule().getName(),
          rule.getPrecedenceDegreeModule().getName());
    }

    if (isApproved(enrolmentContext, curricularCourse)) {
      return RuleResult.createTrue(sourceDegreeModuleToEvaluate.getDegreeModule());
    }

    if (hasEnrolmentWithEnroledState(
        enrolmentContext, curricularCourse, executionSemester.getPreviousExecutionPeriod())) {
      return RuleResult.createTrue(
          EnrolmentResultType.TEMPORARY, sourceDegreeModuleToEvaluate.getDegreeModule());
    }

    /*
     * CurricularCourse is not approved and is not enroled in previous
     * semester If DegreeModule is Enroled in current semester then
     * Enrolment must be impossible
     */
    if (isEnroled(enrolmentContext, rule.getDegreeModuleToApplyRule(), executionSemester)) {
      return createImpossibleRuleResult(rule, sourceDegreeModuleToEvaluate);
    }

    return createFalseRuleResult(rule, sourceDegreeModuleToEvaluate);
  }
  @Override
  protected boolean canBeEvaluated(
      ICurricularRule curricularRule,
      IDegreeModuleToEvaluate sourceDegreeModuleToEvaluate,
      EnrolmentContext enrolmentContext) {

    RestrictionDoneDegreeModule restrictionDoneDegreeModule =
        (RestrictionDoneDegreeModule) curricularRule;

    Collection<CycleCourseGroup> cycleCourseGroups =
        restrictionDoneDegreeModule.getPrecedenceDegreeModule().getParentCycleCourseGroups();
    for (CycleCourseGroup cycleCourseGroup : cycleCourseGroups) {
      CycleCurriculumGroup cycleCurriculumGroup =
          (CycleCurriculumGroup)
              enrolmentContext.getStudentCurricularPlan().findCurriculumGroupFor(cycleCourseGroup);
      if (cycleCurriculumGroup != null) {
        return true;
      }
    }

    return false;
  }