package com.mossle.user.sync; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public abstract class AbstractUserSynchronizer { public abstract List<UserSyncDTO> getLocalUsers(); public abstract List<UserSyncDTO> getRemoteUsers(); public abstract void doSync(List<UserSyncDTO> removes, List<UserSyncDTO> inserts, List<UserSyncDTO> updates); public void execute() { List<UserSyncDTO> localUsers = this.getLocalUsers(); List<UserSyncDTO> remoteUsers = this.getRemoteUsers(); Map<String, UserSyncDTO> localUserMap = this .convertListToMap(localUsers); Map<String, UserSyncDTO> remoteUserMap = this .convertListToMap(remoteUsers); List<UserSyncDTO> inserts = new ArrayList<UserSyncDTO>(); List<UserSyncDTO> updates = new ArrayList<UserSyncDTO>(); List<UserSyncDTO> removes = new ArrayList<UserSyncDTO>(); for (UserSyncDTO userSyncDto : remoteUsers) { if (localUserMap.containsKey(userSyncDto.getId())) { UserSyncDTO localUser = localUserMap.get(userSyncDto.getId()); if (localUser.hasModified(userSyncDto)) { updates.add(userSyncDto); } } else { inserts.add(userSyncDto); } } for (UserSyncDTO userSyncDto : localUsers) { if (!remoteUserMap.containsKey(userSyncDto.getId())) { removes.add(userSyncDto); } } this.doSync(removes, inserts, updates); } public Map<String, UserSyncDTO> convertListToMap( List<UserSyncDTO> userSyncDtos) { Map<String, UserSyncDTO> userMap = new HashMap<String, UserSyncDTO>(); for (UserSyncDTO userSyncDto : userSyncDtos) { userMap.put(userSyncDto.getId(), userSyncDto); } return userMap; } }