change selectBest() logic to favor org name that is in the index.
Project: http://git-wip-us.apache.org/repos/asf/usergrid/repo Commit: http://git-wip-us.apache.org/repos/asf/usergrid/commit/a1b66850 Tree: http://git-wip-us.apache.org/repos/asf/usergrid/tree/a1b66850 Diff: http://git-wip-us.apache.org/repos/asf/usergrid/diff/a1b66850 Branch: refs/heads/1.x Commit: a1b6685080f8e23d8e31b2d3b46ea53916d0607a Parents: 0316b57 Author: Dave Johnson <[email protected]> Authored: Wed Jan 13 09:31:06 2016 -0500 Committer: Dave Johnson <[email protected]> Committed: Wed Jan 13 09:31:06 2016 -0500 ---------------------------------------------------------------------- .../usergrid/tools/DuplicateAdminRepair.java | 63 +++++++++++--------- .../usergrid/tools/DuplicateOrgRepair.java | 19 +----- .../apache/usergrid/tools/UserOrgInterface.java | 21 ++++++- .../apache/usergrid/tools/UserOrgManager.java | 21 ++++++- .../usergrid/tools/MockUserOrgManager.java | 15 +++++ 5 files changed, 92 insertions(+), 47 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java ---------------------------------------------------------------------- diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java index 9909918..79e403d 100644 --- a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java +++ b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateAdminRepair.java @@ -154,42 +154,41 @@ public class DuplicateAdminRepair extends ToolBase { } for ( String email : emails.keySet() ) { + + // go through a set of users with duplicate emails + Collection<OrgUser> usersWithDupEmails = emails.get( email ); - Collection<OrgUser> users = emails.get( email ); - - if ( users.size() > 1 ) { - // get the admin the same way as the rest tier, this way the OTHER - // admins will be removed - OrgUser targetUser = manager.lookupOrgUserByEmail( email ); + if ( usersWithDupEmails.size() > 1 ) { + + // get the user that is in the users-by-email index, it's the keeper + OrgUser indexedUser = manager.lookupOrgUserByEmail( email ); - if ( targetUser == null ) { + if ( indexedUser == null ) { - List<OrgUser> tempUsers = new ArrayList<OrgUser>( users ); + // no user is indexed with that email, pick oldest as keeper + List<OrgUser> tempUsers = new ArrayList<OrgUser>( usersWithDupEmails ); Collections.sort( tempUsers ); + OrgUser oldestOfLot = tempUsers.get( 0 ); - OrgUser toLoad = tempUsers.get( 0 ); - - logger.warn( "Could not load target user by email {}, loading by UUID {} instead", email, toLoad ); - targetUser = toLoad; - - users.remove( toLoad ); + logger.warn( "Could not load target user by email {}, loading by UUID {} instead", email, oldestOfLot ); + indexedUser = oldestOfLot; } - users.remove( targetUser ); - - logger.warn( "Found multiple admins with the email {}. Retaining uuid {}", email, targetUser.getId() ); + logger.warn( "Found multiple admins with the email {}. Retaining uuid {}", email, indexedUser.getId() ); - for ( OrgUser orgUser : users ) { - mergeAdmins( orgUser, targetUser ); + for ( OrgUser orgUser : usersWithDupEmails ) { + if ( !orgUser.getId().equals( indexedUser.getId() )) { + mergeAdmins( orgUser, indexedUser ); + } } // force the index update after all other admins have been merged if ( dryRun ) { logger.info("Would force re-index of 'keeper' user {}:{}", - targetUser.getUsername(), targetUser.getId()); + indexedUser.getUsername(), indexedUser.getId()); } else { - logger.info( "Forcing re-index of admin with email {} and id {}", email, targetUser.getId()); - manager.updateOrgUser( targetUser ); + logger.info( "Forcing re-index of admin with email {} and id {}", email, indexedUser.getId()); + manager.updateOrgUser( indexedUser ); } } } @@ -257,30 +256,36 @@ public class DuplicateAdminRepair extends ToolBase { /** Merge the source admin to the target admin by copying oranizations. Then deletes the source admin */ private void mergeAdmins( OrgUser sourceUser, OrgUser targetUser ) throws Exception { + + logger.info("---> Merging user {}:{} into {}:{}", new Object[] { + sourceUser.getEmail(), sourceUser.getId(), targetUser.getEmail(), targetUser.getId() + } ); Set<Org> sourceOrgs = manager.getUsersOrgs( sourceUser ); for ( Org org : sourceOrgs ) { if ( dryRun ) { - logger.info("Would add org {}:{} to user {}:{}", new Object[] { - org.getName(), org.getId(), targetUser.getUsername(), targetUser.getId(), }); + logger.info( "Would add organization {}:{} to admin with email {} and id {}", + new Object[] { org.getName(), org.getId(), targetUser.getEmail(), targetUser.getId() } ); } else { logger.info( "Adding organization {}:{} to admin with email {} and id {}", - new Object[] { org.getName(), org.getId(), targetUser.getEmail(), targetUser.getId() } ); + new Object[] { org.getName(), org.getId(), targetUser.getEmail(), targetUser.getId() } ); - // copy it over to the target admin + // add targetUser to sourceUser's org manager.addUserToOrg( targetUser, org ); } } if ( dryRun ) { - logger.info( "Would remove user {}:{}", new Object[]{ - sourceUser.getUsername(), sourceUser.getId() } ); + logger.info( "Would remove admin with email {} and id {} from system", + sourceUser.getEmail(), sourceUser.getId() ); } else { - logger.info( "Deleting admin with email {} and id {}", sourceUser.getEmail(), sourceUser.getId() ); + logger.info( "Removing admin with email {} and id {} from system", + sourceUser.getEmail(), sourceUser.getId() ); + manager.removeOrgUser( sourceUser ); } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java ---------------------------------------------------------------------- diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java index f0f14c7..7b940fa 100644 --- a/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java +++ b/stack/tools/src/main/java/org/apache/usergrid/tools/DuplicateOrgRepair.java @@ -330,7 +330,7 @@ public class DuplicateOrgRepair extends ToolBase { for ( String dupName : duplicatesByName.keySet() ) { Set<Org> duplicateOrgs = duplicatesByName.get(dupName); - Org bestOrg = selectBest( duplicateOrgs ); + Org bestOrg = manager.selectBest( duplicateOrgs ); for ( Org org : duplicateOrgs ) { @@ -402,7 +402,7 @@ public class DuplicateOrgRepair extends ToolBase { private void removeDuplicateOrgs() throws Exception { for ( String dupName : duplicatesByName.keySet() ) { Set<Org> orgs = duplicatesByName.get( dupName ); - Org best = selectBest( orgs ); + Org best = manager.selectBest( orgs ); for ( Org candidate : orgs ) { if ( !candidate.equals(best) ) { if ( dryRun ) { @@ -414,21 +414,8 @@ public class DuplicateOrgRepair extends ToolBase { } } } + logger.info( "DuplicateOrgRepair renamed/removed duplicate orgs"); } - - /** - * select best org from a set of duplicates by picking the oldest org - */ - public Org selectBest(Set<Org> orgs) throws Exception { - Org oldest = null; - for ( Org org :orgs ) { - if ( oldest == null || org.compareTo( oldest ) < 0 ) { - oldest = org; - } - } - return oldest; - } - } http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java ---------------------------------------------------------------------- diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java index b756f32..ab4b7e1 100644 --- a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java +++ b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgInterface.java @@ -16,6 +16,7 @@ */ package org.apache.usergrid.tools; +import org.apache.commons.lang3.builder.EqualsBuilder; import rx.Observable; import java.util.Map; @@ -63,6 +64,8 @@ interface UserOrgInterface { void updateOrgUser(OrgUser targetUserEntity) throws Exception; void setOrgUserName(OrgUser other, String newUserName) throws Exception; + + Org selectBest( Set<Org> candidates ) throws Exception; class Org implements Comparable<Org> { private UUID id; @@ -145,7 +148,23 @@ interface UserOrgInterface { public long getCreated() { return created; } - + + @Override + public boolean equals( Object obj ) { + if (obj == null) { return false; } + if (obj == this) { return true; } + if (obj.getClass() != getClass()) { + return false; + } + OrgUser rhs = (OrgUser) obj; + return new EqualsBuilder().appendSuper(super.equals(obj)) + .append(id, rhs.id) + .append(username, rhs.username) + .append(email, rhs.email) + .append(created, rhs.created) + .isEquals(); + } + @Override public int compareTo(OrgUser o) { return Long.compare( this.created, o.created ); http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java ---------------------------------------------------------------------- diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java index 383fb9b..7f82d35 100644 --- a/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java +++ b/stack/tools/src/main/java/org/apache/usergrid/tools/UserOrgManager.java @@ -343,7 +343,7 @@ class UserOrgManager implements UserOrgInterface { em.update( user ); } - + @Override public void setOrgUserName(OrgUser other, String newUserName ) throws Exception { @@ -363,4 +363,23 @@ class UserOrgManager implements UserOrgInterface { setOrgUserName( other, String.format( "%s-%s", other.getUsername(), other.getId() ) ); } } + + + /** + * Select best org from a set of duplicates by picking the one that is indexed, or the oldest. + */ + @Override + public Org selectBest(Set<Org> orgs) throws Exception { + Org oldest = null; + for ( Org org :orgs ) { + OrganizationInfo info = managementService.getOrganizationByName( org.getName() ); + if ( info != null ) { + return org; + } + if ( oldest == null || org.compareTo( oldest ) < 0 ) { + oldest = org; + } + } + return oldest; + } } http://git-wip-us.apache.org/repos/asf/usergrid/blob/a1b66850/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java ---------------------------------------------------------------------- diff --git a/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java b/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java index 818c1b8..4e2fd95 100644 --- a/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java +++ b/stack/tools/src/test/java/org/apache/usergrid/tools/MockUserOrgManager.java @@ -221,6 +221,21 @@ class MockUserOrgManager implements UserOrgInterface { updateOrgUser( user ); // re-index user } + /** + * select best org from a set of duplicates by picking the oldest org + */ + @Override + public Org selectBest(Set<Org> orgs) throws Exception { + Org oldest = null; + for ( Org org :orgs ) { + if ( oldest == null || org.compareTo( oldest ) < 0 ) { + oldest = org; + } + } + return oldest; + } + + // implemented for testing only OrgUser createOrgUser(UUID id, String name, String email) { OrgUser user = new OrgUser( id, name, email );
