@Override
 protected Object get(String id, ContextInfo contextInfo) throws Exception {
   // TODO Just Major Discipline for now - need to check for other types later
   MajorDisciplineInfo returnDTO;
   if (null == id || id.length() == 0) {
     returnDTO = new MajorDisciplineInfo();
     returnDTO.setTypeKey(ProgramClientConstants.MAJOR_PROGRAM);
     returnDTO.setStateKey(DtoConstants.STATE_DRAFT);
     returnDTO.setCredentialProgramId(getCredentialId());
   } else {
     returnDTO = programService.getMajorDiscipline(id, contextInfo);
   }
   return returnDTO;
 }
  @Override
  protected Object save(Object dto, Map<String, Object> properties, ContextInfo contextInfo)
      throws Exception {
    if (dto instanceof MajorDisciplineInfo) {
      MajorDisciplineInfo mdInfo = (MajorDisciplineInfo) dto;
      if (mdInfo.getId() == null && mdInfo.getVersion() != null) {

        String majorVersionIndId = mdInfo.getVersion().getVersionIndId();

        // Get the current Major Dicipline from the service
        VersionDisplayInfo mdVersionInfo =
            programService.getCurrentVersion(
                ProgramServiceConstants.PROGRAM_NAMESPACE_MAJOR_DISCIPLINE_URI,
                majorVersionIndId,
                ContextUtils.getContextInfo());
        mdInfo =
            programService.getMajorDiscipline(mdVersionInfo.getId(), ContextUtils.getContextInfo());

        // set the prev start term to be the most recent of the major and all variations
        AtpInfo latestStartAtp = atpService.getAtp(mdInfo.getStartTerm(), contextInfo);
        for (ProgramVariationInfo variation : mdInfo.getVariations()) {
          AtpInfo variationAtp = atpService.getAtp(variation.getStartTerm(), contextInfo);
          if (variationAtp != null
              && variationAtp.getStartDate() != null
              && variationAtp.getStartDate().compareTo(latestStartAtp.getStartDate()) > 0) {
            latestStartAtp = variationAtp;
          }
        }

        // Save the start and end terms from the old version and put into filter properties
        String startTerm = latestStartAtp.getId();
        String endTerm = mdInfo.getEndTerm();
        String endProgramEntryTerm = mdInfo.getEndProgramEntryTerm();
        String endInstAdmitTerm =
            mdInfo.getAttributeValue(ProgramConstants.END_INSTITUTIONAL_ADMIT_TERM);

        //
        Map<String, String> proposalAttributes = new HashMap<String, String>();
        if (startTerm != null) proposalAttributes.put("prevStartTerm", startTerm);
        if (endTerm != null) proposalAttributes.put("prevEndTerm", endTerm);
        if (endProgramEntryTerm != null)
          proposalAttributes.put("prevEndProgramEntryTerm", endProgramEntryTerm);
        if (endInstAdmitTerm != null)
          proposalAttributes.put("prevEndInstAdmitTerm", endInstAdmitTerm);
        properties.put(ProposalWorkflowFilter.PROPOSAL_ATTRIBUTES, proposalAttributes);

        mdInfo =
            programService.createNewMajorDisciplineVersion(
                majorVersionIndId, "New major discipline version", ContextUtils.getContextInfo());
      } else if (mdInfo.getId() == null) {
        mdInfo =
            programService.createMajorDiscipline(
                mdInfo.getId(), mdInfo, ContextUtils.getContextInfo());
      } else {
        mdInfo = programService.updateMajorDiscipline(null, mdInfo, ContextUtils.getContextInfo());
      }
      return mdInfo;
    } else {
      throw new InvalidParameterException(
          "Only persistence of MajorDiscipline is supported by this DataService implementation.");
    }
  }
 @Override
 protected List<ValidationResultInfo> validate(Object dto, ContextInfo contextInfo)
     throws Exception {
   return programService.validateMajorDiscipline(
       "OBJECT", (MajorDisciplineInfo) dto, ContextUtils.getContextInfo());
 }