}
private static void copyAttends(final ExecutionCourse executionCourseFrom, final ExecutionCourse executionCourseTo)
throws FenixServiceException {
for (Attends attends : executionCourseFrom.getAttendsSet()) {
final Attends otherAttends = executionCourseTo.getAttendsByStudent(attends.getRegistration());
if (otherAttends == null) {
attends.setDisciplinaExecucao(executionCourseTo);
} else {
if (attends.getEnrolment() != null && otherAttends.getEnrolment() == null) {
otherAttends.setEnrolment(attends.getEnrolment());
} else if (otherAttends.getEnrolment() != null && attends.getEnrolment() == null) {
// do nothing.
} else if (otherAttends.getEnrolment() != null && attends.getEnrolment() != null) {
throw new FenixServiceException("Unable to merge execution courses. Registration "
+ attends.getRegistration().getNumber() + " has an enrolment in both.");
}
for (Mark mark : attends.getAssociatedMarksSet()) {
otherAttends.addAssociatedMarks(mark);
}
for (StudentGroup group : attends.getAllStudentGroups()) {
otherAttends.addStudentGroups(group);
}
attends.delete();
}
}
final Iterator<Attends> associatedAttendsFromDestination = executionCourseTo.getAttendsSet().iterator();
final Map<String, Attends> alreadyAttendingDestination = new HashMap<String, Attends>();
while (associatedAttendsFromDestination.hasNext()) {
Attends attend = associatedAttendsFromDestination.next();
Registration registration = attend.getRegistration();
if (registration == null) {
// !!! Yup it's true this actually happens!!!
attend.delete();
} else {
Integer number = registration.getNumber();
alreadyAttendingDestination.put(number.toString(), attend);
}
}
final List<Attends> associatedAttendsFromSource = new ArrayList<Attends>();
associatedAttendsFromSource.addAll(executionCourseFrom.getAttendsSet());
for (final Attends attend : associatedAttendsFromSource) {
if (!alreadyAttendingDestination.containsKey(attend.getRegistration().getNumber().toString())) {
attend.setDisciplinaExecucao(executionCourseTo);
}
}
}