private void handleOldMember(LocalDateTime now, Member member, Member oldMember) { oldMember.updateWithDataFrom(member, now); // process subsystems for the old member Map<SubsystemId, Subsystem> unprocessedOldSubsystems = new HashMap<>(); for (Subsystem subsystem : oldMember.getAllSubsystems()) { unprocessedOldSubsystems.put(subsystem.createKey(), subsystem); } for (Subsystem subsystem : member.getAllSubsystems()) { Subsystem oldSubsystem = unprocessedOldSubsystems.get(subsystem.createKey()); if (oldSubsystem == null) { // brand new item, add it subsystem.getStatusInfo().setTimestampsForNew(now); subsystem.setMember(oldMember); oldMember.getAllSubsystems().add(subsystem); } else { oldSubsystem.getStatusInfo().setTimestampsForFetched(now); } unprocessedOldSubsystems.remove(subsystem.createKey()); } // remaining old subsystems - that were not included in member.subsystems - // are removed (if not already) for (Subsystem oldToRemove : unprocessedOldSubsystems.values()) { StatusInfo status = oldToRemove.getStatusInfo(); if (!status.isRemoved()) { status.setTimestampsForRemoved(now); } } }