@Override public void saveServices(SubsystemId subsystemId, Collection<Service> services) { assert subsystemId != null; Subsystem oldSubsystem = subsystemRepository.findActiveByNaturalKey( subsystemId.getXRoadInstance(), subsystemId.getMemberClass(), subsystemId.getMemberCode(), subsystemId.getSubsystemCode()); if (oldSubsystem == null) { throw new IllegalStateException("subsystem " + subsystemId + " not found!"); } LocalDateTime now = LocalDateTime.now(); Map<ServiceId, Service> unprocessedOldServices = new HashMap<>(); oldSubsystem .getAllServices() .stream() .forEach(s -> unprocessedOldServices.put(s.createKey(), s)); for (Service service : services) { Service oldService = unprocessedOldServices.get(service.createKey()); if (oldService == null) { // brand new item, add it service.getStatusInfo().setTimestampsForNew(now); service.setSubsystem(oldSubsystem); oldSubsystem.getAllServices().add(service); } else { oldService.getStatusInfo().setTimestampsForFetched(now); } unprocessedOldServices.remove(service.createKey()); } // now unprocessedOldServices should all be removed (either already removed, or will be now) for (Service oldToRemove : unprocessedOldServices.values()) { StatusInfo status = oldToRemove.getStatusInfo(); if (!status.isRemoved()) { status.setTimestampsForRemoved(now); } } }