@Override @Transactional(rollbackFor = {Throwable.class}) public StatusInfo deleteTermCascaded(String termId, ContextInfo context) throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException { StatusInfo statusInfo = new StatusInfo(); // retrieve all the sub term ids of the give term List<String> subTermIds = getRelatedAtpIdsForParentAtpIdAndRelationType( termId, AtpServiceConstants.ATP_ATP_RELATION_INCLUDES_TYPE_KEY, context); if (subTermIds != null && !subTermIds.isEmpty()) { for (String subTermId : subTermIds) { deleteTermCascaded(subTermId, context); } } // delete the associated keydates deleteKeyDatesbyTermId(termId, context); // delete the associated exam period deleteExamPeriodByTermId(termId, context); // delete term/subterm acalService.deleteTerm(termId, context); statusInfo.setSuccess(Boolean.TRUE); return statusInfo; }
@Override @Transactional(rollbackFor = {Throwable.class}) public StatusInfo deleteCalendarCascaded(String academicCalendarId, ContextInfo context) throws DoesNotExistException, InvalidParameterException, MissingParameterException, OperationFailedException, PermissionDeniedException { AcademicCalendarInfo acalInfo = acalService.getAcademicCalendar(academicCalendarId, context); StatusInfo statusInfo = new StatusInfo(); // if the calendar in official state, not to delete anything if (StringUtils.equals(acalInfo.getStateKey(), AtpServiceConstants.ATP_OFFICIAL_STATE_KEY)) { throw new OperationFailedException( "Calendar of the state official can't be deleted - Calendar id:" + academicCalendarId); } List<String> termIds = getTermIdsForAcademicCalendar(academicCalendarId, context); if (termIds != null && !termIds.isEmpty()) { for (String termId : termIds) { deleteTermCascaded(termId, context); } } // delete calendar acalService.deleteAcademicCalendar(academicCalendarId, context); statusInfo.setSuccess(Boolean.TRUE); return statusInfo; }
@Override public StatusInfo makeTermOfficialCascaded(String termId, ContextInfo contextInfo) throws PermissionDeniedException, MissingParameterException, InvalidParameterException, OperationFailedException, DoesNotExistException { StatusInfo statusInfo = new StatusInfo(); // KSENROLL-7251 Implement a new servies process ot change the state of the Academic Calendar // from draft to official TermInfo termInfo = acalService.getTerm(termId, contextInfo); if (AtpServiceConstants.ATP_OFFICIAL_STATE_KEY.equals(termInfo.getStateKey())) { // If official, then should have already cascaded. statusInfo.setSuccess(Boolean.TRUE); return statusInfo; } // Assumes state propagation not wired in yet. Map<String, TermInfo> termIdToTermInfoProcessed = new HashMap<String, TermInfo>(); Map<String, TermInfo> termIdToTermInfoToBeProcessed = new HashMap<String, TermInfo>(); Set<String> parentTermIds = new HashSet<String>(); termIdToTermInfoToBeProcessed.put(termId, termInfo); // Put initial term while (!termIdToTermInfoToBeProcessed.keySet().isEmpty()) { String nextTermId = termIdToTermInfoToBeProcessed.keySet().iterator().next(); TermInfo nextTerm = termIdToTermInfoToBeProcessed.get(nextTermId); if (termIdToTermInfoProcessed.keySet().contains(nextTermId)) { // Skip over ones we've seen continue; } // Change the state acalService.changeTermState( nextTermId, AtpServiceConstants.ATP_OFFICIAL_STATE_KEY, contextInfo); // Change the state of the associated exam period changeExamPeriodStateByTermId( nextTermId, AtpServiceConstants.ATP_OFFICIAL_STATE_KEY, contextInfo); termIdToTermInfoProcessed.put(nextTermId, nextTerm); // Add to processed termIdToTermInfoToBeProcessed.remove(nextTermId); // No longer needs processing, so remove // Now visit all parents List<TermInfo> terms = acalService.getContainingTerms(nextTermId, contextInfo); if (terms.isEmpty()) { // Assume only parent terms are connected to calendars // Given a tree like structure, there should only ever be one parentTermId in the list parentTermIds.add(nextTermId); } else { for (TermInfo term : terms) { if (!termIdToTermInfoProcessed.keySet().contains(term.getId()) && AtpServiceConstants.ATP_DRAFT_STATE_KEY.equals(term.getStateKey())) { // Only add if still draft and not yet processed termIdToTermInfoToBeProcessed.put(term.getId(), term); } } } } // Access calendar Map<String, AcademicCalendarInfo> idToCalendar = new HashMap<String, AcademicCalendarInfo>(); for (String parentTermId : parentTermIds) { List<AcademicCalendarInfo> cals = acalService.getAcademicCalendarsForTerm(parentTermId, contextInfo); for (AcademicCalendarInfo cal : cals) { idToCalendar.put(cal.getId(), cal); } } // Now iterate over all calendars and make them official for (Map.Entry<String, AcademicCalendarInfo> entry : idToCalendar.entrySet()) { if (AtpServiceConstants.ATP_DRAFT_STATE_KEY.equals(entry.getValue().getStateKey())) { // Only set it if it's still draft acalService.changeAcademicCalendarState( entry.getKey(), AtpServiceConstants.ATP_OFFICIAL_STATE_KEY, contextInfo); } } statusInfo.setSuccess(Boolean.TRUE); return statusInfo; }