/** * Merges to user lists. New users will be added and old users will be updated. * * @param aOriginal Original {@link List} of {@link User}. * @param aChanges New {@link List} of {@link User} to merge into original list. * @return Merges {@link List} of {@link User}. */ public static List<User> merge(List<User> aOriginal, List<User> aChanges) { List<User> vUsers = new ArrayList<User>(); // delete original users not in changes, not manually added and without letters for (Iterator<User> vIterator = aOriginal.iterator(); vIterator.hasNext(); ) { User vUser = vIterator.next(); List<User> vUsersSelected = UserListUtils.selectUnique(aChanges, vUser.getName(), vUser.getBirthdate()); if (vUsersSelected.size() == 0 && !vUser.isManualAdded()) { User vUserDeleted = new User(vUser); vUsers.add(vUserDeleted.setName(null)); vIterator.remove(); } } // update and add user data List<User> vUnassignedUsers = new ArrayList<User>(); // list of users with more unique // users in original list for (Iterator<User> vIterator = aChanges.iterator(); vIterator.hasNext(); ) { User vUser = vIterator.next(); List<User> vUsersSelected = UserListUtils.selectUnique(aOriginal, vUser.getName(), vUser.getBirthdate()); if (vUsersSelected.size() == 1) { // one unique user found > update user User vUserSelected = new User(vUsersSelected.get(0)).update(vUser); vUsers.add(vUserSelected); vIterator.remove(); } else if (vUsersSelected.size() == 0) { // no user found > check if to find without birthdate List<User> vUsersByName = UserListUtils.selectUnique(aOriginal, vUser.getName(), ""); if (vUsersByName.size() == 1) { // found user > update User vUserSelected = new User(vUsersByName.get(0)).update(vUser); vUsers.add(vUserSelected); } else { // not found by name > add user User vNewUser = new User(vUser); vUsers.add(vNewUser); vIterator.remove(); } } else if (vUnassignedUsers.size() > 1) { // more than one unique user found > add to list for further processing vUnassignedUsers.add(vUser); vIterator.remove(); } } // process unassigned users // TODO logger.warn("Unassigned users " + vUnassignedUsers.size()); return vUsers; }