You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@usergrid.apache.org by sn...@apache.org on 2015/07/17 23:39:30 UTC

[1/6] incubator-usergrid git commit: Log total counts

Repository: incubator-usergrid
Updated Branches:
  refs/heads/import-fixes 648b5997e -> 4f8aa2f36


Log total counts


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/75ad454c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/75ad454c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/75ad454c

Branch: refs/heads/import-fixes
Commit: 75ad454cf23bff8dd5ad8dc84563cc1a5520db7f
Parents: b9af09e
Author: Dave Johnson <sn...@apache.org>
Authored: Thu Jul 9 15:19:34 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Thu Jul 9 15:19:34 2015 -0400

----------------------------------------------------------------------
 .../java/org/apache/usergrid/tools/ImportAdmins.java   | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/75ad454c/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
index 4bcdc0b..0b69a98 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
@@ -625,13 +625,13 @@ public class ImportAdmins extends ToolBase {
                     long stopTime = System.currentTimeMillis();
                     long duration = stopTime - startTime;
                     durationSum += duration;
+                    metadataCount.getAndIncrement();
                     count++;
-
-                    //logger.debug( "Imported {}th metadata", count );
                     
                     if ( count % 30 == 0 ) {
-                        logger.info( "Imported {} metadata of total {}. Average metadata Imported Rate: {}(ms)", 
-                           new Object[] { count, metadataCount.get(), durationSum / count });
+                        logger.info( "Imported {} metadata of total {} expected. " +
+                                        "Average metadata Imported Rate: {}(ms)", 
+                           new Object[] { metadataCount.get(), userCount.get(), durationSum / count });
                     }
 
                 } catch (Exception e) {
@@ -694,7 +694,7 @@ public class ImportAdmins extends ToolBase {
                         logger.debug( "Imported admin user {} / {}",
                             new Object[] { uuid, entityProps.get( "username" ) } );
 
-                        userCount.addAndGet( 1 );
+                        userCount.getAndIncrement();
                         auditQueue.put(entityProps);
                         long stopTime = System.currentTimeMillis();
                         long duration = stopTime - startTime;
@@ -702,7 +702,8 @@ public class ImportAdmins extends ToolBase {
                         
                         count++;
                         if (count % 30 == 0) {
-                            logger.info( "Imported {} admin users of total {}. Average Creation Rate: {}ms", 
+                            logger.info( "This worked has imported {} users of total {} imported so far. " +
+                                            "Average Creation Rate: {}ms", 
                                 new Object[] { count, userCount.get(), durationSum / count });
                         }
                         


[6/6] incubator-usergrid git commit: More consistency in logging about admin users, using username : email : uuid format.

Posted by sn...@apache.org.
More consistency in logging about admin users, using username : email : uuid format.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/4f8aa2f3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/4f8aa2f3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/4f8aa2f3

Branch: refs/heads/import-fixes
Commit: 4f8aa2f36fca8c661d627f1748e3994e62107ce4
Parents: 125ffe9
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Jul 17 17:39:25 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Jul 17 17:39:25 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ImportAdmins.java | 29 ++++++++++++++------
 1 file changed, 21 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/4f8aa2f3/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
index 7e08a4c..f39ef9b 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
@@ -462,7 +462,13 @@ public class ImportAdmins extends ToolBase {
                     } else { // org exists, add original user to it
                         try {
                             managementService.addAdminUserToOrganization( userInfo, orgInfo, false );
-                            logger.debug( "Added user {} to org {}", new Object[]{user.getEmail(), orgName} );
+                            logger.debug( "Added to org user {}:{}:{}",
+                                    new Object[]{
+                                            orgInfo.getName(),
+                                            user.getUsername(),
+                                            user.getEmail(),
+                                            user.getUuid()
+                                    });
 
                         } catch (Exception e) {
                             logger.error( "Error Adding user {} to org {}", new Object[]{user.getEmail(), orgName} );
@@ -533,7 +539,9 @@ public class ImportAdmins extends ToolBase {
                             logger.debug( "Created new org {} for user {}:{}:{} from duplicate user {}:{}",
                                 new Object[]{
                                         orgInfo.getName(),
-                                        originalUser.getUuid(), originalUser.getUsername(), originalUser.getEmail(),
+                                        originalUser.getUsername(), 
+                                        originalUser.getEmail(),
+                                        originalUser.getUuid(), 
                                         dup.username, dup.email
                                 });
 
@@ -546,7 +554,9 @@ public class ImportAdmins extends ToolBase {
                             logger.debug( "Added to org user {}:{}:{} from duplicate user {}:{}",
                                     new Object[]{
                                             orgInfo.getName(),
-                                            originalUser.getUuid(), originalUser.getUsername(), originalUser.getEmail(),
+                                            originalUser.getUsername(), 
+                                            originalUser.getEmail(),
+                                            originalUser.getUuid(), 
                                             dup.username, dup.email
                                     });
 
@@ -686,7 +696,7 @@ public class ImportAdmins extends ToolBase {
 
             while (!done) {
                 try {
-                    ImportMetadataTask task = this.workQueue.poll(30, TimeUnit.SECONDS);
+                    ImportMetadataTask task = this.workQueue.poll( 30, TimeUnit.SECONDS );
 
                     if (task == null) {
                         logger.warn("Reading from metadata queue was null!");
@@ -694,11 +704,11 @@ public class ImportAdmins extends ToolBase {
                         Thread.sleep(1000);
                         continue;
                     }
-                    metadataEmptyCount.set(0);
+                    metadataEmptyCount.set( 0 );
                     
                     long startTime = System.currentTimeMillis();
                     
-                    importEntityMetadata(em, task.entityRef, task.metadata);
+                    importEntityMetadata( em, task.entityRef, task.metadata );
                     
                     long stopTime = System.currentTimeMillis();
                     long duration = stopTime - startTime;
@@ -770,7 +780,7 @@ public class ImportAdmins extends ToolBase {
                         em.create(uuid, type, entityProps);
 
                         logger.debug( "Imported admin user {}:{}:{}",
-                            new Object[] { uuid, entityProps.get( "username" ), entityProps.get("email") } );
+                            new Object[] { entityProps.get( "username" ), entityProps.get("email"), uuid } );
 
                         userCount.getAndIncrement();
                         auditQueue.put(entityProps);
@@ -805,7 +815,10 @@ public class ImportAdmins extends ToolBase {
         private void handleDuplicateAccount(EntityManager em, String dupProperty, Map<String, Object> entityProps ) {
 
             logger.info( "Processing duplicate user {}:{}:{} with duplicate {}", new Object[]{
-                    entityProps.get( "uuid" ), entityProps.get( "username" ), entityProps.get( "email" ), dupProperty} );
+                    entityProps.get( "username" ), 
+                    entityProps.get( "email" ), 
+                    entityProps.get( "uuid" ), 
+                    dupProperty} );
            
             UUID dupUuid = UUID.fromString( entityProps.get("uuid").toString() );
             try {


[5/6] incubator-usergrid git commit: Ignore users with no orgs or creds, log total orgs exported and better logging.

Posted by sn...@apache.org.
Ignore users with no orgs or creds, log total orgs exported and better logging.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/125ffe98
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/125ffe98
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/125ffe98

Branch: refs/heads/import-fixes
Commit: 125ffe9893c617a81b26a9aaaf1f13460fb01ca6
Parents: 16de78d
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Jul 17 11:28:07 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Jul 17 11:28:07 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ExportAdmins.java | 117 ++++++++++++-------
 .../org/apache/usergrid/tools/ImportAdmins.java |   2 +-
 2 files changed, 78 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/125ffe98/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
index ae9c16b..9dce862 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
@@ -61,15 +61,25 @@ import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEM
  *    cassandra.lock.keyspace=My_Usergrid_Locks
  */
 public class ExportAdmins extends ExportingToolBase {
-
+    
     static final Logger logger = LoggerFactory.getLogger( ExportAdmins.class );
+    
     public static final String ADMIN_USERS_PREFIX = "admin-users";
     public static final String ADMIN_USER_METADATA_PREFIX = "admin-user-metadata";
+   
+    // map admin user UUID to list of organizations to which user belongs
+    private Map<UUID, List<Org>> userToOrgsMap = new HashMap<UUID, List<Org>>(50000);
+
+    private Map<String, UUID> orgNameToUUID = new HashMap<String, UUID>(50000);
+    
+    private Set<UUID> orgsWritten = new HashSet<UUID>(50000);
+    
+    private Set<UUID> duplicateOrgs = new HashSet<UUID>();
+    
     private static final String READ_THREAD_COUNT = "readThreads";
-    private Map<String, List<Org>> orgMap = new HashMap<String, List<Org>>(80000);
     private int readThreadCount;
-    
-    AtomicInteger count = new AtomicInteger( 0 );
+
+    AtomicInteger userCount = new AtomicInteger( 0 );
    
     
     /**
@@ -173,7 +183,7 @@ public class ExportAdmins extends ExportingToolBase {
         while ( !done ) {
             writeThread.join( 10000, 0 );
             done = !writeThread.isAlive();
-            logger.info( "Wrote {} users", count.get() );
+            logger.info( "Wrote {} users", userCount.get() );
         }
     }
     
@@ -211,10 +221,11 @@ public class ExportAdmins extends ExportingToolBase {
             organizations = em.searchCollection( em.getApplicationRef(), "groups", query );
             for ( Entity organization : organizations.getEntities() ) {
                 execService.submit( new OrgMapWorker( organization ) );
+                count++;
             }
-            count++;
+             
             if ( count % 1000 == 0 ) {
-                logger.info("Processed {} orgs for org map", count);
+                logger.info("Queued {} org map workers", count);
             }
             query.setCursor( organizations.getCursor() );
         }
@@ -222,8 +233,10 @@ public class ExportAdmins extends ExportingToolBase {
 
         execService.shutdown();
         while ( !execService.awaitTermination( 10, TimeUnit.SECONDS ) ) {
-            logger.info("Processed {} orgs for map", orgMap.size() );
+            logger.info( "Processed {} orgs for map", userToOrgsMap.size() );
         }
+        
+        logger.info("Org map complete, counted {} organizations", count);
     }
 
 
@@ -239,17 +252,33 @@ public class ExportAdmins extends ExportingToolBase {
             try {
                 final String orgName = orgEntity.getProperty( "path" ).toString();
                 final UUID orgId = orgEntity.getUuid();
+                
                 for (UserInfo user : managementService.getAdminUsersForOrganization( orgEntity.getUuid() )) {
                     try {
                         Entity admin = managementService.getAdminUserEntityByUuid( user.getUuid() );
-                        List<Org> orgs = orgMap.get( admin.getProperty( "username" ) );
-                        if (orgs == null) {
-                            orgs = new ArrayList<Org>();
-                            orgMap.put( admin.getProperty( "username" ).toString().toLowerCase(), orgs );
+                        Org org = new Org( orgId, orgName );
+
+                        synchronized (userToOrgsMap) {
+                            List<Org> userOrgs = userToOrgsMap.get( admin.getUuid() );
+                            if (userOrgs == null) {
+                                userOrgs = new ArrayList<Org>();
+                                userToOrgsMap.put( admin.getUuid(), userOrgs );
+                            }
+                            userOrgs.add( org );
                         }
-                        orgs.add( new Org( orgId, orgName ) );
 
-                        //logger.debug("Added org {} for user {}", orgName, admin.getProperty( "username" ));
+                        synchronized (orgNameToUUID) {
+                            UUID existingOrgId = orgNameToUUID.get( orgName );
+                            ;
+                            if (existingOrgId != null && !orgId.equals( existingOrgId )) {
+                                if ( !duplicateOrgs.contains( orgId )) {
+                                    logger.info( "Org {}:{} is a duplicate", orgId, orgName );
+                                    duplicateOrgs.add(orgId);
+                                }
+                            } else {
+                                orgNameToUUID.put( orgName, orgId );
+                            }
+                        }
 
                     } catch (Exception e) {
                         logger.warn( "Cannot get orgs for userId {}", user.getUuid() );
@@ -301,10 +330,33 @@ public class ExportAdmins extends ExportingToolBase {
                     AdminUserWriteTask task = new AdminUserWriteTask();
                     task.adminUser = entity;
 
-                    addDictionariesToTask(  task, entity );
+                    addDictionariesToTask( task, entity );
                     addOrganizationsToTask( task );
 
-                    writeQueue.add( task );
+                    String actionTaken = "Processed";
+
+                    if (task.orgNamesByUuid.isEmpty()
+                            || task.dictionariesByName.isEmpty()
+                            || task.dictionariesByName.get( "credentials" ).isEmpty()) {
+                        actionTaken = "Ignored";
+                        
+                    } else {
+                        writeQueue.add( task );
+                    }
+
+                    Map<String, Object> creds = (Map<String, Object>) (task.dictionariesByName.isEmpty() ? 
+                                                0 : task.dictionariesByName.get( "credentials" ));
+                    
+                    logger.error( "{} admin user {}:{}:{} has organizations={} dictionaries={} credentials={}",
+                            new Object[]{
+                                    actionTaken,
+                                    task.adminUser.getProperty( "username" ),
+                                    task.adminUser.getProperty( "email" ),
+                                    task.adminUser.getUuid(),
+                                    task.orgNamesByUuid.size(),
+                                    task.dictionariesByName.size(),
+                                    creds == null ? 0 : creds.size()
+                            } ); 
 
                 } catch ( Exception e ) {
                     logger.error("Error reading data for user " + uuid, e );
@@ -327,20 +379,8 @@ public class ExportAdmins extends ExportingToolBase {
 
             Map<Object, Object> credentialsDictionary = em.getDictionaryAsMap( entity, "credentials" );
 
-            if ( credentialsDictionary != null && !credentialsDictionary.isEmpty() ) {
+            if ( credentialsDictionary != null ) {
                 task.dictionariesByName.put( "credentials", credentialsDictionary );
-
-                if (credentialsDictionary.get( "password" ) == null) {
-                    logger.error( "User {}:{} has no password in credential dictionary",
-                        new Object[]{task.adminUser.getName(), task.adminUser.getUuid()} );
-                }
-                if (credentialsDictionary.get( "secret" ) == null) {
-                    logger.error( "User {}:{} has no secret in credential dictionary",
-                        new Object[]{task.adminUser.getName(), task.adminUser.getUuid()} );
-                }
-            } else {
-                logger.error( "User {}:{} has no or empty credentials dictionary",
-                    new Object[]{task.adminUser.getName(), task.adminUser.getUuid()} );
             }
         }
 
@@ -348,22 +388,17 @@ public class ExportAdmins extends ExportingToolBase {
 
             task.orgNamesByUuid = managementService.getOrganizationsForAdminUser( task.adminUser.getUuid() );
 
-            List<Org> orgs = orgMap.get( task.adminUser.getProperty( "username" ).toString().toLowerCase() );
+            List<Org> orgs = userToOrgsMap.get( task.adminUser.getProperty( "username" ).toString().toLowerCase() );
             
             if ( orgs != null && task.orgNamesByUuid.size() < orgs.size() ) {
+                
+                // list of orgs from getOrganizationsForAdminUser() is less than expected, use userToOrgsMap
                 BiMap<UUID, String> bimap = HashBiMap.create();
                 for (Org org : orgs) {
                     bimap.put( org.orgId, org.orgName );
                 }
                 task.orgNamesByUuid = bimap;
             }
-            
-            if ( task.orgNamesByUuid.isEmpty() ) {
-                logger.error("{}:{}:{} has no orgs", new Object[] {
-                        task.adminUser.getProperty("username"), 
-                        task.adminUser.getProperty("email"), 
-                        task.adminUser.getUuid() } );
-            }
         }
     }
 
@@ -425,7 +460,7 @@ public class ExportAdmins extends ExportingToolBase {
                         task.adminUser.getProperty("email"),
                         task.adminUser.getUuid() } );
 
-                    count.addAndGet( 1 );
+                    userCount.addAndGet( 1 );
 
                 } catch (InterruptedException e) {
                     throw new Exception("Interrupted", e);
@@ -438,7 +473,7 @@ public class ExportAdmins extends ExportingToolBase {
             usersFile.writeEndArray();
             usersFile.close();
 
-            logger.info( "Exported TOTAL {} admin users", count );
+            logger.info( "Exported TOTAL {} admin users and {} organizations", userCount.get(), orgsWritten.size() );
         }
 
 
@@ -490,7 +525,9 @@ public class ExportAdmins extends ExportingToolBase {
 
                 jg.writeEndObject();
                 
-                logger.debug( "Exported organization {}:{}", uuid, orgs.get( uuid ) );
+                synchronized (orgsWritten) {
+                    orgsWritten.add( uuid );
+                }
             }
 
             jg.writeEndArray();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/125ffe98/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
index c6aada7..7e08a4c 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
@@ -636,7 +636,7 @@ public class ImportAdmins extends ToolBase {
                     long duration = stopTime - startTime;
                     durationSum += duration;
 
-                    //logger.debug( "Audited {}th admin", count );
+                    //logger.debug( "Audited {}th admin", userCount );
                     
                     if ( count % 100 == 0 ) {
                         logger.info( "Audited {}. Average Audit Rate: {}(ms)", count, durationSum / count );


[2/6] incubator-usergrid git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-usergrid

Posted by sn...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-usergrid


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/9c459f4e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/9c459f4e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/9c459f4e

Branch: refs/heads/import-fixes
Commit: 9c459f4e82daf29e908ccb38a8e0b09eff3be2f0
Parents: 75ad454 648b599
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Jul 15 13:56:50 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Jul 15 13:56:50 2015 -0400

----------------------------------------------------------------------

----------------------------------------------------------------------



[4/6] incubator-usergrid git commit: Duplicate user merge.

Posted by sn...@apache.org.
Duplicate user merge.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/16de78d9
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/16de78d9
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/16de78d9

Branch: refs/heads/import-fixes
Commit: 16de78d9d5a42941c76907ffe2986b16c7195976
Parents: e1b352e
Author: Dave Johnson <sn...@apache.org>
Authored: Thu Jul 16 13:56:17 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Thu Jul 16 13:56:17 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ExportAdmins.java |   2 +
 .../org/apache/usergrid/tools/ImportAdmins.java | 203 ++++++++++++++-----
 stack/tools/src/main/resources/log4j.properties |   2 +-
 .../usergrid/tools/ExportImportAdminsTest.java  |  71 ++++---
 ...adata.usergrid-management.1433331614293.json |  52 +++++
 ...users.usergrid-management.1433331614293.json |  12 ++
 6 files changed, 263 insertions(+), 79 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/16de78d9/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
index 2c14da1..ae9c16b 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
@@ -489,6 +489,8 @@ public class ExportAdmins extends ExportingToolBase {
                 jg.writeObject( orgs.get( uuid ) );
 
                 jg.writeEndObject();
+                
+                logger.debug( "Exported organization {}:{}", uuid, orgs.get( uuid ) );
             }
 
             jg.writeEndArray();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/16de78d9/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
index 0b693c8..c6aada7 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
@@ -17,6 +17,7 @@
 package org.apache.usergrid.tools;
 
 
+import com.sun.org.apache.bcel.internal.generic.DUP;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionBuilder;
@@ -26,6 +27,8 @@ import org.apache.usergrid.management.OrganizationInfo;
 import org.apache.usergrid.management.UserInfo;
 import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.persistence.EntityRef;
+import org.apache.usergrid.persistence.Identifier;
+import org.apache.usergrid.persistence.SimpleEntityRef;
 import org.apache.usergrid.persistence.entities.User;
 import org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException;
 import org.codehaus.jackson.JsonFactory;
@@ -84,6 +87,7 @@ public class ImportAdmins extends ToolBase {
     private Map<Stoppable, Thread> adminAuditThreads = new HashMap<Stoppable, Thread>();
     private Map<Stoppable, Thread> metadataWorkerThreadMap = new HashMap<Stoppable, Thread>();
 
+    Map<UUID, DuplicateUser> dupsByDupUuid = new HashMap<UUID, DuplicateUser>(200);
 
     JsonFactory jsonFactory = new JsonFactory();
 
@@ -94,6 +98,19 @@ public class ImportAdmins extends ToolBase {
     AtomicInteger auditEmptyCount = new AtomicInteger( 0 );
     AtomicInteger metadataEmptyCount = new AtomicInteger( 0 );
     
+    
+    static class DuplicateUser {
+        String email;
+        String username;
+        public DuplicateUser( String propName, Map<String, Object> user ) {
+            if ( "email".equals(propName)) {
+                email = user.get("email").toString();
+            } else {
+                username = user.get("username").toString();
+            }
+        }
+    }
+    
 
 
     @Override
@@ -382,7 +399,7 @@ public class ImportAdmins extends ToolBase {
                 String entityOwnerId = jp.getCurrentName();
 
                 try {
-                    EntityRef entityRef = em.get( UUID.fromString( entityOwnerId ) );
+                    EntityRef entityRef = new SimpleEntityRef( "user", UUID.fromString( entityOwnerId ) );
                     Map<String, Object> metadata = (Map<String, Object>) jp.readValueAs( Map.class );
                     
                     workQueue.put( new ImportMetadataTask( entityRef, metadata ) );
@@ -408,31 +425,33 @@ public class ImportAdmins extends ToolBase {
     private void importEntityMetadata(
             EntityManager em, EntityRef entityRef, Map<String, Object> metadata) throws Exception {
 
-        List<Object> organizationsList = (List<Object>) metadata.get("organizations");
-        if (organizationsList != null && !organizationsList.isEmpty()) {
+        DuplicateUser dup = dupsByDupUuid.get( entityRef.getUuid() );
+        
+        if ( dup == null ) { // not a duplicate
 
-            User user = em.get(entityRef, User.class);
-            
-            if (user == null) {
-                logger.error("User not found, not adding to organizations: " 
-                    + (entityRef == null ? null : entityRef.getUuid()));
+            User user = em.get( entityRef, User.class );
+            final UserInfo userInfo = managementService.getAdminUserByEmail( user.getEmail() );
 
-            } else {
+            if (user == null || userInfo == null) {
+                logger.error( "User {} does not exist, not processing metadata", entityRef.getUuid() );
+                return;
+            }
 
-                final UserInfo userInfo = managementService.getAdminUserByEmail(user.getEmail());
+            List<Object> organizationsList = (List<Object>) metadata.get("organizations");
+            if (organizationsList != null && !organizationsList.isEmpty()) {
 
                 for (Object orgObject : organizationsList) {
 
                     Map<String, Object> orgMap = (Map<String, Object>) orgObject;
-                    UUID orgUuid = UUID.fromString((String) orgMap.get("uuid"));
-                    String orgName = (String) orgMap.get("name");
+                    UUID orgUuid = UUID.fromString( (String) orgMap.get( "uuid" ) );
+                    String orgName = (String) orgMap.get( "name" );
 
-                    // create org only if it does not exist
-                    OrganizationInfo orgInfo = managementService.getOrganizationByUuid(orgUuid);
-                    if (orgInfo == null) {
+                    OrganizationInfo orgInfo = managementService.getOrganizationByUuid( orgUuid );
+
+                    if (orgInfo == null) { // org does not exist yet, create it and add user
                         try {
-                            managementService.createOrganization(orgUuid, orgName, userInfo, false);
-                            orgInfo = managementService.getOrganizationByUuid(orgUuid);
+                            managementService.createOrganization( orgUuid, orgName, userInfo, false );
+                            orgInfo = managementService.getOrganizationByUuid( orgUuid );
 
                             logger.debug( "Created new org {} for user {}",
                                     new Object[]{orgInfo.getName(), user.getEmail()} );
@@ -440,49 +459,107 @@ public class ImportAdmins extends ToolBase {
                         } catch (DuplicateUniquePropertyExistsException dpee) {
                             logger.debug( "Org {} already exists", orgName );
                         }
-                    } else {
+                    } else { // org exists, add original user to it
                         try {
                             managementService.addAdminUserToOrganization( userInfo, orgInfo, false );
                             logger.debug( "Added user {} to org {}", new Object[]{user.getEmail(), orgName} );
-                            
-                        } catch ( Exception e ) {
+
+                        } catch (Exception e) {
                             logger.error( "Error Adding user {} to org {}", new Object[]{user.getEmail(), orgName} );
                         }
                     }
                 }
             }
+            
+            Map<String, Object> dictionariesMap = (Map<String, Object>) metadata.get("dictionaries");
+            if (dictionariesMap != null && !dictionariesMap.isEmpty()) {
+                for (String name : dictionariesMap.keySet()) {
+                    try {
+                        Map<String, Object> dictionary = (Map<String, Object>) dictionariesMap.get(name);
+                        em.addMapToDictionary( entityRef, name, dictionary);
 
-        } else {
-            logger.warn("User {} has no organizations", entityRef.getUuid() );
-        }
-
-        Map<String, Object> dictionariesMap = (Map<String, Object>) metadata.get("dictionaries");
-
-        if (dictionariesMap != null && !dictionariesMap.isEmpty()) {
-            for (String name : dictionariesMap.keySet()) {
-                try {
-                    Map<String, Object> dictionary = (Map<String, Object>) dictionariesMap.get(name);
-                    em.addMapToDictionary( entityRef, name, dictionary);
-
-                    logger.debug( "Creating dictionary for {} name {}",
-                            new Object[]{entityRef, name} );
+                        logger.debug( "Creating dictionary for {} name {}",
+                                new Object[]{entityRef, name} );
 
-                } catch (Exception e) {
-                    if (logger.isDebugEnabled()) {
-                        logger.error("Error importing dictionary name "
-                                + name + " for user " + entityRef.getUuid(), e);
-                    } else {
-                        logger.error("Error importing dictionary name "
-                                + name + " for user " + entityRef.getUuid());
+                    } catch (Exception e) {
+                        if (logger.isDebugEnabled()) {
+                            logger.error("Error importing dictionary name "
+                                    + name + " for user " + entityRef.getUuid(), e);
+                        } else {
+                            logger.error("Error importing dictionary name "
+                                    + name + " for user " + entityRef.getUuid());
+                        }
                     }
                 }
+
+            } else {
+                logger.warn("User {} has no dictionaries", entityRef.getUuid() );
             }
             
-        } else {
-            logger.warn("User {} has no dictionaries", entityRef.getUuid() );
-        }
+        } else { // this is a duplicate user, so merge orgs
+
+            logger.info("Processing duplicate username={} email={}", dup.email, dup.username );
+           
+            Identifier identifier = dup.email != null ? 
+                Identifier.fromEmail( dup.email ) : Identifier.from( dup.username );
+            User originalUser = em.get( em.getUserByIdentifier(identifier), User.class );
+
+            // get map of original user's orgs
+            
+            UserInfo originalUserInfo = managementService.getAdminUserByEmail( originalUser.getEmail() );
+            Map<String, Object> originalUserOrgData =
+                    managementService.getAdminUserOrganizationData( originalUser.getUuid() );
+            Map<String, Map<String, Object>> originalUserOrgs =
+                    (Map<String, Map<String, Object>>) originalUserOrgData.get( "organizations" );
 
+            // loop through duplicate user's orgs and give orgs to original user
 
+            List<Object> organizationsList = (List<Object>) metadata.get("organizations");
+            for (Object orgObject : organizationsList) {
+
+                Map<String, Object> orgMap = (Map<String, Object>) orgObject;
+                UUID orgUuid = UUID.fromString( (String) orgMap.get( "uuid" ) );
+                String orgName = (String) orgMap.get( "name" );
+
+                if (originalUserOrgs.get( orgName ) == null) { // original user does not have this org
+
+                    OrganizationInfo orgInfo = managementService.getOrganizationByUuid( orgUuid );
+                    
+                    if (orgInfo == null) { // org does not exist yet, create it and add original user to it
+                        try {
+                            managementService.createOrganization( orgUuid, orgName, originalUserInfo, false );
+                            orgInfo = managementService.getOrganizationByUuid( orgUuid );
+
+                            logger.debug( "Created new org {} for user {}:{}:{} from duplicate user {}:{}",
+                                new Object[]{
+                                        orgInfo.getName(),
+                                        originalUser.getUuid(), originalUser.getUsername(), originalUser.getEmail(),
+                                        dup.username, dup.email
+                                });
+
+                        } catch (DuplicateUniquePropertyExistsException dpee) {
+                            logger.debug( "Org {} already exists", orgName );
+                        }
+                    } else { // org exists so add original user to it
+                        try {
+                            managementService.addAdminUserToOrganization( originalUserInfo, orgInfo, false );
+                            logger.debug( "Added to org user {}:{}:{} from duplicate user {}:{}",
+                                    new Object[]{
+                                            orgInfo.getName(),
+                                            originalUser.getUuid(), originalUser.getUsername(), originalUser.getEmail(),
+                                            dup.username, dup.email
+                                    });
+
+                        } catch (Exception e) {
+                            logger.error( "Error Adding user {} to org {}", 
+                                    new Object[]{originalUserInfo.getEmail(), orgName} );
+                        }
+                    }
+                    
+                } // else original user already has this org
+                
+            }
+        }
     }
 
 
@@ -685,15 +762,15 @@ public class ImportAdmins extends ToolBase {
 
                     // Import/create the entity
                     UUID uuid = getId(entityProps);
-                    String type = getType(entityProps);
+                    String type = getType( entityProps );
 
                     try {
                         long startTime = System.currentTimeMillis();
                         
                         em.create(uuid, type, entityProps);
 
-                        logger.debug( "Imported admin user {} / {}",
-                            new Object[] { uuid, entityProps.get( "username" ) } );
+                        logger.debug( "Imported admin user {}:{}:{}",
+                            new Object[] { uuid, entityProps.get( "username" ), entityProps.get("email") } );
 
                         userCount.getAndIncrement();
                         auditQueue.put(entityProps);
@@ -709,19 +786,37 @@ public class ImportAdmins extends ToolBase {
                         }
                         
                     } catch (DuplicateUniquePropertyExistsException de) {
-                        logger.warn("Unable to create admin user {}:{}, duplicate property {}",
-                                new Object[]{ uuid, entityProps.get("username"), de.getPropertyName() });
-                        if (logger.isDebugEnabled()) {
-                            logger.debug("Exception", de);
-                        }
+                        String dupProperty = de.getPropertyName();
+                        handleDuplicateAccount( em, dupProperty, entityProps );
+                        continue;
+
+                        
                     } catch (Exception e) {
-                        e.printStackTrace();
+                        logger.error("Error", e);
                     }
                 } catch (InterruptedException e) {
-                    e.printStackTrace();
+                    logger.error( "Error", e );
                 }
 
             }
         }
+
+        
+        private void handleDuplicateAccount(EntityManager em, String dupProperty, Map<String, Object> entityProps ) {
+
+            logger.info( "Processing duplicate user {}:{}:{} with duplicate {}", new Object[]{
+                    entityProps.get( "uuid" ), entityProps.get( "username" ), entityProps.get( "email" ), dupProperty} );
+           
+            UUID dupUuid = UUID.fromString( entityProps.get("uuid").toString() );
+            try {
+                dupsByDupUuid.put( dupUuid, new DuplicateUser( dupProperty, entityProps ) );
+                
+            } catch (Exception e) {
+                logger.error("Error processing dup user {}:{}:{}",
+                        new Object[] {entityProps.get( "username" ), entityProps.get("email"), dupUuid});
+                return;
+            }
+
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/16de78d9/stack/tools/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/resources/log4j.properties b/stack/tools/src/main/resources/log4j.properties
index 6cf0a92..80c32a1 100644
--- a/stack/tools/src/main/resources/log4j.properties
+++ b/stack/tools/src/main/resources/log4j.properties
@@ -26,7 +26,7 @@ log4j.appender.stdout=org.apache.log4j.ConsoleAppender
 log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
 log4j.appender.stdout.layout.ConversionPattern=%d %p (%t) [%c] - %m%n
 
-log4j.logger.org.apache.usergrid.tools=INFO
+log4j.logger.org.apache.usergrid.tools=DEBUG
 
 log4j.logger.org.apache.usergrid.management.cassandra=WARN
 log4j.logger.org.apache.usergrid.persistence.cassandra.DB=WARN

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/16de78d9/stack/tools/src/test/java/org/apache/usergrid/tools/ExportImportAdminsTest.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/test/java/org/apache/usergrid/tools/ExportImportAdminsTest.java b/stack/tools/src/test/java/org/apache/usergrid/tools/ExportImportAdminsTest.java
index 898a97d..9cce040 100644
--- a/stack/tools/src/test/java/org/apache/usergrid/tools/ExportImportAdminsTest.java
+++ b/stack/tools/src/test/java/org/apache/usergrid/tools/ExportImportAdminsTest.java
@@ -4,7 +4,7 @@
  * this work for additional information regarding copyright ownership.
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
+ * the License.  You may obtain a copy of the License at:223
  *
  *      http://www.apache.org/licenses/LICENSE-2.0
  *
@@ -26,6 +26,8 @@ import org.apache.usergrid.ServiceITSuite;
 import org.apache.usergrid.management.OrganizationInfo;
 import org.apache.usergrid.management.OrganizationOwnerInfo;
 import org.apache.usergrid.management.UserInfo;
+import org.apache.usergrid.persistence.Entity;
+import org.apache.usergrid.persistence.EntityManager;
 import org.apache.usergrid.utils.UUIDUtils;
 import org.codehaus.jackson.JsonNode;
 import org.codehaus.jackson.map.ObjectMapper;
@@ -40,13 +42,13 @@ import java.io.FilenameFilter;
 import java.util.*;
 
 import static junit.framework.TestCase.assertNotNull;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEMENT_APPLICATION_ID;
+import static org.junit.Assert.*;
 
 
 public class ExportImportAdminsTest {
     static final Logger logger = LoggerFactory.getLogger( ExportImportAdminsTest.class );
-
+    
     @ClassRule
     public static ServiceITSetup setup = new ServiceITSetupImpl( ServiceITSuite.cassandraResource );
 
@@ -146,21 +148,28 @@ public class ExportImportAdminsTest {
     public void testImportAdminUsersAndOrgs() throws Exception {
 
         // first: generate the data file with unique user and org IDs and names
+        
+        // data contains three users each with a unique org, one user has a duplicate email
 
         String rand1 = RandomStringUtils.randomAlphanumeric( 10 );
         String rand2 = RandomStringUtils.randomAlphanumeric( 10 );
+        String rand3 = RandomStringUtils.randomAlphanumeric( 10 );
 
         UUID user_uuid_1 = UUIDUtils.newTimeUUID();
         UUID user_uuid_2 = UUIDUtils.newTimeUUID();
+        UUID user_uuid_3 = UUIDUtils.newTimeUUID();
 
         UUID org_uuid_1  = UUIDUtils.newTimeUUID();
         UUID org_uuid_2  = UUIDUtils.newTimeUUID();
+        UUID org_uuid_3  = UUIDUtils.newTimeUUID();
 
-        String user_name_1 = "user_" + rand1;
-        String user_name_2 = "user_" + rand2;
+        String user_name_1 = "user1_" + rand1;
+        String user_name_2 = "user2_" + rand2;
+        String user_name_3 = "user3_" + rand3;
 
-        String org_name_1  = "org_"  + rand1;
-        String org_name_2  = "org_"  + rand2;
+        String org_name_1  = "org1_"  + rand1;
+        String org_name_2  = "org2_"  + rand2;
+        String org_name_3  = "org3_"  + rand3;
 
         // loop through resource files with prefix 'admin-user' those are the data file templates
 
@@ -179,15 +188,19 @@ public class ExportImportAdminsTest {
 
                 fileContent = fileContent.replaceAll( "USER_UUID_1", user_uuid_1.toString() );
                 fileContent = fileContent.replaceAll( "USER_UUID_2", user_uuid_2.toString() );
+                fileContent = fileContent.replaceAll( "USER_UUID_3", user_uuid_3.toString() );
 
                 fileContent = fileContent.replaceAll( "ORG_UUID_1",  org_uuid_1.toString() );
                 fileContent = fileContent.replaceAll( "ORG_UUID_2",  org_uuid_2.toString() );
+                fileContent = fileContent.replaceAll( "ORG_UUID_3",  org_uuid_3.toString() );
 
                 fileContent = fileContent.replaceAll( "USER_NAME_1", user_name_1 );
                 fileContent = fileContent.replaceAll( "USER_NAME_2", user_name_2 );
+                fileContent = fileContent.replaceAll( "USER_NAME_3", user_name_3 );
 
                 fileContent = fileContent.replaceAll( "ORG_NAME_1", org_name_1 );
                 fileContent = fileContent.replaceAll( "ORG_NAME_2", org_name_2 );
+                fileContent = fileContent.replaceAll( "ORG_NAME_3", org_name_3 );
 
                 FileOutputStream os = new FileOutputStream(
                         tempDir.getAbsolutePath() + File.separator + fileName );
@@ -200,35 +213,45 @@ public class ExportImportAdminsTest {
         // import data from temp directory
 
         ImportAdmins importAdmins = new ImportAdmins();
-        importAdmins.startTool( new String[] {
-            "-host", "localhost:" + ServiceITSuite.cassandraResource.getRpcPort(),
-            "-inputDir", tempDir.getAbsolutePath()
+        importAdmins.startTool( new String[]{
+                "-host", "localhost:" + ServiceITSuite.cassandraResource.getRpcPort(),
+                "-inputDir", tempDir.getAbsolutePath()
         }, false );
 
         // verify that users and orgs were created correctly
 
         OrganizationInfo orgInfo1 = setup.getMgmtSvc().getOrganizationByUuid( org_uuid_1 );
-        assertNotNull( orgInfo1 );
+        assertNotNull( "org 1 exists", orgInfo1 );
+        List<UserInfo> org1_users = setup.getMgmtSvc().getAdminUsersForOrganization( org_uuid_1 );
+        assertEquals("org1 has one user", 1, org1_users.size() );
 
         OrganizationInfo orgInfo2 = setup.getMgmtSvc().getOrganizationByUuid( org_uuid_2 );
-        assertNotNull( orgInfo2 );
+        assertNotNull( "org 2 exists", orgInfo2 );
+        List<UserInfo> org2_users = setup.getMgmtSvc().getAdminUsersForOrganization( org_uuid_2 );
+        assertEquals( "org2 has two users", 2, org2_users.size() );
+        
+        OrganizationInfo orgInfo3 = setup.getMgmtSvc().getOrganizationByUuid( org_uuid_3 );
+        assertNotNull( "org 3 exists", orgInfo3 );
+        List<UserInfo> org3_users = setup.getMgmtSvc().getAdminUsersForOrganization( org_uuid_3 );
+        assertEquals( "org 3 has 1 users", 1, org3_users.size() );
 
         BiMap<UUID, String> user1_orgs = setup.getMgmtSvc().getOrganizationsForAdminUser( user_uuid_1 );
-        assertEquals("user1 has two orgs", 2, user1_orgs.size() );
-
+        assertEquals( "user 1 has 2 orgs", 2, user1_orgs.size() );
+        
         BiMap<UUID, String> user2_orgs = setup.getMgmtSvc().getOrganizationsForAdminUser( user_uuid_2 );
-        assertEquals("user2 has one orgs", 1, user2_orgs.size() );
+        assertEquals( "user 2 has two orgs gained one from duplicate", 2, user2_orgs.size() );
 
-        List<UserInfo> org1_users = setup.getMgmtSvc().getAdminUsersForOrganization( org_uuid_1 );
-        assertEquals("org1 has one user", 1, org1_users.size() );
+        try {
+            BiMap<UUID, String> user3_orgs = setup.getMgmtSvc().getOrganizationsForAdminUser( user_uuid_3 );
+            fail("fetch user 3 should have thrown exception");
+        } catch ( Exception expected ) {
+            logger.info("EXCEPTION EXPECTED");
+        }
 
-        List<UserInfo> org2_users = setup.getMgmtSvc().getAdminUsersForOrganization( org_uuid_2 );
-        assertEquals("org2 has two users", 2, org2_users.size() );
+        EntityManager em = setup.getEmf().getEntityManager( MANAGEMENT_APPLICATION_ID );
+        Entity user3 = em.get( user_uuid_3 );
+        assertNull( "duplicate user does not exist", user3 );
 
-        UserInfo user1info = setup.getMgmtSvc().getAdminUserByUuid( user_uuid_1 );
-        Map<String, Object> user1_data = setup.getMgmtSvc().getAdminUserOrganizationData( user1info, false );
-        Map<String, Object> user1_data_orgs = (Map<String, Object>)user1_data.get("organizations");
-        assertEquals( 2, user1_data_orgs.size());
 
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/16de78d9/stack/tools/src/test/resources/admin-user-metadata.usergrid-management.1433331614293.json
----------------------------------------------------------------------
diff --git a/stack/tools/src/test/resources/admin-user-metadata.usergrid-management.1433331614293.json b/stack/tools/src/test/resources/admin-user-metadata.usergrid-management.1433331614293.json
index 320f8ed..86d7363 100644
--- a/stack/tools/src/test/resources/admin-user-metadata.usergrid-management.1433331614293.json
+++ b/stack/tools/src/test/resources/admin-user-metadata.usergrid-management.1433331614293.json
@@ -81,5 +81,57 @@
         }
       }
     }
+  }, 
+  "USER_UUID_3" : {
+    "activities": [],
+    "devices": [],
+    "feed": [
+      "4c8fee64-09e5-11e5-b3c6-57cd4e12c0b1"
+    ],
+    "groups": [
+      "4c88c26a-09e5-11e5-8a66-594dd93a503d"
+    ],
+    "roles": [],
+    "connections": {},
+    "organizations": [
+      {
+        "uuid": "ORG_UUID_3",
+        "name": "ORG_NAME_3"
+      }
+    ],
+    "dictionaries": {
+      "credentials": {
+        "mongo_pwd": {
+          "recoverable": true,
+          "encrypted": false,
+          "secret": "e7b4fc7db5b97088997e44eced015d42",
+          "hashType": null,
+          "created": 1433331614067,
+          "cryptoChain": [
+            "plaintext"
+          ]
+        },
+        "password": {
+          "recoverable": false,
+          "encrypted": true,
+          "secret": "JDJhJDA5JER0RTdNSldMRjkxSUlJVm5hZWJMTy5DelFLemwvd2tXdUttaHViZWdyRjRURVdxYk5TUGJt",
+          "hashType": null,
+          "created": 1433331614018,
+          "cryptoChain": [
+            "bcrypt"
+          ]
+        },
+        "secret": {
+          "recoverable": true,
+          "encrypted": false,
+          "secret": "YWQ6Rx9A-m5U-TihpkPVS4PmyQO4qig",
+          "hashType": null,
+          "created": 1433331614067,
+          "cryptoChain": [
+            "plaintext"
+          ]
+        }
+      }
+    }
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/16de78d9/stack/tools/src/test/resources/admin-users.usergrid-management.1433331614293.json
----------------------------------------------------------------------
diff --git a/stack/tools/src/test/resources/admin-users.usergrid-management.1433331614293.json b/stack/tools/src/test/resources/admin-users.usergrid-management.1433331614293.json
index 5f192bf..3f15986 100644
--- a/stack/tools/src/test/resources/admin-users.usergrid-management.1433331614293.json
+++ b/stack/tools/src/test/resources/admin-users.usergrid-management.1433331614293.json
@@ -20,4 +20,16 @@
   "activated" : true,
   "confirmed" : true,
   "disabled" : false
+}, {
+  "uuid" : "USER_UUID_3",
+  "type" : "user",
+  "name" : "USER_NAME_3",
+  "created" : 1433331614002,
+  "modified" : 1433331614002,
+  "username" : "USER_NAME_3",
+  "comment" : "this is a duplicate user, has same email address as user2",
+  "email" : "USER_NAME_2@example.com",
+  "activated" : true,
+  "confirmed" : true,
+  "disabled" : false
 } ]
\ No newline at end of file


[3/6] incubator-usergrid git commit: Better checks for missing creds.

Posted by sn...@apache.org.
Better checks for missing creds.


Project: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/commit/e1b352ef
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/e1b352ef
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/e1b352ef

Branch: refs/heads/import-fixes
Commit: e1b352ef96da0ff687be87092c35eb3067592ee4
Parents: 9c459f4
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Jul 15 13:57:40 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Jul 15 13:57:40 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ExportAdmins.java | 37 ++++++++------------
 .../org/apache/usergrid/tools/ImportAdmins.java |  5 +--
 2 files changed, 17 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/e1b352ef/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
index d726ad3..2c14da1 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
@@ -315,42 +315,33 @@ public class ExportAdmins extends ExportingToolBase {
 
         private void addDictionariesToTask(AdminUserWriteTask task, Entity entity) throws Exception {
             EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
+            
+            task.dictionariesByName = new HashMap<String, Map<Object, Object>>();
 
             Set<String> dictionaries = em.getDictionaries( entity );
             
             if ( dictionaries.isEmpty() ) {
                 logger.error("User {}:{} has no dictionaries", task.adminUser.getName(), task.adminUser.getUuid() );
+                return;
             }
 
-            task.dictionariesByName = new HashMap<String, Map<Object, Object>>();
+            Map<Object, Object> credentialsDictionary = em.getDictionaryAsMap( entity, "credentials" );
 
-            for (String dictionary : dictionaries) {
-                Map<Object, Object> dict = em.getDictionaryAsMap( entity, dictionary );
-                if ( dict.isEmpty() ) {
-                    continue;
-                }
-                task.dictionariesByName.put( dictionary, dict );
-            }
-           
-            if ( task.dictionariesByName.isEmpty() ) {
-                logger.error( "User {}:{} has no dictionaries",
-                        new Object[]{task.adminUser.getName(), task.adminUser.getUuid() } );
-                
-            } else if ( task.dictionariesByName.get("credentials") == null ) {
-                logger.error( "User {}:{} has no credentials dictionary",
-                        new Object[]{task.adminUser.getName(), task.adminUser.getUuid() } );
-                
-            } else {
-                if ( task.dictionariesByName.get("credentials").get("password") == null ) {
+            if ( credentialsDictionary != null && !credentialsDictionary.isEmpty() ) {
+                task.dictionariesByName.put( "credentials", credentialsDictionary );
+
+                if (credentialsDictionary.get( "password" ) == null) {
                     logger.error( "User {}:{} has no password in credential dictionary",
-                            new Object[]{task.adminUser.getName(), task.adminUser.getUuid() } );
+                        new Object[]{task.adminUser.getName(), task.adminUser.getUuid()} );
                 }
-                if ( task.dictionariesByName.get("credentials").get("secret") == null ) {
+                if (credentialsDictionary.get( "secret" ) == null) {
                     logger.error( "User {}:{} has no secret in credential dictionary",
-                            new Object[]{task.adminUser.getName(), task.adminUser.getUuid() } );
+                        new Object[]{task.adminUser.getName(), task.adminUser.getUuid()} );
                 }
+            } else {
+                logger.error( "User {}:{} has no or empty credentials dictionary",
+                    new Object[]{task.adminUser.getName(), task.adminUser.getUuid()} );
             }
-                
         }
 
         private void addOrganizationsToTask(AdminUserWriteTask task) throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/e1b352ef/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
index 0b69a98..0b693c8 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ImportAdmins.java
@@ -382,7 +382,7 @@ public class ImportAdmins extends ToolBase {
                 String entityOwnerId = jp.getCurrentName();
 
                 try {
-                    EntityRef entityRef = em.getRef( UUID.fromString( entityOwnerId ) );
+                    EntityRef entityRef = em.get( UUID.fromString( entityOwnerId ) );
                     Map<String, Object> metadata = (Map<String, Object>) jp.readValueAs( Map.class );
                     
                     workQueue.put( new ImportMetadataTask( entityRef, metadata ) );
@@ -414,7 +414,8 @@ public class ImportAdmins extends ToolBase {
             User user = em.get(entityRef, User.class);
             
             if (user == null) {
-                logger.error("User with uuid={} not found, not adding to organizations");
+                logger.error("User not found, not adding to organizations: " 
+                    + (entityRef == null ? null : entityRef.getUuid()));
 
             } else {