private void saveClasses(List<ClassScheduleDataHolder> dataHolderList) {
    for (ClassScheduleDataHolder dataHolder : dataHolderList) {
      UnisantaApplication.Log_i("Verificando horário de: " + dataHolder.subjectName);

      Subject subject =
          subjectRepository.findByOriginalIdAndSchoolYear(
              Long.parseLong(dataHolder.id), actualSchoolYear);

      if (subject != null) {
        subject.setNickName(dataHolder.subjectName.replace("- DP", "").trim());
        subjectRepository.saveSubject(subject);

        Time start = new Time(dataHolder.startTime);
        Time end = new Time(dataHolder.endTime);
        int weekDay = getWeekDay(dataHolder.weekDay);

        ClassSchedule classSchedule =
            classesRepository.findBySubjectAndDateTime(subject, weekDay, start, end);

        // Não existe, preciso criar e salvar
        if (classSchedule == null) {
          classSchedule =
              ClassScheduleFactory.createClassSchedule(
                  weekDay, dataHolder.classroom, subject, start, end, actualSchoolYear);

          subject.setDP(dataHolder.isDP);

          subjectRepository.saveSubject(subject);
          classesRepository.saveClassSchedule(classSchedule);
        }
      } else {
        UnisantaApplication.Log_e("Não encontrei a matéria de: " + dataHolder.subjectName);
      }
    }
  }
  public void sync() throws SyncFailedException {
    try {
      String html = classesPage.getHtml();
      classesPage.checkDataAvailable(html);

      int pos = SyncDataHelper.getIndexAndGoToEnd("Letivo:", html);
      int endPos = SyncDataHelper.getIndexOf("<", html, pos);

      actualSchoolYear = new SchoolYear(html.substring(pos, endPos).trim());
      if (actualSchoolYear.isBefore(SchoolYear.getCurrent())) {
        throw new UnavailableDataException(
            "Você não tem aulas no semestre corrente",
            classesPage.getUrl(),
            classesPage.getPageName());
      }

      pos = SyncDataHelper.getIndexAndGoToEnd("table id=\"horarios\"", html);
      endPos = SyncDataHelper.getIndexOf("</table>", html);

      html = html.substring(pos, endPos);

      List<ClassScheduleDataHolder> dataHolderList = new ArrayList<>();

      endPos = 0;
      do {
        ClassScheduleDataHolder dataHolder = new ClassScheduleDataHolder();

        // Id
        pos = SyncDataHelper.getIndexAndGoToEnd("data-id=\"", html, endPos);
        endPos = SyncDataHelper.getIndexOf("\"", html, pos);
        dataHolder.id = html.substring(pos, endPos);
        UnisantaApplication.Log_i("ID: " + dataHolder.id);

        // Dia da semana
        pos = SyncDataHelper.getIndexAndGoToEnd("strong>", html, endPos);
        endPos = SyncDataHelper.getIndexOf("<", html, pos);
        dataHolder.weekDay = html.substring(pos, endPos);
        UnisantaApplication.Log_i(
            "Dia da semana encontrado: "
                + dataHolder.weekDay
                + " | na posição "
                + pos
                + " até "
                + endPos);

        // Horário
        pos = SyncDataHelper.getIndexAndGoToEnd("<td class=\"colunaDuracaHorario", html, endPos);
        pos = SyncDataHelper.getIndexOf(">", html, pos);
        endPos = SyncDataHelper.getIndexOf("<", html, pos);

        String horario = html.substring(pos, endPos);
        int aux = horario.indexOf("-");
        dataHolder.startTime = horario.substring(1, aux).trim();
        dataHolder.endTime = horario.substring(aux + 1, horario.length()).trim();
        UnisantaApplication.Log_i(
            "A aula começa às: " + dataHolder.startTime + " e acaba às " + dataHolder.endTime);

        // Matéria
        pos = SyncDataHelper.getIndexAndGoToEnd("alinhamentoEsquerda", html, endPos);
        pos = SyncDataHelper.getIndexOf(">", html, pos) + 3;
        endPos = SyncDataHelper.getIndexOf("<", html, pos);

        dataHolder.subjectName =
            SyncDataHelper.fixSpecialCharacters(html.substring(pos, endPos).trim());
        dataHolder.isDP = dataHolder.subjectName.contains("- DP");
        UnisantaApplication.Log_i("Matéria encontrada: " + dataHolder.subjectName);

        // Professor
        pos = SyncDataHelper.getIndexAndGoToEnd("alinhamentoEsquerda", html, endPos);
        pos = SyncDataHelper.getIndexOf(">", html, pos) + 1;
        endPos = SyncDataHelper.getIndexOf("<", html, pos);

        dataHolder.teacherName = SyncDataHelper.fixSpecialCharacters(html.substring(pos, endPos));
        UnisantaApplication.Log_i("Professor encontrado: " + dataHolder.teacherName);

        // Sala
        pos = SyncDataHelper.getIndexAndGoToEnd("colunaSalaHorario", html, endPos);
        pos = SyncDataHelper.getIndexOf(">", html, pos) + 1;
        endPos = SyncDataHelper.getIndexOf("<", html, pos);
        dataHolder.classroom = html.substring(pos, endPos);
        UnisantaApplication.Log_i("Sala de aula encontrada: " + dataHolder.classroom);

        dataHolderList.add(dataHolder);
      } while (html.indexOf("<tr", endPos) > -1);

      saveClasses(dataHolderList);

    } catch (StringNotFoundException e) {
      throw new MissingTagException(classesPage.getUrl(), classesPage.getPageName(), e.getString());
    } catch (UnavailableDataException e) {
      throw e;
    } catch (Exception e) {
      throw new SyncFailedException(e, classesPage.getUrl(), classesPage.getPageName());
    }
  }
 @Override
 public String getMessage() {
   return UnisantaApplication.getInstance().getString(R.string.class_schedule);
 }