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/22 14:08:51 UTC

[01/23] incubator-usergrid git commit: Remove unnecessary code, use user->org mapping to work around issues with getOrganizationsForAdminUser().

Repository: incubator-usergrid
Updated Branches:
  refs/heads/two-dot-o 3b289aa2a -> 764a7c85e


Remove unnecessary code, use user->org mapping to work around issues with getOrganizationsForAdminUser().


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

Branch: refs/heads/two-dot-o
Commit: 4bd1115c443b3b215e882edec34e99b65735a69e
Parents: 107a465
Author: Dave Johnson <dm...@apigee.com>
Authored: Thu Jun 25 13:34:52 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Thu Jun 25 13:34:52 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ExportAdmins.java | 268 ++++++++++---------
 .../org/apache/usergrid/tools/ImportAdmins.java | 239 ++++++++---------
 stack/tools/src/main/resources/log4j.properties |   6 +-
 3 files changed, 252 insertions(+), 261 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/4bd1115c/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 e781a1c..f5d1b1d 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
@@ -18,11 +18,14 @@
 package org.apache.usergrid.tools;
 
 
+import au.com.bytecode.opencsv.CSVWriter;
 import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.cli.Options;
+import org.apache.usergrid.management.UserInfo;
 import org.apache.usergrid.persistence.*;
 import org.apache.usergrid.persistence.Results.Level;
 import org.apache.usergrid.persistence.cassandra.CassandraService;
@@ -31,10 +34,12 @@ import org.codehaus.jackson.JsonGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.io.FileWriter;
 import java.util.*;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEMENT_APPLICATION_ID;
 
 
 /**
@@ -48,20 +53,34 @@ public class ExportAdmins extends ExportingToolBase {
     public static final String ADMIN_USERS_PREFIX = "admin-users";
     public static final String ADMIN_USER_METADATA_PREFIX = "admin-user-metadata";
     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 );
+   
+    
     /**
      * Represents an AdminUser that has been read and is ready for export.
      */
     class AdminUserWriteTask {
         Entity                           adminUser;
-        Map<String, List<UUID>>          collectionsByName;
-        Map<String, List<ConnectionRef>> connectionsByType;
         Map<String, Map<Object, Object>> dictionariesByName;
         BiMap<UUID, String>              orgNamesByUuid;
     }
 
+    
+    /**
+     * Represents an organization associated with a user.
+     */
+    private class Org {
+        UUID orgId;
+        String orgName;
+        public Org( UUID orgId, String orgName ) {
+            this.orgId = orgId;
+            this.orgName = orgName;
+        }
+    }
+
 
     /**
      * Export admin users using multiple threads.
@@ -93,6 +112,8 @@ public class ExportAdmins extends ExportingToolBase {
             readThreadCount = 20;
         }
 
+        buildOrgMap();
+                
         // start write queue worker
 
         BlockingQueue<AdminUserWriteTask> writeQueue = new LinkedBlockingQueue<AdminUserWriteTask>();
@@ -124,7 +145,7 @@ public class ExportAdmins extends ExportingToolBase {
         while (ids.size() > 0) {
             for (UUID uuid : ids.getIds()) {
                 readQueue.add( uuid );
-                logger.debug( "Added uuid to readQueue: " + uuid );
+                //logger.debug( "Added uuid to readQueue: " + uuid );
             }
             if (ids.getCursor() == null) {
                 break;
@@ -139,9 +160,15 @@ public class ExportAdmins extends ExportingToolBase {
         }
 
         logger.debug( "Waiting for write thread to complete" );
-        writeThread.join();
+        
+        boolean done = false;
+        while ( !done ) {
+            writeThread.join( 10000, 0 );
+            done = !writeThread.isAlive();
+            logger.info( "Wrote {} users", count.get() );
+        }
     }
-
+    
 
     @Override
     @SuppressWarnings("static-access")
@@ -157,6 +184,76 @@ public class ExportAdmins extends ExportingToolBase {
     }
 
 
+    /**
+     * Shouldn't have to do this but getOrganizationsForAdminUser() is not 100% reliable in some Usergrid installations.
+     */
+    private void buildOrgMap() throws Exception {
+
+        logger.info("Building org map");
+
+        ExecutorService execService = Executors.newFixedThreadPool( this.readThreadCount );
+
+        EntityManager em = emf.getEntityManager( MANAGEMENT_APPLICATION_ID );
+        String queryString = "select *";
+        Query query = Query.fromQL( queryString );
+        query.withLimit( 1000 );
+        Results organizations = null;
+        int count = 0;
+        do {
+            organizations = em.searchCollection( em.getApplicationRef(), "groups", query );
+            for ( Entity organization : organizations.getEntities() ) {
+                execService.submit( new OrgMapWorker( organization ) );
+            }
+            count++;
+            if ( count % 1000 == 0 ) {
+                logger.info("Processed {} orgs for org map", count);
+            }
+            query.setCursor( organizations.getCursor() );
+        }
+        while ( organizations != null && organizations.hasCursor() );
+
+        execService.shutdown();
+        while ( !execService.awaitTermination( 10, TimeUnit.SECONDS ) ) {
+            logger.info("Processed {} orgs for map", orgMap.size() );
+        }
+    }
+
+
+    public class OrgMapWorker implements Runnable {
+        private final Entity orgEntity;
+        
+        public OrgMapWorker( Entity orgEntity ) {
+            this.orgEntity = orgEntity;
+        }
+        
+        @Override
+        public void run() {
+            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 );
+                        }
+                        orgs.add( new Org( orgId, orgName ) );
+
+                        //logger.debug("Added org {} for user {}", orgName, admin.getProperty( "username" ));
+
+                    } catch (Exception e) {
+                        logger.warn( "Cannot get orgs for userId {}", user.getUuid() );
+                    }
+                }
+            } catch ( Exception e ) {
+                logger.error("Error getting users for org {}:{}", orgEntity.getName(), orgEntity.getUuid());
+            }
+        }
+    }
+
+
     public class AdminUserReader implements Runnable {
 
         private boolean done = true;
@@ -189,7 +286,7 @@ public class ExportAdmins extends ExportingToolBase {
                 UUID uuid = null;
                 try {
                     uuid = readQueue.poll( 30, TimeUnit.SECONDS );
-                    logger.debug("Got item from entityId queue: " + uuid );
+                    //logger.debug("Got item from entityId queue: " + uuid );
 
                     if ( uuid == null && done ) {
                         break;
@@ -200,10 +297,8 @@ public class ExportAdmins extends ExportingToolBase {
                     AdminUserWriteTask task = new AdminUserWriteTask();
                     task.adminUser = entity;
 
-                    addCollectionsToTask(   task, entity );
                     addDictionariesToTask(  task, entity );
-                    addConnectionsToTask(   task, entity );
-                    addOrganizationsToTask( task, entity );
+                    addOrganizationsToTask( task );
 
                     writeQueue.add( task );
 
@@ -214,41 +309,14 @@ public class ExportAdmins extends ExportingToolBase {
         }
 
 
-        private void addCollectionsToTask(AdminUserWriteTask task, Entity entity) throws Exception {
-
-            EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
-            Set<String> collections = em.getCollections( entity );
-            if ((collections == null) || collections.isEmpty()) {
-                return;
-            }
-
-            task.collectionsByName = new HashMap<String, List<UUID>>();
-
-            for (String collectionName : collections) {
-
-                List<UUID> uuids = task.collectionsByName.get( collectionName );
-                if ( uuids == null ) {
-                    uuids = new ArrayList<UUID>();
-                    task.collectionsByName.put( collectionName, uuids );
-                }
-
-                Results collectionMembers = em.getCollection( entity, collectionName, null, 100000, Level.IDS, false );
-
-                List<UUID> entityIds = collectionMembers.getIds();
-
-                if ((entityIds != null) && !entityIds.isEmpty()) {
-                    for (UUID childEntityUUID : entityIds) {
-                        uuids.add( childEntityUUID );
-                    }
-                }
-            }
-        }
-
-
         private void addDictionariesToTask(AdminUserWriteTask task, Entity entity) throws Exception {
             EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
 
             Set<String> dictionaries = em.getDictionaries( entity );
+            
+            if ( dictionaries.isEmpty() ) {
+                logger.error("User {}:{} has no dictionaries", task.adminUser.getName(), task.adminUser.getUuid() );
+            }
 
             task.dictionariesByName = new HashMap<String, Map<Object, Object>>();
 
@@ -258,32 +326,26 @@ public class ExportAdmins extends ExportingToolBase {
             }
         }
 
+        private void addOrganizationsToTask(AdminUserWriteTask task) throws Exception {
 
-        private void addConnectionsToTask(AdminUserWriteTask task, Entity entity) throws Exception {
-            EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
-
-            task.connectionsByType = new HashMap<String, List<ConnectionRef>>();
-
-            Set<String> connectionTypes = em.getConnectionTypes( entity );
-            for (String connectionType : connectionTypes) {
+            task.orgNamesByUuid = managementService.getOrganizationsForAdminUser( task.adminUser.getUuid() );
 
-                List<ConnectionRef> connRefs = task.connectionsByType.get( connectionType );
-                if ( connRefs == null ) {
-                    connRefs = new ArrayList<ConnectionRef>();
-                }
-
-                Results results = em.getConnectedEntities( entity.getUuid(), connectionType, null, Level.IDS );
-                List<ConnectionRef> connections = results.getConnections();
-
-                for (ConnectionRef connectionRef : connections) {
-                    connRefs.add( connectionRef );
+            List<Org> orgs = orgMap.get( task.adminUser.getProperty( "username" ).toString().toLowerCase() );
+            
+            if ( orgs != null && task.orgNamesByUuid.size() < orgs.size() ) {
+                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() } );
             }
-        }
-
-
-        private void addOrganizationsToTask(AdminUserWriteTask task, Entity entity) throws Exception {
-            task.orgNamesByUuid = managementService.getOrganizationsForAdminUser( entity.getUuid() );
         }
 
         public void setDone(boolean done) {
@@ -325,8 +387,6 @@ public class ExportAdmins extends ExportingToolBase {
                     getJsonGenerator( createOutputFile( ADMIN_USER_METADATA_PREFIX, em.getApplication().getName() ) );
             metadataFile.writeStartObject();
 
-            int count = 0;
-
             while ( true ) {
 
                 try {
@@ -340,18 +400,20 @@ public class ExportAdmins extends ExportingToolBase {
                     echo( task.adminUser );
 
                     // write metadata to metadata file
-                    saveCollections(   metadataFile, task );
-                    saveConnections(   metadataFile, task );
-                    saveOrganizations( metadataFile, task );
-                    saveDictionaries(  metadataFile, task );
+                    metadataFile.writeFieldName( task.adminUser.getUuid().toString() );
+                    metadataFile.writeStartObject();
 
-                    logger.debug("Exported user {}", task.adminUser.getProperty( "email" ));
-
-                    count++;
-                    if ( count % 1000 == 0 ) {
-                        logger.info("Exported {} admin users", count);
-                    }
+                    saveOrganizations( metadataFile, task );
+                    saveDictionaries( metadataFile, task );
+                    
+                    metadataFile.writeEndObject();
+                    
+                    logger.debug( "Exported user {}:{}:{}", new Object[] {
+                        task.adminUser.getProperty("username"),
+                        task.adminUser.getProperty("email"),
+                        task.adminUser.getUuid() } );
 
+                    count.addAndGet( 1 );
 
                 } catch (InterruptedException e) {
                     throw new Exception("Interrupted", e);
@@ -364,32 +426,7 @@ public class ExportAdmins extends ExportingToolBase {
             usersFile.writeEndArray();
             usersFile.close();
 
-            logger.info("Exported TOTAL {} admin users", count);
-        }
-
-
-        private void saveCollections( JsonGenerator jg, AdminUserWriteTask task ) throws Exception {
-
-            jg.writeFieldName( task.adminUser.getUuid().toString() );
-            jg.writeStartObject();
-
-            for (String collectionName : task.collectionsByName.keySet() ) {
-
-                jg.writeFieldName( collectionName );
-                jg.writeStartArray();
-
-                List<UUID> entityIds = task.collectionsByName.get( collectionName );
-
-                if ((entityIds != null) && !entityIds.isEmpty()) {
-                    for (UUID childEntityUUID : entityIds) {
-                        jg.writeObject( childEntityUUID.toString() );
-                    }
-                }
-
-                jg.writeEndArray();
-            }
-
-            jg.writeEndObject();
+            logger.info( "Exported TOTAL {} admin users", count );
         }
 
 
@@ -421,27 +458,6 @@ public class ExportAdmins extends ExportingToolBase {
         }
 
 
-        private void saveConnections( JsonGenerator jg, AdminUserWriteTask task ) throws Exception {
-
-            jg.writeFieldName( "connections" );
-            jg.writeStartObject();
-
-            for (String connectionType : task.connectionsByType.keySet() ) {
-
-                jg.writeFieldName( connectionType );
-                jg.writeStartArray();
-
-                List<ConnectionRef> connections = task.connectionsByType.get( connectionType );
-                for (ConnectionRef connectionRef : connections) {
-                    jg.writeObject( connectionRef.getConnectedEntity().getUuid() );
-                }
-
-                jg.writeEndArray();
-            }
-            jg.writeEndObject();
-        }
-
-
         private void saveOrganizations( JsonGenerator jg, AdminUserWriteTask task ) throws Exception {
 
             final BiMap<UUID, String> orgs = task.orgNamesByUuid;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/4bd1115c/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 d05c9a8..857e97e 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
@@ -40,6 +40,7 @@ import java.util.*;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import static org.apache.usergrid.persistence.Schema.PROPERTY_TYPE;
 import static org.apache.usergrid.persistence.Schema.PROPERTY_UUID;
@@ -47,9 +48,11 @@ import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEM
 
 
 /**
- * TODO: REFACTOR EVERYTHING TO USE JSON NODES
- * Example on how to run:
- * java -jar usergrid-tools.jar ImportAdmins -host cassandraHost -v -inputDir exportFilesDirectory
+ * Usage example: 
+ * 
+ * java -Xmx8000m -Dlog4j.configuration=file:/home/dmjohnson/import-admins/log4j.properties -classpath . \
+ *      -jar usergrid-tools-1.0.2.jar ImportAdmins -writeThreads 100 -auditThreads 100 -host cca03eadn \ 
+ *      -inputDir=/home/dmjohnson/export-admins/exported > import3.log 2>&1 &
  */
 public class ImportAdmins extends ToolBase {
 
@@ -73,6 +76,9 @@ public class ImportAdmins extends ToolBase {
 
     JsonFactory jsonFactory = new JsonFactory();
 
+    AtomicInteger userCount = new AtomicInteger( 0 );
+    AtomicInteger metadataCount = new AtomicInteger( 0 );
+
 
     @Override
     @SuppressWarnings("static-access")
@@ -102,8 +108,8 @@ public class ImportAdmins extends ToolBase {
         options.addOption(hostOption);
         options.addOption(writeThreads);
         options.addOption(auditThreads);
-        options.addOption(inputDir);
-        options.addOption(verbose);
+        options.addOption( inputDir );
+        options.addOption( verbose );
 
         return options;
     }
@@ -126,16 +132,12 @@ public class ImportAdmins extends ToolBase {
         }
 
         if (line.hasOption(WRITE_THREAD_COUNT)) {
-            writeThreadCount = Integer.parseInt(line.getOptionValue(WRITE_THREAD_COUNT));
+            writeThreadCount = Integer.parseInt( line.getOptionValue(WRITE_THREAD_COUNT));
         }
 
         importAdminUsers(writeThreadCount, auditThreadCount);
 
-        importMetadata(writeThreadCount);
-
-        // forces the counters to flush
-//        logger.info( "Sleeping 35 seconds for batcher" );
-//        Thread.sleep( 35000 );
+        importMetadata( writeThreadCount );
     }
 
 
@@ -190,10 +192,11 @@ public class ImportAdmins extends ToolBase {
 
             @SuppressWarnings("unchecked")
             Map<String, Object> entityProps = jp.readValueAs(HashMap.class);
-            if (loopCounter % 100 == 1)
-                logger.info("Publishing to queue... counter=" + loopCounter);
+            if (loopCounter % 1000 == 0) {
+                logger.debug( "Publishing to queue... counter=" + loopCounter );
+            }
 
-            workQueue.add(entityProps);
+            workQueue.add( entityProps );
         }
 
         waitForQueueAndMeasure(workQueue, adminWriteThreads, "Admin Write");
@@ -209,15 +212,15 @@ public class ImportAdmins extends ToolBase {
                                                final Map<Stoppable, Thread> threadMap,
                                                final String identifier) throws InterruptedException {
         double rateAverageSum = 0;
-        int iterationCounter = 0;
+        int iterations = 0;
 
         while (!workQueue.isEmpty()) {
-            iterationCounter += 1;
+            iterations += 1;
 
             int sizeLast = workQueue.size();
             long lastTime = System.currentTimeMillis();
             logger.info("Queue {} is not empty, remaining size={}, waiting...", identifier, sizeLast);
-            Thread.sleep(5000);
+            Thread.sleep(10000);
 
             long timeNow = System.currentTimeMillis();
             int sizeNow = workQueue.size();
@@ -229,12 +232,11 @@ public class ImportAdmins extends ToolBase {
             double rateLast = (double) processed / (timeDelta / 1000);
             rateAverageSum += rateLast;
 
-            long timeRemaining = (long) ( sizeLast / (rateAverageSum / iterationCounter) );
+            long timeRemaining = (long) ( sizeLast / (rateAverageSum / iterations) );
 
-            logger.info(
-                    String.format("++PROGRESS (%s): sizeLast=%s nowSize=%s processed=%s rateLast=%s/s rateAvg=%s/s timeRemaining=%s(s)",
-                            identifier, sizeLast, sizeNow, processed, rateLast, (rateAverageSum / iterationCounter), timeRemaining)
-            );
+            logger.info("++PROGRESS ({}): sizeLast={} nowSize={} processed={} rateLast={}/s rateAvg={}/s timeRemaining={}s",
+                new Object[] { 
+                    identifier, sizeLast, sizeNow, processed, rateLast, (rateAverageSum / iterations), timeRemaining } );
         }
 
         for (Stoppable worker : threadMap.keySet()) {
@@ -249,6 +251,7 @@ public class ImportAdmins extends ToolBase {
             workerThread.start();
             adminAuditThreads.put(worker, workerThread);
         }
+        logger.info("Started {} admin auditors", workerCount);
 
     }
 
@@ -263,6 +266,8 @@ public class ImportAdmins extends ToolBase {
             workerThread.start();
             adminWriteThreads.put(worker, workerThread);
         }
+
+        logger.info("Started {} admin workers", workerCount);
     }
 
 
@@ -284,8 +289,8 @@ public class ImportAdmins extends ToolBase {
 
 
     private JsonParser getJsonParserForFile(File organizationFile) throws Exception {
-        JsonParser jp = jsonFactory.createJsonParser(organizationFile);
-        jp.setCodec(new ObjectMapper());
+        JsonParser jp = jsonFactory.createJsonParser( organizationFile );
+        jp.setCodec( new ObjectMapper() );
         return jp;
     }
 
@@ -312,10 +317,12 @@ public class ImportAdmins extends ToolBase {
 
         for (int x = 0; x < writeThreadCount; x++) {
             ImportMetadataWorker worker = new ImportMetadataWorker(workQueue);
-            Thread workerThread = new Thread(worker, "ImportMetadataTask-" + x);
+            Thread workerThread = new Thread(worker, "ImportMetadataTask-" + x );
             workerThread.start();
             metadataWorkerThreadMap.put(worker, workerThread);
         }
+        
+        logger.info( "Started {} metadata workers", writeThreadCount );
     }
 
 
@@ -362,7 +369,6 @@ public class ImportAdmins extends ToolBase {
                 Map<String, Object> metadata = (Map<String, Object>) jp.readValueAs(Map.class);
 
                 workQueue.put(new ImportMetadataTask(entityRef, metadata));
-//                importEntityMetadata(em, entityRef, metadata);
             }
         }
 
@@ -380,82 +386,11 @@ public class ImportAdmins extends ToolBase {
     private void importEntityMetadata(
             EntityManager em, EntityRef entityRef, Map<String, Object> metadata) throws Exception {
 
-        Map<String, Object> connectionsMap = (Map<String, Object>) metadata.get("connections");
-
-        if (connectionsMap != null && !connectionsMap.isEmpty()) {
-            for (String type : connectionsMap.keySet()) {
-                try {
-                    UUID uuid = UUID.fromString((String) connectionsMap.get(type));
-                    EntityRef connectedEntityRef = em.getRef(uuid);
-                    em.createConnection(entityRef, type, connectedEntityRef);
-
-                    logger.debug("Creating connection from {} type {} target {}",
-                            new Object[]{entityRef, type, connectedEntityRef});
-
-                } catch (Exception e) {
-                    if (logger.isDebugEnabled()) {
-                        logger.error("Error importing connection of type "
-                                + type + " for user " + entityRef.getUuid(), e);
-                    } else {
-                        logger.error("Error importing connection of type "
-                                + type + " for user " + 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 {} map {}",
-                            new Object[]{entityRef, name, dictionary});
-
-                } 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());
-                    }
-                }
-            }
-        }
-
-        List<String> collectionsList = (List<String>) metadata.get("collections");
-        if (collectionsList != null && !collectionsList.isEmpty()) {
-            for (String name : collectionsList) {
-                try {
-                    UUID uuid = UUID.fromString((String) connectionsMap.get(name));
-                    EntityRef collectedEntityRef = em.getRef(uuid);
-                    em.addToCollection(entityRef, name, collectedEntityRef);
-
-                    logger.debug("Add to collection of {} name {} entity {}",
-                            new Object[]{entityRef, name, collectedEntityRef});
-
-                } catch (Exception e) {
-                    if (logger.isDebugEnabled()) {
-                        logger.error("Error adding to collection "
-                                + name + " for user " + entityRef.getUuid(), e);
-                    } else {
-                        logger.error("Error adding to collection "
-                                + name + " for user " + entityRef.getUuid());
-                    }
-                }
-            }
-        }
-
-
         List<Object> organizationsList = (List<Object>) metadata.get("organizations");
         if (organizationsList != null && !organizationsList.isEmpty()) {
 
             User user = em.get(entityRef, User.class);
-
+            
             if (user == null) {
                 logger.error("User with uuid={} not found, not adding to organizations");
 
@@ -476,19 +411,55 @@ public class ImportAdmins extends ToolBase {
                             managementService.createOrganization(orgUuid, orgName, userInfo, false);
                             orgInfo = managementService.getOrganizationByUuid(orgUuid);
 
-                            logger.debug("Created new org {} for user {}",
-                                    new Object[]{orgInfo.getName(), user.getEmail()});
+                            logger.debug( "Created new org {} for user {}",
+                                    new Object[]{orgInfo.getName(), user.getEmail()} );
 
                         } catch (DuplicateUniquePropertyExistsException dpee) {
-                            logger.error("Org {} already exists", orgName);
+                            logger.debug( "Org {} already exists", orgName );
+                        }
+                    } else {
+                        try {
+                            managementService.addAdminUserToOrganization( userInfo, orgInfo, false );
+                            logger.debug( "Added user {} to org {}", new Object[]{user.getEmail(), orgName} );
+                            
+                        } catch ( Exception e ) {
+                            logger.error( "Error Adding user {} to org {}", new Object[]{user.getEmail(), orgName} );
                         }
+                    }
+                }
+            }
+
+        } 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} );
+
+                } catch (Exception e) {
+                    if (logger.isDebugEnabled()) {
+                        logger.error("Error importing dictionary name "
+                                + name + " for user " + entityRef.getUuid(), e);
                     } else {
-                        managementService.addAdminUserToOrganization(userInfo, orgInfo, false);
-                        logger.debug("Added user {} to org {}", new Object[]{user.getEmail(), orgName});
+                        logger.error("Error importing dictionary name "
+                                + name + " for user " + entityRef.getUuid());
                     }
                 }
             }
+            
+        } else {
+            logger.warn("User {} has no dictionaries", entityRef.getUuid() );
         }
+
+
     }
 
 
@@ -552,8 +523,7 @@ public class ImportAdmins extends ToolBase {
                     String type = getType(entityProps);
 
                     if (em.get(uuid) == null) {
-                        logger.error("Holy hell, we wrote an entity and it's missing.  " +
-                                "Entity Id was {} and type is {}", uuid, type);
+                        logger.error( "FATAL ERROR: wrote an entity {}:{} and it's missing", uuid, type );
                         System.exit(1);
                     }
 
@@ -563,8 +533,12 @@ public class ImportAdmins extends ToolBase {
 
                     long duration = stopTime - startTime;
                     durationSum += duration;
-                    logger.debug(String.format("Audited [%s]th admin", count));
-                    logger.info(String.format("Average Audit Rate: %s(ms)", durationSum / count));
+
+                    //logger.debug( "Audited {}th admin", count );
+                    
+                    if ( count % 100 == 0 ) {
+                        logger.info( "Audited {}. Average Audit Rate: {}(ms)", count, durationSum / count );
+                    }
 
                 } catch (InterruptedException e) {
                     e.printStackTrace();
@@ -572,8 +546,6 @@ public class ImportAdmins extends ToolBase {
                     e.printStackTrace();
                 }
             }
-
-            logger.warn("Done!");
         }
     }
 
@@ -619,24 +591,28 @@ public class ImportAdmins extends ToolBase {
                         Thread.sleep(1000);
                         continue;
                     }
-
-                    count++;
+                    
                     long startTime = System.currentTimeMillis();
+                    
                     importEntityMetadata(em, task.entityRef, task.metadata);
+                    
+                    metadataCount.addAndGet( 1 );
                     long stopTime = System.currentTimeMillis();
-
                     long duration = stopTime - startTime;
                     durationSum += duration;
-                    logger.debug(String.format("Imported [%s]th metadata", count));
-                    logger.info(String.format("Average metadata Imported Rate: %s(ms)", durationSum / count));
+                    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 });
+                    }
 
                 } catch (Exception e) {
-                    e.printStackTrace();
-                    logger.debug("EXCEPTION", e);
+                    logger.debug("Error reading writing metadata", e);
                 }
             }
-
-            logger.warn("Done!");
         }
     }
 
@@ -650,7 +626,6 @@ public class ImportAdmins extends ToolBase {
 
         public ImportAdminWorker(final BlockingQueue<Map<String, Object>> workQueue,
                                  final BlockingQueue<Map<String, Object>> auditQueue) {
-            logger.info("New Worker!");
             this.workQueue = workQueue;
             this.auditQueue = auditQueue;
         }
@@ -684,27 +659,29 @@ public class ImportAdmins extends ToolBase {
                     UUID uuid = getId(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" ) } );
+
+                        userCount.addAndGet( 1 );
                         auditQueue.put(entityProps);
                         long stopTime = System.currentTimeMillis();
-
                         long duration = stopTime - startTime;
                         durationSum += duration;
-
+                        
                         count++;
-                        logger.debug(String.format("Imported [%s]th admin user %s  / %s", count, uuid, entityProps.get("username")));
-                        logger.info(String.format("Average Creation Rate: %s(ms)", durationSum / count));
-
-                        if (count % 100 == 0) {
-                            logger.info("Imported {} admin users", count);
+                        if (count % 30 == 0) {
+                            logger.info( "Imported {} admin users of total {}. Average Creation Rate: {}ms", 
+                                new Object[] { count, userCount.get(), durationSum / count });
                         }
+                        
                     } catch (DuplicateUniquePropertyExistsException de) {
-                        logger.warn("Unable to create entity. It appears to be a duplicate: " +
-                                        "id={}, type={}, name={}, username={}",
-                                new Object[]{uuid, type, entityProps.get("name"), entityProps.get("username")});
+                        logger.warn("Unable to create admin user {}:{}, duplicate property {}",
+                                new Object[]{ uuid, entityProps.get("username"), de.getPropertyName() });
                         if (logger.isDebugEnabled()) {
                             logger.debug("Exception", de);
                         }
@@ -716,8 +693,6 @@ public class ImportAdmins extends ToolBase {
                 }
 
             }
-
-            logger.warn("Done!");
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/4bd1115c/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 73ade48..6cf0a92 100644
--- a/stack/tools/src/main/resources/log4j.properties
+++ b/stack/tools/src/main/resources/log4j.properties
@@ -18,7 +18,7 @@
 # and the pattern to %c instead of %l.  (%l is slower.)
 
 # output messages into a rolling log file as well as stdout
-log4j.rootLogger=INFO,stdout
+log4j.rootLogger=WARN,stdout
 
 # stdout
 log4j.appender.stdout=org.apache.log4j.ConsoleAppender
@@ -26,9 +26,9 @@ 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=DEBUG
-log4j.logger.org.apache.usergrid.management.cassandra=DEBUB
+log4j.logger.org.apache.usergrid.tools=INFO
 
+log4j.logger.org.apache.usergrid.management.cassandra=WARN
 log4j.logger.org.apache.usergrid.persistence.cassandra.DB=WARN
 log4j.logger.org.apache.usergrid.persistence.cassandra.BATCH=WARN
 log4j.logger.org.apache.usergrid.persistence.cassandra.EntityManagerFactoryImpl=WARN


[07/23] incubator-usergrid git commit: Incrementing snapshot version to 1.0.3-SNAPSHOT.

Posted by sn...@apache.org.
Incrementing snapshot version to 1.0.3-SNAPSHOT.


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

Branch: refs/heads/two-dot-o
Commit: f5cc97038247e431f6451125329c64e5bb58f6c1
Parents: d52427b
Author: Dave Johnson <dm...@apigee.com>
Authored: Fri Jun 26 14:32:35 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Fri Jun 26 14:32:35 2015 -0400

----------------------------------------------------------------------
 .usergridversion | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/f5cc9703/.usergridversion
----------------------------------------------------------------------
diff --git a/.usergridversion b/.usergridversion
index 276823b..99eda91 100644
--- a/.usergridversion
+++ b/.usergridversion
@@ -1 +1 @@
-1.0.2-SNAPSHOT
+1.0.3-SNAPSHOT


[18/23] 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/b9af09eb
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/b9af09eb
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/b9af09eb

Branch: refs/heads/two-dot-o
Commit: b9af09ebf90b0b687df1817695babfeaa43385b5
Parents: 7a95109 ab149ae
Author: Dave Johnson <sn...@apache.org>
Authored: Mon Jul 6 19:20:44 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Mon Jul 6 19:20:44 2015 -0400

----------------------------------------------------------------------
 CHANGELOG                                       |   3 +
 LICENSE                                         |  10 +
 stack/LICENSE-2.0.txt                           | 202 -------------------
 .../applications/assets/AssetResourceIT.java    |   2 +-
 .../src/test/resources/cat-larger-than-6mb.jpg  | Bin 9799257 -> 0 bytes
 .../src/test/resources/ship-larger-than-6mb.gif | Bin 0 -> 7407487 bytes
 6 files changed, 14 insertions(+), 203 deletions(-)
----------------------------------------------------------------------



[23/23] incubator-usergrid git commit: Merge branch 'master' into two-dot-o

Posted by sn...@apache.org.
Merge branch 'master' into two-dot-o

Conflicts:
	CHANGELOG
	stack/rest/pom.xml
	stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
	stack/tools/src/main/resources/log4j.properties


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

Branch: refs/heads/two-dot-o
Commit: 764a7c85ebf4eeaa720209f46fe02fb96a47c760
Parents: 3b289aa e1b352e
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Jul 22 08:08:36 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Jul 22 08:08:36 2015 -0400

----------------------------------------------------------------------
 CHANGELOG                                       |   3 -
 LICENSE                                         |  49 +--
 NOTICE                                          |   3 +-
 .../css/arsmarquette/ARSMaquettePro-Light.otf   | Bin 184600 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Medium.otf  | Bin 188020 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Regular.otf | Bin 188096 -> 0 bytes
 portal/css/main.css                             |  15 -
 portal/css/main.min.css                         |   2 +-
 release/release-candidate.sh                    |  10 -
 stack/LICENSE-2.0.txt                           | 202 ------------
 .../applications/assets/AssetResourceIT.java    |   2 +-
 .../src/test/resources/cat-larger-than-6mb.jpg  | Bin 9799257 -> 0 bytes
 .../src/test/resources/ship-larger-than-6mb.gif | Bin 0 -> 7407487 bytes
 .../org/apache/usergrid/tools/ExportAdmins.java | 323 ++++++++++---------
 .../org/apache/usergrid/tools/ImportAdmins.java | 298 ++++++++---------
 .../org/apache/usergrid/tools/UserManager.java  |  22 ++
 stack/tools/src/main/resources/log4j.properties |   6 +-
 17 files changed, 378 insertions(+), 557 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/764a7c85/CHANGELOG
----------------------------------------------------------------------
diff --cc CHANGELOG
index 70ea277,5e692fc..47a080a
--- a/CHANGELOG
+++ b/CHANGELOG
@@@ -1,6 -1,15 +1,3 @@@
 -Usergrid 1.0.2
 ---------------------------------------------------------------------------------
 -
 -Usergrid 1.0.2
 ---------------------------------------------------------------------------------
 -
 -Usergrid 1.0.2
 ---------------------------------------------------------------------------------
 -
--Usergrid 1.0.2
----------------------------------------------------------------------------------
--
  
  Usergrid 1.0.2
  --------------------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/764a7c85/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
----------------------------------------------------------------------
diff --cc stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
index 0fb5149,b048327..b318065
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
@@@ -334,15 -313,13 +334,15 @@@ public class AssetResourceIT extends Ab
  
          try {
  
 -            UserRepo.INSTANCE.load( resource(), access_token );
 +            //UserRepo.INSTANCE.load( resource(), access_token );
  
-             byte[] data = IOUtils.toByteArray( this.getClass().getResourceAsStream( "/cat-larger-than-6mb.jpg" ) );
+             byte[] data = IOUtils.toByteArray( this.getClass().getResourceAsStream( "/ship-larger-than-6mb.gif" ) );
              FormDataMultiPart form = new FormDataMultiPart().field( "file", data, MediaType.MULTIPART_FORM_DATA_TYPE );
  
 +            String orgAppPath = clientSetup.getOrganizationName() + "/" + clientSetup.getAppName();
 +
              // send data
 -            JsonNode node = resource().path( "/test-organization/test-app/bars" ).queryParam( "access_token", access_token )
 +            JsonNode node = resource().path( orgAppPath + "/bars" ).queryParam( "access_token", access_token )
                      .accept( MediaType.APPLICATION_JSON ).type( MediaType.MULTIPART_FORM_DATA )
                      .post( JsonNode.class, form );
              //logNode( node );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/764a7c85/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
----------------------------------------------------------------------
diff --cc stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
index 75064a2,2c14da1..e175d01
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/ExportAdmins.java
@@@ -14,40 -14,51 +14,47 @@@
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
- 
  package org.apache.usergrid.tools;
  
 -
  import com.google.common.collect.BiMap;
+ import com.google.common.collect.HashBiMap;
  import org.apache.commons.cli.CommandLine;
  import org.apache.commons.cli.Option;
  import org.apache.commons.cli.OptionBuilder;
  import org.apache.commons.cli.Options;
 +import org.apache.usergrid.corepersistence.util.CpNamingUtils;
- import org.apache.usergrid.persistence.ConnectionRef;
+ import org.apache.usergrid.management.UserInfo;
  import org.apache.usergrid.persistence.Entity;
  import org.apache.usergrid.persistence.EntityManager;
 -import org.apache.usergrid.persistence.Query;
  import org.apache.usergrid.persistence.Results;
--import org.apache.usergrid.persistence.Results.Level;
--import org.apache.usergrid.persistence.cassandra.CassandraService;
 +import org.apache.usergrid.persistence.index.query.Query;
  import org.apache.usergrid.utils.StringUtils;
  import org.codehaus.jackson.JsonGenerator;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- import java.util.UUID;
- import java.util.concurrent.BlockingQueue;
- import java.util.concurrent.LinkedBlockingQueue;
- import java.util.concurrent.TimeUnit;
+ import java.util.*;
+ import java.util.concurrent.*;
+ import java.util.concurrent.atomic.AtomicInteger;
  
 -import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEMENT_APPLICATION_ID;
 -
  
  /**
-  * Export Admin Users and metadata including organizations.
+  * Export Admin Users and metadata including organizations and passwords.
+  *
+  * Usage Example:
 - * 
++ *
+  * java -Xmx8000m -Dlog4j.configuration=file:/home/me/log4j.properties -classpath . \
+  *      -jar usergrid-tools-1.0.2.jar ImportAdmins -writeThreads 100 -auditThreads 100 \
+  *      -host casshost -inputDir=/home/me/export-data
 - * 
++ *
+  * If you want to provide any property overrides, put properties file named usergrid-custom-tools.properties
+  * in the same directory where you run the above command. For example, you might want to set the Cassandra
+  * client threads and export from a specific set of keyspaces:
 - * 
 + *
-  * java -jar usergrid-tools.jar ExportAdmins
+  *    cassandra.connections=110
+  *    cassandra.system.keyspace=My_Usergrid
+  *    cassandra.application.keyspace=My_Usergrid_Applications
+  *    cassandra.lock.keyspace=My_Usergrid_Locks
   */
  public class ExportAdmins extends ExportingToolBase {
  
@@@ -55,9 -66,12 +62,12 @@@
      public static final String ADMIN_USERS_PREFIX = "admin-users";
      public static final String ADMIN_USER_METADATA_PREFIX = "admin-user-metadata";
      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 );
 -   
 -    
++
 +
      /**
       * Represents an AdminUser that has been read and is ready for export.
       */
@@@ -69,8 -81,21 +77,21 @@@
          BiMap<UUID, String>              orgNamesByUuid;
      }
  
 -    
 +
      /**
+      * Represents an organization associated with a user.
+      */
+     private class Org {
+         UUID orgId;
+         String orgName;
+         public Org( UUID orgId, String orgName ) {
+             this.orgId = orgId;
+             this.orgName = orgName;
+         }
+     }
+ 
+ 
+     /**
       * Export admin users using multiple threads.
       * <p/>
       * How it works:
@@@ -100,6 -125,8 +121,8 @@@
              readThreadCount = 20;
          }
  
+         buildOrgMap();
 -                
++
          // start write queue worker
  
          BlockingQueue<AdminUserWriteTask> writeQueue = new LinkedBlockingQueue<AdminUserWriteTask>();
@@@ -124,8 -151,8 +147,8 @@@
  
          Query query = new Query();
          query.setLimit( MAX_ENTITY_FETCH );
--        query.setResultsLevel( Level.IDS );
--        EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
++        query.setResultsLevel( Query.Level.IDS );
++        EntityManager em = emf.getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
          Results ids = em.searchCollection( em.getApplicationRef(), "users", query );
  
          while (ids.size() > 0) {
@@@ -140,15 -167,16 +163,16 @@@
              ids = em.searchCollection( em.getApplicationRef(), "users", query );
          }
  
-         adminUserWriter.setDone( true );
-         for (AdminUserReader aur : readers) {
-             aur.setDone( true );
-         }
- 
          logger.debug( "Waiting for write thread to complete" );
-         writeThread.join();
 -        
++
+         boolean done = false;
+         while ( !done ) {
+             writeThread.join( 10000, 0 );
+             done = !writeThread.isAlive();
+             logger.info( "Wrote {} users", count.get() );
+         }
      }
 -    
 +
  
      @Override
      @SuppressWarnings("static-access")
@@@ -164,9 -192,77 +188,77 @@@
      }
  
  
-     public class AdminUserReader implements Runnable {
+     /**
+      * Shouldn't have to do this but getOrganizationsForAdminUser() is not 100% reliable in some Usergrid installations.
+      */
+     private void buildOrgMap() throws Exception {
+ 
+         logger.info( "Building org map" );
+ 
+         ExecutorService execService = Executors.newFixedThreadPool( this.readThreadCount );
+ 
 -        EntityManager em = emf.getEntityManager( MANAGEMENT_APPLICATION_ID );
++        EntityManager em = emf.getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
+         String queryString = "select *";
+         Query query = Query.fromQL( queryString );
+         query.withLimit( 1000 );
+         Results organizations = null;
+         int count = 0;
+         do {
+             organizations = em.searchCollection( em.getApplicationRef(), "groups", query );
+             for ( Entity organization : organizations.getEntities() ) {
+                 execService.submit( new OrgMapWorker( organization ) );
+             }
+             count++;
+             if ( count % 1000 == 0 ) {
+                 logger.info("Processed {} orgs for org map", count);
+             }
+             query.setCursor( organizations.getCursor() );
+         }
+         while ( organizations != null && organizations.hasCursor() );
+ 
+         execService.shutdown();
+         while ( !execService.awaitTermination( 10, TimeUnit.SECONDS ) ) {
+             logger.info("Processed {} orgs for map", orgMap.size() );
+         }
+     }
+ 
  
-         private boolean done = true;
+     public class OrgMapWorker implements Runnable {
+         private final Entity orgEntity;
 -        
++
+         public OrgMapWorker( Entity orgEntity ) {
+             this.orgEntity = orgEntity;
+         }
 -        
++
+         @Override
+         public void run() {
+             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 );
+                         }
+                         orgs.add( new Org( orgId, orgName ) );
+ 
+                         //logger.debug("Added org {} for user {}", orgName, admin.getProperty( "username" ));
+ 
+                     } catch (Exception e) {
+                         logger.warn( "Cannot get orgs for userId {}", user.getUuid() );
+                     }
+                 }
+             } catch ( Exception e ) {
+                 logger.error("Error getting users for org {}:{}", orgEntity.getName(), orgEntity.getUuid());
+             }
+         }
+     }
+ 
+ 
+     public class AdminUserReader implements Runnable {
  
          private final BlockingQueue<UUID> readQueue;
          private final BlockingQueue<AdminUserWriteTask> writeQueue;
@@@ -189,7 -285,7 +281,7 @@@
  
          private void readAndQueueAdminUsers() throws Exception {
  
--            EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
++            EntityManager em = emf.getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
  
              while ( true ) {
  
@@@ -221,11 -313,15 +309,15 @@@
          }
  
  
-         private void addCollectionsToTask(AdminUserWriteTask task, Entity entity) throws Exception {
+         private void addDictionariesToTask(AdminUserWriteTask task, Entity entity) throws Exception {
 -            EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
 -            
++            EntityManager em = emf.getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
++
+             task.dictionariesByName = new HashMap<String, Map<Object, Object>>();
+ 
+             Set<String> dictionaries = em.getDictionaries( entity );
 -            
 +
-             EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
-             Set<String> collections = em.getCollections( entity );
-             if ((collections == null) || collections.isEmpty()) {
+             if ( dictionaries.isEmpty() ) {
+                 logger.error("User {}:{} has no dictionaries", task.adminUser.getName(), task.adminUser.getUuid() );
                  return;
              }
  
@@@ -251,50 -344,26 +340,26 @@@
              }
          }
  
+         private void addOrganizationsToTask(AdminUserWriteTask task) throws Exception {
  
-         private void addDictionariesToTask(AdminUserWriteTask task, Entity entity) throws Exception {
-             EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
- 
-             Set<String> dictionaries = em.getDictionaries( entity );
- 
-             task.dictionariesByName = new HashMap<String, Map<Object, Object>>();
- 
-             for (String dictionary : dictionaries) {
-                 Map<Object, Object> dict = em.getDictionaryAsMap( entity, dictionary );
-                 task.dictionariesByName.put( dictionary, dict );
-             }
-         }
- 
- 
-         private void addConnectionsToTask(AdminUserWriteTask task, Entity entity) throws Exception {
-             EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
- 
-             task.connectionsByType = new HashMap<String, List<ConnectionRef>>();
- 
-             Set<String> connectionTypes = em.getConnectionTypes( entity );
-             for (String connectionType : connectionTypes) {
- 
-                 List<ConnectionRef> connRefs = task.connectionsByType.get( connectionType );
-                 if ( connRefs == null ) {
-                     connRefs = new ArrayList<ConnectionRef>();
-                 }
+             task.orgNamesByUuid = managementService.getOrganizationsForAdminUser( task.adminUser.getUuid() );
  
-                 Results results = em.getConnectedEntities( entity.getUuid(), connectionType, null, Level.IDS );
-                 List<ConnectionRef> connections = results.getConnections();
+             List<Org> orgs = orgMap.get( task.adminUser.getProperty( "username" ).toString().toLowerCase() );
 -            
 +
-                 for (ConnectionRef connectionRef : connections) {
-                     connRefs.add( connectionRef );
+             if ( orgs != null && task.orgNamesByUuid.size() < orgs.size() ) {
+                 BiMap<UUID, String> bimap = HashBiMap.create();
+                 for (Org org : orgs) {
+                     bimap.put( org.orgId, org.orgName );
                  }
+                 task.orgNamesByUuid = bimap;
              }
-         }
- 
- 
-         private void addOrganizationsToTask(AdminUserWriteTask task, Entity entity) throws Exception {
-             task.orgNamesByUuid = managementService.getOrganizationsForAdminUser( entity.getUuid() );
-         }
 -            
 +
-         public void setDone(boolean done) {
-             this.done = done;
+             if ( task.orgNamesByUuid.isEmpty() ) {
+                 logger.error("{}:{}:{} has no orgs", new Object[] {
 -                        task.adminUser.getProperty("username"), 
 -                        task.adminUser.getProperty("email"), 
++                        task.adminUser.getProperty("username"),
++                        task.adminUser.getProperty("email"),
+                         task.adminUser.getUuid() } );
+             }
          }
      }
  
@@@ -320,7 -387,7 +383,7 @@@
  
  
          private void writeEntities() throws Exception {
--            EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
++            EntityManager em = emf.getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
  
              // write one JSON file for management application users
              JsonGenerator usersFile =
@@@ -347,18 -412,20 +408,20 @@@
                      echo( task.adminUser );
  
                      // write metadata to metadata file
-                     saveCollections(   metadataFile, task );
-                     saveConnections(   metadataFile, task );
+                     metadataFile.writeFieldName( task.adminUser.getUuid().toString() );
+                     metadataFile.writeStartObject();
+ 
                      saveOrganizations( metadataFile, task );
-                     saveDictionaries(  metadataFile, task );
+                     saveDictionaries( metadataFile, task );
 -                    
 +
-                     logger.debug("Exported user {}", task.adminUser.getProperty( "email" ));
+                     metadataFile.writeEndObject();
 -                    
 +
-                     count++;
-                     if ( count % 1000 == 0 ) {
-                         logger.info("Exported {} admin users", count);
-                     }
+                     logger.debug( "Exported user {}:{}:{}", new Object[] {
+                         task.adminUser.getProperty("username"),
+                         task.adminUser.getProperty("email"),
+                         task.adminUser.getUuid() } );
  
+                     count.addAndGet( 1 );
  
                  } catch (InterruptedException e) {
                      throw new Exception("Interrupted", e);

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/764a7c85/stack/tools/src/main/resources/log4j.properties
----------------------------------------------------------------------
diff --cc stack/tools/src/main/resources/log4j.properties
index c288fec,6cf0a92..00834cf
--- a/stack/tools/src/main/resources/log4j.properties
+++ b/stack/tools/src/main/resources/log4j.properties
@@@ -26,25 -26,9 +26,25 @@@ log4j.appender.stdout=org.apache.log4j.
  log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  log4j.appender.stdout.layout.ConversionPattern=%d %p (%t) [%c] - %m%n
  
- <<<<<<< HEAD
 +log4j.category.org.apache.usergrid.tools=TRACE
 +log4j.category.org.apache.usergrid=ERROR
 +
 +log4j.logger.org.apache.usergrid.persistence.cassandra.DB=WARN, stdout
 +log4j.logger.org.apache.usergrid.persistence.cassandra.BATCH=WARN, stdout
 +log4j.logger.org.apache.usergrid.persistence.cassandra.EntityManagerFactoryImpl=WARN, stdout
 +log4j.logger.org.apache.usergrid.persistence.cassandra.DaoUtils=WARN, stdout
 +log4j.logger.org.apache.usergrid.persistence.cassandra.EntityManagerImpl=WARN, stdout
 +log4j.logger.org.apache.usergrid.persistence.cassandra.ConnectionRefImpl=WARN, stdout
 +log4j.logger.me.prettyprint.cassandra.hector.TimingLogger=WARN, stdout
 +log4j.logger.org.apache.usergrid.rest.security.AllowAjaxFilter=WARN, stdout
 +log4j.logger.me.prettyprint.hector.api.beans.AbstractComposite=ERROR, stdout
 +#log4j.logger.org.apache.usergrid.locking.singlenode.SingleNodeLockManagerImpl=DEBUG, stdout
 +#log4j.logger.org.apache.usergrid.persistence.hector.CountingMutator=INFO, stdout
- =======
- log4j.logger.org.apache.usergrid.tools=DEBUG
++
 +log4j.logger.org.apache.usergrid.management.cassandra=DEBUB
+ log4j.logger.org.apache.usergrid.tools=INFO
  
+ log4j.logger.org.apache.usergrid.management.cassandra=WARN
  log4j.logger.org.apache.usergrid.persistence.cassandra.DB=WARN
  log4j.logger.org.apache.usergrid.persistence.cassandra.BATCH=WARN
  log4j.logger.org.apache.usergrid.persistence.cassandra.EntityManagerFactoryImpl=WARN


[03/23] incubator-usergrid git commit: Add line about jQuery Sparklines.

Posted by sn...@apache.org.
Add line about jQuery Sparklines.


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

Branch: refs/heads/two-dot-o
Commit: 6746b59eb8d3e8bf5ee143a66defd3f80849a8a7
Parents: 5bdea9c
Author: Dave Johnson <dm...@apigee.com>
Authored: Fri Jun 26 12:46:32 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Fri Jun 26 12:46:32 2015 -0400

----------------------------------------------------------------------
 LICENSE | 41 ++++++++++++++++++++++-------------------
 1 file changed, 22 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/6746b59e/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index dd22519..7eab63d 100644
--- a/LICENSE
+++ b/LICENSE
@@ -270,45 +270,48 @@ For the SSKeychain component:
 Other components:
 -----------------
 
-This product bundles SBJson, which is available under a "3-clause BSD" license.
-For details, see sdks/ios/UGAPI/SBJson/ .
-
-This product bundles SSKeychain, which is available under a "MIT/X11" license.
-For details, see sdks/ios/UGAPI/SSKeychain/.
+This product bundles angular.js
+Copyright(c) Google, Inc. Released under the MIT license.
 
 This product bundles angular-scenario.js, part of jQuery JavaScript Library
 which Includes Sizzle.js Copyright (c) jQuery Foundation, Inc. and others.
 Released under the MIT license.
 
-This product bundles angular.js
-Copyright(c) Google, Inc. Released under the MIT license.
-
 This product bundles Bootstrap Copyright (c) Twitter, Inc
 Licensed under the MIT license.
 
-This product bundles jquery-ui
+The product bundles Intro.js (MIT licensed)
+Copyright (c) usabli.ca - A weekend project by Afshin Mehrabani (@afshinmeh)
+
+This product bundles jQuery
 Licensed under MIT license.
 
-This product bundles jquery
+This product bundles jQuery-UI
 Licensed under MIT license.
 
-This product bundles mocha. 
+This product bundles jQuery Sparklines (New BSD License)
+Copyright (c) Splunk Inc.
+
+This product bundles Mocha. 
 All rights reserved. Licensed under MIT.
 Copyright (c) TJ Holowaychuk <tj...@vision-media.ca>
 
-This product bundles SSToolkit.
-Copyright (c) Sam Soffes. All rights reserved.
-These files can be located within the /sdks/ios package.
-
-The product bundles Intro.js (MIT licensed)
-Copyright (c) usabli.ca - A weekend project by Afshin Mehrabani (@afshinmeh)
+This product bundles NewtonSoft.Json under MIT license 
 
 This product bundles NPM MD5 (BSD-3 licensed)
 Copyright (c) Paul Vorbach and Copyright (C), Jeff Mott.
 
-This product bundles NewtonSoft.Json under MIT license 
-
 This product bundles NSubsttute under BSD license 
 
+This product bundles SBJson, which is available under a "3-clause BSD" license.
+For details, see sdks/ios/UGAPI/SBJson/ .
+
 This product bundles Sphinx under BSD license 
 
+This product bundles SSKeychain, which is available under a "MIT/X11" license.
+For details, see sdks/ios/UGAPI/SSKeychain/.
+
+This product bundles SSToolkit.
+Copyright (c) Sam Soffes. All rights reserved.
+These files can be located within the /sdks/ios package.
+


[06/23] incubator-usergrid git commit: Preparing for 1.0.2 RC3

Posted by sn...@apache.org.
Preparing for 1.0.2 RC3


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

Branch: refs/heads/two-dot-o
Commit: ef545b0d1c8ad4a24e3a67c4bd26e69bfa299474
Parents: 32f2882
Author: Dave Johnson <sn...@apache.org>
Authored: Fri Jun 26 14:29:46 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Fri Jun 26 14:29:46 2015 -0400

----------------------------------------------------------------------
 .usergridversion | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/ef545b0d/.usergridversion
----------------------------------------------------------------------
diff --git a/.usergridversion b/.usergridversion
index 99eda91..276823b 100644
--- a/.usergridversion
+++ b/.usergridversion
@@ -1 +1 @@
-1.0.3-SNAPSHOT
+1.0.2-SNAPSHOT


[20/23] incubator-usergrid git commit: Log total counts

Posted by sn...@apache.org.
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/two-dot-o
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 });
                         }
                         


[11/23] 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/67d3322d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/tree/67d3322d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-usergrid/diff/67d3322d

Branch: refs/heads/two-dot-o
Commit: 67d3322d3fbde7cb5d648b724e8acc6f217a5733
Parents: 655392e 77925e7
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Jul 1 08:31:28 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Jul 1 08:31:28 2015 -0400

----------------------------------------------------------------------
 .usergridversion   |  2 +-
 CHANGELOG          |  3 +++
 stack/rest/pom.xml | 11 ++++++++++-
 3 files changed, 14 insertions(+), 2 deletions(-)
----------------------------------------------------------------------



[15/23] incubator-usergrid git commit: Incrementing snapshot version to 1.0.3-SNAPSHOT.

Posted by sn...@apache.org.
Incrementing snapshot version to 1.0.3-SNAPSHOT.


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

Branch: refs/heads/two-dot-o
Commit: ab149aea1e3c2b1c505f2c1acf41b99684a992dc
Parents: 5167328
Author: Dave Johnson <sn...@gmail.com>
Authored: Mon Jul 6 09:03:52 2015 -0400
Committer: Dave Johnson <sn...@gmail.com>
Committed: Mon Jul 6 09:03:52 2015 -0400

----------------------------------------------------------------------
 .usergridversion | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/ab149aea/.usergridversion
----------------------------------------------------------------------
diff --git a/.usergridversion b/.usergridversion
index 276823b..99eda91 100644
--- a/.usergridversion
+++ b/.usergridversion
@@ -1 +1 @@
-1.0.2-SNAPSHOT
+1.0.3-SNAPSHOT


[17/23] incubator-usergrid git commit: Print out additional user information: orgs and dictionaries.

Posted by sn...@apache.org.
Print out additional user information: orgs and dictionaries.


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

Branch: refs/heads/two-dot-o
Commit: 7a951094afdcea4180f7a6e4a96677ef2cf11689
Parents: 59ea6e5
Author: Dave Johnson <sn...@apache.org>
Authored: Mon Jul 6 19:20:15 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Mon Jul 6 19:20:15 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/UserManager.java  | 22 ++++++++++++++++++++
 1 file changed, 22 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/7a951094/stack/tools/src/main/java/org/apache/usergrid/tools/UserManager.java
----------------------------------------------------------------------
diff --git a/stack/tools/src/main/java/org/apache/usergrid/tools/UserManager.java b/stack/tools/src/main/java/org/apache/usergrid/tools/UserManager.java
index 0194037..3b5383d 100644
--- a/stack/tools/src/main/java/org/apache/usergrid/tools/UserManager.java
+++ b/stack/tools/src/main/java/org/apache/usergrid/tools/UserManager.java
@@ -17,10 +17,19 @@
 package org.apache.usergrid.tools;
 
 
+import com.google.common.collect.BiMap;
 import org.apache.usergrid.management.UserInfo;
 
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Options;
+import org.apache.usergrid.persistence.EntityManager;
+import org.apache.usergrid.persistence.cassandra.CassandraService;
+import org.apache.usergrid.persistence.entities.User;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
 
 import static org.apache.usergrid.utils.JsonUtils.mapToFormattedJsonString;
 
@@ -48,8 +57,21 @@ public class UserManager extends ToolBase {
             return;
         }
 
+        logger.info("--- User information:");
         logger.info( mapToFormattedJsonString( userInfo ) );
 
+        logger.info("--- User organizations:");
+        final BiMap<UUID, String> orgs = managementService.getOrganizationsForAdminUser( userInfo.getUuid() );
+        logger.info( mapToFormattedJsonString( orgs ) );
+
+        logger.info("--- User dictionaries:");
+        EntityManager em = emf.getEntityManager( CassandraService.MANAGEMENT_APPLICATION_ID );
+        User user = em.get( userInfo.getUuid(), User.class );
+        Set<String> dictionaries = em.getDictionaries( user );
+        for (String dictionary : dictionaries) {
+            Map<Object, Object> dict = em.getDictionaryAsMap( user, dictionary );
+            logger.info( dictionary + " : " + mapToFormattedJsonString( dict ) );
+        }
 
         if ( line.hasOption( "p" ) ) {
             String password = line.getOptionValue( "p" );


[21/23] 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/two-dot-o
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

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

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



[13/23] incubator-usergrid git commit: Preparing for another release candidate.

Posted by sn...@apache.org.
Preparing for another release candidate.


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

Branch: refs/heads/two-dot-o
Commit: 26d02d3af9b9e165bd5571297f14d9a09a2e36cf
Parents: 70c8afb
Author: Dave Johnson <sn...@gmail.com>
Authored: Fri Jul 3 09:33:00 2015 -0400
Committer: Dave Johnson <sn...@gmail.com>
Committed: Fri Jul 3 09:33:00 2015 -0400

----------------------------------------------------------------------
 .usergridversion | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/26d02d3a/.usergridversion
----------------------------------------------------------------------
diff --git a/.usergridversion b/.usergridversion
index 99eda91..276823b 100644
--- a/.usergridversion
+++ b/.usergridversion
@@ -1 +1 @@
-1.0.3-SNAPSHOT
+1.0.2-SNAPSHOT


[14/23] incubator-usergrid git commit: Updating CHANGELOG for 1.0.2 release.

Posted by sn...@apache.org.
Updating CHANGELOG for 1.0.2 release.


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

Branch: refs/heads/two-dot-o
Commit: 5167328e85ec24902b578ac82a41f4526d01d47d
Parents: 26d02d3
Author: Dave Johnson <sn...@gmail.com>
Authored: Mon Jul 6 09:03:52 2015 -0400
Committer: Dave Johnson <sn...@gmail.com>
Committed: Mon Jul 6 09:03:52 2015 -0400

----------------------------------------------------------------------
 CHANGELOG | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5167328e/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index 5ad0b68..5e692fc 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -7,6 +7,9 @@ Usergrid 1.0.2
 Usergrid 1.0.2
 --------------------------------------------------------------------------------
 
+Usergrid 1.0.2
+--------------------------------------------------------------------------------
+
 
 Usergrid 1.0.2
 --------------------------------------------------------------------------------


[19/23] incubator-usergrid git commit: 1. only export credentials dictionary because it is all we need for admins, 2. use em.get() instead of em.getRef() because it is more reliably.

Posted by sn...@apache.org.
1. only export credentials dictionary because it is all we need for admins, 2. use em.get() instead of em.getRef() because it is more reliably.


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

Branch: refs/heads/two-dot-o
Commit: 648b5997ec5d9be5e3b916418ae54f24c4fe0f69
Parents: b9af09e
Author: Dave Johnson <sn...@apache.org>
Authored: Wed Jul 8 08:01:44 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Wed Jul 8 08:01:44 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/648b5997/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/648b5997/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..d565f71 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 {
 


[09/23] incubator-usergrid git commit: Introduce a version number in the WAR file name for USERGRID-758

Posted by sn...@apache.org.
Introduce a version number in the WAR file name for USERGRID-758


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

Branch: refs/heads/two-dot-o
Commit: 77925e76bc38ba42aff786d55575fccad3526160
Parents: f5cc970
Author: Dave Johnson <sn...@gmail.com>
Authored: Mon Jun 29 09:54:52 2015 -0400
Committer: Dave Johnson <sn...@gmail.com>
Committed: Mon Jun 29 09:54:52 2015 -0400

----------------------------------------------------------------------
 stack/rest/pom.xml | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/77925e76/stack/rest/pom.xml
----------------------------------------------------------------------
diff --git a/stack/rest/pom.xml b/stack/rest/pom.xml
index 6d404cf..224f8b6 100644
--- a/stack/rest/pom.xml
+++ b/stack/rest/pom.xml
@@ -285,7 +285,16 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-war-plugin</artifactId>
-        <version>2.3</version>
+        <version>2.5</version>
+        <configuration>
+          <archive>
+            <manifestEntries>
+              <Usergrid-Version>$
+                {project.version}
+              </Usergrid-Version>
+            </manifestEntries>
+          </archive>
+        </configuration>
       </plugin>
 
       <plugin>


[22/23] 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/two-dot-o
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 {
 


[10/23] incubator-usergrid git commit: Don't need to update change log or base Usergrid version number on creation of each release candidate.

Posted by sn...@apache.org.
Don't need to update change log or base Usergrid version number on creation of each release candidate.


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

Branch: refs/heads/two-dot-o
Commit: 655392e84b3b3ad35b6c47700dc24996cda3dfd6
Parents: ef545b0
Author: Dave Johnson <sn...@apache.org>
Authored: Mon Jun 29 10:18:30 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Mon Jun 29 10:18:30 2015 -0400

----------------------------------------------------------------------
 release/release-candidate.sh | 10 ----------
 1 file changed, 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/655392e8/release/release-candidate.sh
----------------------------------------------------------------------
diff --git a/release/release-candidate.sh b/release/release-candidate.sh
index 9b42bdf..0e46f88 100755
--- a/release/release-candidate.sh
+++ b/release/release-candidate.sh
@@ -164,19 +164,9 @@ fi
 # This should be a clean repo we are working against. Run clean just to ensure it is.
 git clean -fdxq
 
-echo "Generating changelog"
-${base_dir}/release/changelog.rb $current_version
-git add CHANGELOG
-git commit -m "Updating CHANGELOG for ${current_version} release."
-
 echo "Creating ${current_version_tag} branch"
 git branch $current_version_tag $(git rev-parse HEAD)
 
-echo "Committing updated .usergridversion on master"
-echo $new_snapshot_version > .usergridversion
-git add .usergridversion
-git commit -m "Incrementing snapshot version to ${new_snapshot_version}."
-
 # Build the source distribution from the new branch
 echo "Checking out ${current_version_tag} branch and updating .usergridversion"
 git checkout $current_version_tag


[16/23] incubator-usergrid git commit: Login to ensure that export and import wait until all data is exported or imported before existing.

Posted by sn...@apache.org.
Login to ensure that export and import wait until all data is exported or imported before existing.


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

Branch: refs/heads/two-dot-o
Commit: 59ea6e54fd48d069843cc8ceccd48cf93b0cb2a3
Parents: 67d3322
Author: Dave Johnson <sn...@apache.org>
Authored: Mon Jul 6 19:19:31 2015 -0400
Committer: Dave Johnson <sn...@apache.org>
Committed: Mon Jul 6 19:19:31 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ExportAdmins.java | 48 +++++++++++---------
 .../org/apache/usergrid/tools/ImportAdmins.java | 44 ++++++++++++------
 2 files changed, 56 insertions(+), 36 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/59ea6e54/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 d3d6371..d726ad3 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
@@ -167,11 +167,6 @@ public class ExportAdmins extends ExportingToolBase {
             ids = em.searchCollection( em.getApplicationRef(), "users", query );
         }
 
-        adminUserWriter.setDone( true );
-        for (AdminUserReader aur : readers) {
-            aur.setDone( true );
-        }
-
         logger.debug( "Waiting for write thread to complete" );
         
         boolean done = false;
@@ -202,7 +197,7 @@ public class ExportAdmins extends ExportingToolBase {
      */
     private void buildOrgMap() throws Exception {
 
-        logger.info("Building org map");
+        logger.info( "Building org map" );
 
         ExecutorService execService = Executors.newFixedThreadPool( this.readThreadCount );
 
@@ -269,8 +264,6 @@ public class ExportAdmins extends ExportingToolBase {
 
     public class AdminUserReader implements Runnable {
 
-        private boolean done = true;
-
         private final BlockingQueue<UUID> readQueue;
         private final BlockingQueue<AdminUserWriteTask> writeQueue;
 
@@ -299,9 +292,7 @@ public class ExportAdmins extends ExportingToolBase {
                 UUID uuid = null;
                 try {
                     uuid = readQueue.poll( 30, TimeUnit.SECONDS );
-                    //logger.debug("Got item from entityId queue: " + uuid );
-
-                    if ( uuid == null && done ) {
+                    if ( uuid == null ) {
                         break;
                     }
 
@@ -335,8 +326,31 @@ public class ExportAdmins extends ExportingToolBase {
 
             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 ) {
+                    logger.error( "User {}:{} has no password in credential dictionary",
+                            new Object[]{task.adminUser.getName(), task.adminUser.getUuid() } );
+                }
+                if ( task.dictionariesByName.get("credentials").get("secret") == null ) {
+                    logger.error( "User {}:{} has no secret in credential dictionary",
+                            new Object[]{task.adminUser.getName(), task.adminUser.getUuid() } );
+                }
+            }
+                
         }
 
         private void addOrganizationsToTask(AdminUserWriteTask task) throws Exception {
@@ -360,16 +374,10 @@ public class ExportAdmins extends ExportingToolBase {
                         task.adminUser.getUuid() } );
             }
         }
-
-        public void setDone(boolean done) {
-            this.done = done;
-        }
     }
 
     class AdminUserWriter implements Runnable {
 
-        private boolean done = false;
-
         private final BlockingQueue<AdminUserWriteTask> taskQueue;
 
         public AdminUserWriter( BlockingQueue<AdminUserWriteTask> taskQueue ) {
@@ -404,7 +412,7 @@ public class ExportAdmins extends ExportingToolBase {
 
                 try {
                     AdminUserWriteTask task = taskQueue.poll( 30, TimeUnit.SECONDS );
-                    if ( task == null && done ) {
+                    if ( task == null ) {
                         break;
                     }
 
@@ -494,10 +502,6 @@ public class ExportAdmins extends ExportingToolBase {
 
             jg.writeEndArray();
         }
-
-        public void setDone(boolean done) {
-            this.done = done;
-        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/59ea6e54/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 39384e6..4bcdc0b 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
@@ -90,6 +90,11 @@ public class ImportAdmins extends ToolBase {
     AtomicInteger userCount = new AtomicInteger( 0 );
     AtomicInteger metadataCount = new AtomicInteger( 0 );
 
+    AtomicInteger writeEmptyCount = new AtomicInteger( 0 );
+    AtomicInteger auditEmptyCount = new AtomicInteger( 0 );
+    AtomicInteger metadataEmptyCount = new AtomicInteger( 0 );
+    
+
 
     @Override
     @SuppressWarnings("static-access")
@@ -146,7 +151,7 @@ public class ImportAdmins extends ToolBase {
             writeThreadCount = Integer.parseInt( line.getOptionValue(WRITE_THREAD_COUNT));
         }
 
-        importAdminUsers(writeThreadCount, auditThreadCount);
+        importAdminUsers( writeThreadCount, auditThreadCount );
 
         importMetadata( writeThreadCount );
     }
@@ -159,7 +164,7 @@ public class ImportAdmins extends ToolBase {
 
         String[] fileNames = importDir.list(new PrefixFileFilter(ExportAdmins.ADMIN_USERS_PREFIX + "."));
 
-        logger.info("Applications to read: " + fileNames.length);
+        logger.info( "Applications to read: " + fileNames.length );
 
         for (String fileName : fileNames) {
             try {
@@ -210,8 +215,8 @@ public class ImportAdmins extends ToolBase {
             workQueue.add( entityProps );
         }
 
-        waitForQueueAndMeasure(workQueue, adminWriteThreads, "Admin Write");
-        waitForQueueAndMeasure(auditQueue, adminAuditThreads, "Admin Audit");
+        waitForQueueAndMeasure(workQueue, writeEmptyCount, adminWriteThreads, "Admin Write");
+        waitForQueueAndMeasure(auditQueue, auditEmptyCount, adminAuditThreads, "Admin Audit");
 
         logger.info("----- End: Imported {} admin users from file {}",
                 count, adminUsersFile.getAbsolutePath());
@@ -220,12 +225,13 @@ public class ImportAdmins extends ToolBase {
     }
 
     private static void waitForQueueAndMeasure(final BlockingQueue workQueue,
+                                               final AtomicInteger emptyCounter,
                                                final Map<Stoppable, Thread> threadMap,
                                                final String identifier) throws InterruptedException {
         double rateAverageSum = 0;
         int iterations = 0;
 
-        while (!workQueue.isEmpty()) {
+        while ( emptyCounter.get() < threadMap.size() ) {
             iterations += 1;
 
             int sizeLast = workQueue.size();
@@ -312,8 +318,8 @@ public class ImportAdmins extends ToolBase {
     private void importMetadata(int writeThreadCount) throws Exception {
 
         String[] fileNames = importDir.list(
-                new PrefixFileFilter(ExportAdmins.ADMIN_USER_METADATA_PREFIX + "."));
-        logger.info("Metadata files to read: " + fileNames.length);
+                new PrefixFileFilter( ExportAdmins.ADMIN_USER_METADATA_PREFIX + "." ) );
+        logger.info( "Metadata files to read: " + fileNames.length );
 
         for (String fileName : fileNames) {
             try {
@@ -373,17 +379,22 @@ public class ImportAdmins extends ToolBase {
             if (jsonToken.equals(JsonToken.FIELD_NAME) && depth == 2) {
 
                 jp.nextToken();
-
                 String entityOwnerId = jp.getCurrentName();
-                EntityRef entityRef = em.getRef(UUID.fromString(entityOwnerId));
 
-                Map<String, Object> metadata = (Map<String, Object>) jp.readValueAs(Map.class);
-
-                workQueue.put(new ImportMetadataTask(entityRef, metadata));
+                try {
+                    EntityRef entityRef = em.getRef( UUID.fromString( entityOwnerId ) );
+                    Map<String, Object> metadata = (Map<String, Object>) jp.readValueAs( Map.class );
+                    
+                    workQueue.put( new ImportMetadataTask( entityRef, metadata ) );
+                    logger.debug( "Put user {} in metadata queue", entityRef.getUuid() );
+                    
+                } catch ( Exception e ) {
+                    logger.debug( "Error with user {}, not putting in metadata queue", entityOwnerId );
+                }
             }
         }
 
-        waitForQueueAndMeasure(workQueue, metadataWorkerThreadMap, "Metadata Load");
+        waitForQueueAndMeasure(workQueue, metadataEmptyCount, metadataWorkerThreadMap, "Metadata Load");
 
         logger.info("----- End of metadata -----");
         jp.close();
@@ -523,9 +534,11 @@ public class ImportAdmins extends ToolBase {
 
                     if (entityProps == null) {
                         logger.warn("Reading from AUDIT queue was null!");
+                        auditEmptyCount.getAndIncrement();
                         Thread.sleep(1000);
                         continue;
                     }
+                    auditEmptyCount.set(0);
 
                     count++;
                     long startTime = System.currentTimeMillis();
@@ -599,15 +612,16 @@ public class ImportAdmins extends ToolBase {
 
                     if (task == null) {
                         logger.warn("Reading from metadata queue was null!");
+                        metadataEmptyCount.getAndIncrement();
                         Thread.sleep(1000);
                         continue;
                     }
+                    metadataEmptyCount.set(0);
                     
                     long startTime = System.currentTimeMillis();
                     
                     importEntityMetadata(em, task.entityRef, task.metadata);
                     
-                    metadataCount.addAndGet( 1 );
                     long stopTime = System.currentTimeMillis();
                     long duration = stopTime - startTime;
                     durationSum += duration;
@@ -662,9 +676,11 @@ public class ImportAdmins extends ToolBase {
 
                     if (entityProps == null) {
                         logger.warn("Reading from admin import queue was null!");
+                        writeEmptyCount.getAndIncrement();
                         Thread.sleep( 1000 );
                         continue;
                     }
+                    writeEmptyCount.set(0);
 
                     // Import/create the entity
                     UUID uuid = getId(entityProps);


[08/23] incubator-usergrid git commit: Updating CHANGELOG for 1.0.2 release.

Posted by sn...@apache.org.
Updating CHANGELOG for 1.0.2 release.


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

Branch: refs/heads/two-dot-o
Commit: d52427b279306e19c163e89e9d5025760fc0b50a
Parents: ef545b0
Author: Dave Johnson <dm...@apigee.com>
Authored: Fri Jun 26 14:32:35 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Fri Jun 26 14:32:35 2015 -0400

----------------------------------------------------------------------
 CHANGELOG | 3 +++
 1 file changed, 3 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/d52427b2/CHANGELOG
----------------------------------------------------------------------
diff --git a/CHANGELOG b/CHANGELOG
index 11f113a..5ad0b68 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -4,6 +4,9 @@ Usergrid 1.0.2
 Usergrid 1.0.2
 --------------------------------------------------------------------------------
 
+Usergrid 1.0.2
+--------------------------------------------------------------------------------
+
 
 Usergrid 1.0.2
 --------------------------------------------------------------------------------


[04/23] incubator-usergrid git commit: Add year.

Posted by sn...@apache.org.
Add year.


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

Branch: refs/heads/two-dot-o
Commit: ff63e09121d0de9745d020925d7c8b4b934e8ec4
Parents: 6746b59
Author: Dave Johnson <dm...@apigee.com>
Authored: Fri Jun 26 12:46:43 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Fri Jun 26 12:46:43 2015 -0400

----------------------------------------------------------------------
 NOTICE | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/ff63e091/NOTICE
----------------------------------------------------------------------
diff --git a/NOTICE b/NOTICE
index ef5af71..b080415 100644
--- a/NOTICE
+++ b/NOTICE
@@ -1,6 +1,5 @@
 Apache Usergrid (incubating)
-Copyright (c) The Apache Software Foundation.
+Copyright 2015 The Apache Software Foundation.
 
 This product includes software developed at
 The Apache Software Foundation (http://www.apache.org/).
-


[12/23] incubator-usergrid git commit: Add missing license information and switch out cat photo for battleship photo obtained from Wikipedia.

Posted by sn...@apache.org.
Add missing license information and switch out cat photo for battleship photo obtained from Wikipedia.


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

Branch: refs/heads/two-dot-o
Commit: 70c8afb42b6cc4e5d75849e1dfe771853f7d6f4b
Parents: 77925e7
Author: Dave Johnson <sn...@gmail.com>
Authored: Fri Jul 3 09:30:54 2015 -0400
Committer: Dave Johnson <sn...@gmail.com>
Committed: Fri Jul 3 09:30:54 2015 -0400

----------------------------------------------------------------------
 LICENSE                                         |  10 +
 stack/LICENSE-2.0.txt                           | 202 -------------------
 .../applications/assets/AssetResourceIT.java    |   2 +-
 .../src/test/resources/cat-larger-than-6mb.jpg  | Bin 9799257 -> 0 bytes
 .../src/test/resources/ship-larger-than-6mb.gif | Bin 0 -> 7407487 bytes
 5 files changed, 11 insertions(+), 203 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/70c8afb4/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index 7eab63d..a4b9abe 100644
--- a/LICENSE
+++ b/LICENSE
@@ -315,3 +315,13 @@ This product bundles SSToolkit.
 Copyright (c) Sam Soffes. All rights reserved.
 These files can be located within the /sdks/ios package.
 
+This product bundles Entypo, CC by SA license
+
+This product bundles date.min.js, MIT license
+
+This product bundles jquery.ui.timepicker.min.js, MIT license
+
+This product bundles blanket_mocha.min.js, MIT license
+
+This product bundles FontAwesome, SIL Open Font License 
+

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/70c8afb4/stack/LICENSE-2.0.txt
----------------------------------------------------------------------
diff --git a/stack/LICENSE-2.0.txt b/stack/LICENSE-2.0.txt
deleted file mode 100644
index d645695..0000000
--- a/stack/LICENSE-2.0.txt
+++ /dev/null
@@ -1,202 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed 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
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/70c8afb4/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
index 10e9703..b048327 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/assets/AssetResourceIT.java
@@ -315,7 +315,7 @@ public class AssetResourceIT extends AbstractRestIT {
 
             UserRepo.INSTANCE.load( resource(), access_token );
 
-            byte[] data = IOUtils.toByteArray( this.getClass().getResourceAsStream( "/cat-larger-than-6mb.jpg" ) );
+            byte[] data = IOUtils.toByteArray( this.getClass().getResourceAsStream( "/ship-larger-than-6mb.gif" ) );
             FormDataMultiPart form = new FormDataMultiPart().field( "file", data, MediaType.MULTIPART_FORM_DATA_TYPE );
 
             // send data

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/70c8afb4/stack/rest/src/test/resources/cat-larger-than-6mb.jpg
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/resources/cat-larger-than-6mb.jpg b/stack/rest/src/test/resources/cat-larger-than-6mb.jpg
deleted file mode 100644
index d45435a..0000000
Binary files a/stack/rest/src/test/resources/cat-larger-than-6mb.jpg and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/70c8afb4/stack/rest/src/test/resources/ship-larger-than-6mb.gif
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/resources/ship-larger-than-6mb.gif b/stack/rest/src/test/resources/ship-larger-than-6mb.gif
new file mode 100644
index 0000000..c3cb1fd
Binary files /dev/null and b/stack/rest/src/test/resources/ship-larger-than-6mb.gif differ


[05/23] incubator-usergrid git commit: Delete the ARSMaquettePro font.

Posted by sn...@apache.org.
Delete the ARSMaquettePro font.


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

Branch: refs/heads/two-dot-o
Commit: 32f2882e0f2efd47ede6befd4fbaefa047989a03
Parents: ff63e09
Author: Dave Johnson <dm...@apigee.com>
Authored: Fri Jun 26 12:47:22 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Fri Jun 26 12:47:22 2015 -0400

----------------------------------------------------------------------
 portal/css/arsmarquette/ARSMaquettePro-Light.otf  | Bin 184600 -> 0 bytes
 portal/css/arsmarquette/ARSMaquettePro-Medium.otf | Bin 188020 -> 0 bytes
 .../css/arsmarquette/ARSMaquettePro-Regular.otf   | Bin 188096 -> 0 bytes
 portal/css/main.css                               |  15 ---------------
 portal/css/main.min.css                           |   2 +-
 5 files changed, 1 insertion(+), 16 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/32f2882e/portal/css/arsmarquette/ARSMaquettePro-Light.otf
----------------------------------------------------------------------
diff --git a/portal/css/arsmarquette/ARSMaquettePro-Light.otf b/portal/css/arsmarquette/ARSMaquettePro-Light.otf
deleted file mode 100644
index afd066d..0000000
Binary files a/portal/css/arsmarquette/ARSMaquettePro-Light.otf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/32f2882e/portal/css/arsmarquette/ARSMaquettePro-Medium.otf
----------------------------------------------------------------------
diff --git a/portal/css/arsmarquette/ARSMaquettePro-Medium.otf b/portal/css/arsmarquette/ARSMaquettePro-Medium.otf
deleted file mode 100644
index 052dad8..0000000
Binary files a/portal/css/arsmarquette/ARSMaquettePro-Medium.otf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/32f2882e/portal/css/arsmarquette/ARSMaquettePro-Regular.otf
----------------------------------------------------------------------
diff --git a/portal/css/arsmarquette/ARSMaquettePro-Regular.otf b/portal/css/arsmarquette/ARSMaquettePro-Regular.otf
deleted file mode 100644
index c738638..0000000
Binary files a/portal/css/arsmarquette/ARSMaquettePro-Regular.otf and /dev/null differ

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/32f2882e/portal/css/main.css
----------------------------------------------------------------------
diff --git a/portal/css/main.css b/portal/css/main.css
index 5984dd1..cc4d078 100644
--- a/portal/css/main.css
+++ b/portal/css/main.css
@@ -49,21 +49,6 @@ a {
     font-style: normal;
 }
 
-@font-face {
-    font-family: 'marquette-medium';
-    src: url('arsmarquette/ARSMaquettePro-Medium.otf'), url('arsmarquette/ARSMaquettePro-Medium.otf') format('opentype');
-}
-
-@font-face {
-    font-family: 'marquette-regular';
-    src: url('arsmarquette/ARSMaquettePro-Regular.otf'), url('arsmarquette/ARSMaquettePro-Regular.otf') format('opentype');
-}
-
-@font-face {
-    font-family: 'marquette-light';
-    src: url('arsmarquette/ARSMaquettePro-Light.otf'), url('arsmarquette/ARSMaquettePro-Light.otf') format('opentype');
-}
-
 .bold {
     font-family: 'marquette-medium';
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/32f2882e/portal/css/main.min.css
----------------------------------------------------------------------
diff --git a/portal/css/main.min.css b/portal/css/main.min.css
index 2d37389..60a4a7c 100644
--- a/portal/css/main.min.css
+++ b/portal/css/main.min.css
@@ -1 +1 @@
-.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none}html{min-height:100%;position:relative;margin:0 auto;background:#fff;min-width:1100px}body{padding:0;background-color:#fff;font-family:marquette-light,'Helvetica Neue',Helvetica,Arial,sans-serif;height:100%;max-height:100%;overflow-x:hidden}a{cursor:pointer}@font-face{font-family:entypo;src:url(entypo/entypo.eot);src:url(entypo/entypo.eot?#iefix) format('embedded-opentype'),url(entypo/entypo.woff) format('woff'),url(entypo/entypo.ttf) format('truetype'),url(entypo/entypo.svg#entypo) format('svg');font-weight:400;font-style:normal}@font-face{font-family:marquette-medium;src:url(arsmarquette/ARSMaquettePro-Medium.otf),url(arsmarquette/ARSMaquettePro-Medium.otf) format('opentype')}@font-face{font-family:marquette-regular;src:url(arsmarquette/ARSMaquettePro-Regular.otf),url(arsmarquette/ARSMaquettePro-Regular.otf) format('opentype')}@font-face{font-family:marquette-light;src:url(arsmarquette/ARSMaquet
 tePro-Light.otf),url(arsmarquette/ARSMaquettePro-Light.otf) format('opentype')}.bold{font-family:marquette-medium}.main-content{background-color:#fff;margin:0 0 0 200px}.side-menu{position:absolute;top:60px;left:0;bottom:0;width:200px;float:left;background-color:#eee}footer{padding-top:20px;clear:both}.zero-out{padding:0;text-shadow:none;background-color:transparent;background-image:none;border:0;box-shadow:none;outline:0}.modal-body{overflow-y:visible}.demo-holder{margin:0 -20px 0 -20px;position:relative}.alert-holder{position:fixed;right:0;margin:20px 20px 0 0;z-index:10500;width:302px}.alert,.alert.alert-demo{padding:9px 35px 5px 14px;margin-bottom:3px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#eee;border:1px solid #eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;transition:all 1s ease;height:0;overflow:hidden;line-height:0;float:right}.alert.alert-demo{float:none}.alert{width:0}.alert.ale
 rt-success{background-color:rgba(155,198,144,.31);color:#1f6719;border-left:2px solid #1f6719}.alert.alert-warning{background-color:rgba(239,172,37,.2);color:#efac25;border-left:2px solid #efac25}.alert.alert-info{background-color:rgba(27,151,209,.2);color:#1b97d1;border-left:2px solid #1b97d1}.alert.alert-error{background-color:rgba(255,3,3,.2);color:#ff0303;border-left:2px solid #ff0303}.alert.alert-animate.alert-demo{height:20px;line-height:normal;opacity:1;width:100%;-moz-box-shadow:inset 0 2px 13px #b8b8b8;-webkit-box-shadow:inset 0 2px 13px #b8b8b8;box-shadow:inset 0 2px 13px #b8b8b8}.alert.alert-animate{height:auto;line-height:normal;opacity:.9;width:300px}@-webkit-keyframes alert-out{from{opacity:1}to{-webkit-transform:translateY(500px);opacity:0}}@keyframes alert-out{from{opacity:1}to{transform:translateY(500px);opacity:0}}.fade-out{-webkit-animation-name:alert-out;-webkit-animation-duration:1s;-webkit-animation-timing-function:step-stop;-webkit-animation-direction:normal;-
 webkit-animation-iteration-count:1;animation-name:alert-out;animation-duration:1s;animation-timing-function:step-stop;animation-direction:normal;animation-iteration-count:1;opacity:.9}.margin-35{margin-top:35px}.modal-footer{background-color:transparent}.baloon{margin:20px;padding:20px 30px;position:fixed;bottom:0;top:auto;border-style:solid;border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.8)}.baloon:after{content:"";position:absolute;width:10px;height:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865473, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865473, SizingMethod='auto expand')"}.north.baloon:after{top:-6px;left:30px;border-top-style:solid;border-left-style:solid;box-shadow:-2px -2px 3px -1px rgba(0,0,0,.5)}.south.baloon:after{bottom:-6px;left:30px;border-bottom-style:solid;border-right-style:solid;box-shadow:2px 2px 3px -1px rgba(0,0,0,.5)}.
 left.baloon:after{top:10px;left:-6px;border-bottom-style:solid;border-left-style:solid;box-shadow:-2px 2px 3px -1px rgba(0,0,0,.5)}.right.baloon:after{bottom:10px;right:-6px;border-top-style:solid;border-right-style:solid;box-shadow:2px -2px 3px -1px rgba(0,0,0,.5)}.baloon,.baloon:after{font-family:sans-serif;font-weight:700;border-color:#f7f7f7;border-width:1px;background-color:#3ac62f;color:#fff}#globalNav{float:right;margin:15px 8px 0 9px;list-style:none;width:114px}#globalNav ul{list-style:none}#globalNavDetail>div{display:none;color:graytext;background-image:none;background-repeat:no-repeat;background-position:0 0;min-height:64px}#globalNavDetail #globalNavDetailApiPlatform{background-image:url(../img/appswitcher/apiPlatform_lg.png)}#globalNavDetail #globalNavDetailAppServices{background-image:url(../img/appswitcher/appServices_lg.png)}#globalNavDetail #globalNavDetailApigeeHome{margin-top:-10px;background-image:url(../img/appswitcher/home_lg.png)}#globalNavDetail #globalNavDet
 ailApiConsoles{background-image:url(../img/appswitcher/console_lg.png)}#globalNavDetail #globalNavDetailApigeeHome .globalNavDetailApigeeLogo{margin-top:10px;background-image:url(../img/appswitcher/logo_color.png);width:116px;height:40px}#globalNavDetail>div .globalNavDetailSubtitle{font-size:10px;text-transform:uppercase}#globalNavDetail>div .globalNavDetailTitle{margin-top:5px;font-size:20px}#globalNavDetail>div .globalNavDetailDescription{margin-top:10px;line-height:17px;font-style:oblique}.navbar.navbar-static-top .dropdownContainingSubmenu .dropdown-menu a{color:#494949;padding:13px 10px}.navbar.navbar-static-top .dropdownContainingSubmenu .dropdown-menu .active a{color:#fff;background-color:#bb2d16}.navbar.navbar-static-top .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:400;line-height:18px;color:#333;white-space:nowrap}#globalNav .dropdown-toggle{border-radius:3px;padding:3px 6px;margin:0}.dropdown-toggle{background-color:#bb2d16;padding:3px}.demo-hold
 er .alert.alert-demo{background-color:rgba(196,196,196,.1);color:#777;padding:12px 35px 7px 14px}.demo-holder-content{position:absolute;right:50px}.demo-text{position:absolute;right:223px;left:0;padding:0 0 0 10px}.b{display:block}.toggle,.toggle-form{position:absolute;top:10px;right:173px;width:50px;height:23px;border-radius:100px;background-color:#ddd;overflow:hidden;box-shadow:inset 0 0 2px 1px rgba(0,0,0,.05)}.form-horizontal.configs .control-label{width:250px;padding:0 10px 0 0}.toggle-form{position:relative;right:auto;top:auto;display:inline-block}.toggle-form-label{display:inline-block}input[type=checkbox].check{position:absolute;display:block;cursor:pointer;top:0;left:0;width:100%;height:100%;opacity:0;z-index:6}.check:checked~.track{box-shadow:inset 0 0 0 20px #00adee}.toggle-form .check:checked~.track{box-shadow:inset 0 0 0 20px #82ce85}.check:checked~.switch{right:2px;left:27px;transition:.4s ease;transition-property:left,right;transition-delay:.05s,0s}.switch{position:ab
 solute;left:2px;top:2px;bottom:2px;right:27px;background-color:#fff;border-radius:36px;z-index:1;transition:.4s ease;transition-property:left,right;transition-delay:0s,.05s;box-shadow:0 1px 2px rgba(0,0,0,.2)}.track{position:absolute;left:0;top:0;right:0;bottom:0;transition:.4s ease;box-shadow:inset 0 0 0 2px rgba(0,0,0,.05);border-radius:40px}.add-app .pictogram,top-selector .pictogram{margin:0 3px 0 0}i.pictogram{font-family:entypo;display:inline-block;width:23px;margin:0 5px 0 0;font-size:2.5em;height:17px;line-height:.35;overflow:hidden;vertical-align:middle;padding:5px 0 0;font-style:normal;font-weight:100;-webkit-font-smoothing:antialiased}i.pictogram.sub{margin:0 0 0 10px;font-size:2.1em}i.pictogram.title{margin:0;font-size:2.1em}i.pictogram.chart{margin:0 0 0 3px;font-size:2.1em;line-height:.4em;height:.5em;width:100%}i.pictogram.apichart{margin:0 0 0 11px;font-size:2.1em;line-height:.4em;height:.5em;width:100%}[class*=" ma-icon-"],[class^=ma-icon-]{display:inline-block;widt
 h:23px;height:20px;margin:1px 3px 0 0;line-height:20px;vertical-align:text-top;background-image:url(../img/nav-sprites.png);background-position:14px 14px;background-repeat:no-repeat}[class*=" sdk-icon-"],[class^=sdk-icon-]{display:inline-block;width:32px;height:29px;margin:-3px 3px 0 0;line-height:32px;vertical-align:text-top;background-image:url(../img/sdk-sprites.png);background-position:14px 14px;background-repeat:no-repeat;cursor:pointer;overflow:hidden}[class*=" sdk-icon-large-"],[class^=sdk-icon-large-]{display:inline-block;width:86px;height:86px;margin:-3px 3px 0 0;line-height:32px;vertical-align:text-top;background-image:url(../img/sdk-sprites-large.png);background-position:14px 14px;background-repeat:no-repeat;border:1px solid #aaa;-moz-box-shadow:3px 3px 0 -1px #ccc;-webkit-box-shadow:3px 3px 0 -1px #ccc;box-shadow:3px 3px 0 -1px #ccc}.sdk-icon-ios{background-position:-6px -4px}.sdk-icon-android{background-position:-59px -3px}.sdk-icon-js{background-position:-109px -4px}.s
 dk-icon-node{background-position:-154px -3px}.sdk-icon-ruby{background-position:-204px -3px}.sdk-icon-net{background-position:-256px -4px}.sdk-icon-large-ios{background-position:-6px -3px}.sdk-icon-large-android{background-position:-113px 0}.sdk-icon-large-js{background-position:-219px 0}.sdk-icon-large-node{background-position:-323px -3px}.sdk-icon-large-ruby{background-position:-431px 0}.sdk-icon-large-net{background-position:-537px -3px}body>header>.navbar{background-color:#00adee}body>header .navbar:first-child>a{height:22px;line-height:22px;padding:10px 20px 20px 13px}.navbar.navbar-static-top a{text-shadow:none;color:#fff}.navbar-text{color:#fff;margin:4px}.navbar-text .dropdown-menu a{color:#343434}.navbar-text.pull-left{margin-left:90px}.top-nav,ul.app-nav li,ul.org-nav li{background-color:#fff}.top-nav .btn-group{margin:9px 0 5px 5px}.nav .app-selector .caret,.nav .app-selector:active .caret,.nav .app-selector:focus .caret,.nav .app-selector:hover .caret,.nav .org-selector 
 .caret,.nav .org-selector:active .caret,.nav .org-selector:focus .caret,.nav .org-selector:hover .caret{border-top-color:#5f5f5f;border-bottom-color:transparent;margin-top:8px;position:absolute;right:10px}.org-options{margin:5px 2px -8px -5px;border-top:3px solid #e6e6e6;overflow:hidden}.navbar.secondary{margin:0 -20px 0 -21px;border-bottom:3px solid #e6e6e6}.navbar.secondary>.container-fluid{margin:0 -20px 0 -18px}.navbar.secondary .nav,.navbar.secondary>.container-fluid .nav-collapse.collapse.span9,.top-nav{margin:0}.top-nav>li,.top-nav>li>div{width:100%}.span9.button-area{margin-left:0}.navbar .nav a.btn-create i{margin:1px 0 0}.navbar .nav a.btn-create,.navbar .nav a.btn-create:hover{text-align:left;font-weight:400;color:#00adee;padding:0 0 0 10px;margin:4px 0 0 3px;display:block;width:140px;height:30px;line-height:30px;background-color:#f3f3f3}.navbar .nav a.btn-create:hover{color:#00adee}.navbar .nav a.btn-create:active{box-shadow:none}.sdks>ul>li.title label{color:#5f5f5f;fon
 t-size:15px;display:inline-block;padding:16px 0 0;line-height:6px;cursor:default}.sdks>ul>li.title a{color:#5f5f5f;font-size:15px;display:inline-block;padding:16px 0 0;line-height:6px}.sdks>ul{list-style:none;margin:0;height:32px;overflow:hidden}.sdks>ul>li{display:inline;margin:0 10px 0 0;line-height:11px}.navbar.secondary,.navbar.secondary .btn-group>.btn,.navbar.secondary .btn-group>.dropdown-menu,.side-menu .btn-group>.btn,.side-menu .dropdown-menu{text-transform:uppercase;font-family:marquette-regular,'Helvetica Neue',Helvetica,Arial,sans-serif;color:#5f5f5f;font-size:14px;-webkit-font-smoothing:antialiased}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{text-decoration:none;color:#fff;background-color:#5f5f5f;background-image:-moz-linear-gradient(top,#5f5f5f,#787878);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5f5f5f),to(#
 787878));background-image:-webkit-linear-gradient(top,#5f5f5f,#787878);background-image:-o-linear-gradient(top,#5f5f5f,#787878);background-image:linear-gradient(to bottom,#5f5f5f,#787878);background-repeat:repeat-x}.btn-group.open .btn.dropdown-toggle.top-selector,.top-selector,.top-selector:active,.top-selector:focus,.top-selector:hover{color:#5f5f5f;padding:0;text-shadow:none;background-color:transparent;background-image:none;border:0;box-shadow:none;outline:0;width:100%;text-align:left}.dialog-body{padding:20px}h1.title{font-size:1.3em;font-family:marquette-medium,"Helvetica Neue",sans-serif;color:#686868;line-height:17px;display:inline-block;padding:0 10px 0 0}h2.title{text-transform:uppercase;font-size:1.2em;border-top:2px solid #eee;color:#828282}h2.title.chart{margin:10px 0 20px 10px;z-index:101;position:absolute;top:0;left:0;right:0}h3.title{text-transform:uppercase;font-size:1.1em}.sidebar-nav .nav-list{padding:0}.nav-list .nav-header,.sidebar-nav .nav-list>li>a{margin-righ
 t:0}.sidebar-nav .nav-list.trans{max-height:100000px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;transition:all .5s ease;display:block;opacity:0}.sidebar-nav .nav-list li a{padding:10px 0 10px 25px;color:#5f5f5f;text-shadow:none;background-color:#eee;font-size:14px;text-transform:uppercase;position:relative}.sidebar-nav .nav-list li a.org-overview{background-color:#fff;font-family:marquette-light,'Helvetica Neue',Helvetica,Arial,sans-serif}.sidebar-nav .nav-list li a.org-overview:hover{color:#5f5f5f}.sidebar-nav .nav-list:first-child>li{margin:0;height:39px;overflow:hidden}.sidebar-nav .nav-list:first-child>li.active{height:auto;overflow:visible}.sidebar-nav .nav-list:first-child>li>ul>li>a{color:#5f5f5f}.sidebar-nav .nav-list:first-child>li.active>a,.sidebar-nav .nav-list:first-child>li>a:focus,.sidebar-nav .nav-list:first-child>li>a:hover{color:#fff;text-shadow:none;background-color:#00adee;margin:0 0 0 -15px}.sidebar-nav .nav-list:first-child li.active>ul>li>a{ba
 ckground-color:#fff}.sidebar-nav .nav-list li.option>ul{overflow:hidden;opacity:0;height:auto;display:block;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;transition:all .5s ease;max-height:100000px}.sidebar-nav .nav-list li.option.active>ul{opacity:1}.sidebar-nav .nav-list li.active>ul>li a{border-bottom:1px solid #eee;color:#747474;text-transform:none;font-weight:300;padding:10px 0 10px 22px}.sidebar-nav .nav-list li.active>ul>li.active>a,.sidebar-nav .nav-list li.active>ul>li>a:focus,.sidebar-nav .nav-list li.active>ul>li>a:hover{color:#00adee;background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAKCAYAAAB4zEQNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8v
 d3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9zaCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1NkEzQ0Y1MUI0MjIxMUUyODZGN0I5RUE1NjAwQ0I0MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1NkEzQ0Y1MkI0MjIxMUUyODZGN0I5RUE1NjAwQ0I0MCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU2QTNDRjRGQjQyMjExRTI4NkY3QjlFQTU2MDBDQjQwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU2QTNDRjUwQjQyMjExRTI4NkY3QjlFQTU2MDBDQjQwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+poqUzgAAAG1JREFUeNpilC5YwIADqLNgEWQG4kYg9mNCk1AE4sNAXA3iIEuGAPF5ILaECYAkeYB4DhCvBmJ+ZGNAkt+B+CkQ/0W3nAkqWA/EblBFKJIwsA+IDYF4BzZJEHgNxJ5AXAbEv1hwBEA3EK8BCDAAwgoRW2zTv6EAAAAASUVORK5CYII=) no-repeat;background-po
 sition:206px 16px;font-family:marquette-medium,'Helvetica Neue',Helvetica,Arial,sans-serif;border-bottom:1px solid #eee;text-shadow:none;-webkit-font-smoothing:antialiased}.sidebar-nav .nav-list li.option ul{list-style:none}.new-tag{border-radius:3px;display:inline-block;font-family:marquette-medium;font-size:.6em;background-color:rgba(26,26,26,.5);color:#fff;padding:3px;height:8px;line-height:8px;position:absolute;right:5px;top:13px}.sidebar-nav .nav-list li:active a{background-color:rgba(255,255,255,.5)}.app-creds dt{font-family:marquette-medium}.intro-container{position:relative;height:auto;-webkit-transition:all .5s ease-out;-moz-transition:all .5s ease-out;transition:all .5s ease-out;overflow:hidden}.sdk-intro{position:absolute;border:1px solid #aaa;background-color:#f4f4f4;-moz-box-shadow:inset 0 0 10px #ccc;-webkit-box-shadow:inset 0 0 10px #ccc;box-shadow:inset 0 4px 10px #ccc;opacity:.4;top:0;left:6px;right:1px;bottom:0;height:auto;overflow:hidden}.sdk-intro-content{positio
 n:absolute;padding:10px 40px 10px 10px;top:0;left:6px;right:-20px;bottom:0;height:auto;overflow:auto}.sdk-intro-content .btn.normal{margin:19px 10px 0 0}.keys-creds h2{margin-bottom:-2px}.user-list{padding:0;margin:0;list-style:none;min-height:450px;float:left;width:100%}.user-list li{padding:10px;border-bottom:1px solid #c5c5c5;cursor:pointer}.user-list li .label{margin:0 0 0 22px}.user-list li input{margin:0 10px 0 0}.user-list li.selected{background-color:#eee}#user-panel{margin-top:20px}.user-col{border-right:1px solid #c5c5c5;-moz-box-shadow:inset -27px 1px 6px -27px #b8b8b8;-webkit-box-shadow:inset -27px 1px 6px -27px #b8b8b8;box-shadow:inset -27px 1px 6px -27px #b8b8b8}.user-profile-picture{width:40px;height:40px}.content-page>.well{padding:10px;height:40px}.table-header td{font-weight:800;color:#000}.user-header-title{font-size:13px;font-family:marquette-regular,'Helvetica Neue',Helvetica,Arial,sans-serif}.tabbable>.tab-content{overflow:visible}.button-strip{float:right;marg
 in-bottom:10px}a.notifications-links{color:#1b97d1}.notifications-header{height:50px;background-color:#eee;padding:10px;border-bottom:1px solid #aaa;position:relative;overflow:hidden}.groups-row td.details,.notifications-row td.details,.roles-row td.details,.users-row td.details{line-height:25px!important;border-right:1px solid #e5e5e5}.nav-tabs>li{cursor:pointer}.login-content{position:absolute;top:91px;bottom:0;left:0;right:0;background-color:#fff;padding:9% 0 0 32%}.login-content form{margin:0}.login-content form h1{padding:10px 0 5px 20px}.login-holder{width:450px;border:1px solid #e5e5e5}.login-holder .form-actions{padding-left:30px;margin-bottom:0}.login-holder .form-actions .submit{padding:0 30px 0 0}.login-content .extra-actions{margin-top:10px;padding-left:30px;margin-bottom:0}.login-content .extra-actions .submit{padding:0 30px 0 0}.login-content .extra-actions .submit a{margin-left:3px;margin-right:3px}.signUp-content{position:absolute;top:91px;bottom:0;left:0;right:0;bac
 kground-color:#fff;padding:9% 0 0 32%}.signUp-content form{margin:0}.signUp-content form h1{padding:10px 0 5px 20px}.signUp-holder{width:450px;border:1px solid #e5e5e5}.signUp-holder .form-actions{margin-bottom:0}.signUp-holder .form-actions .submit{padding:0 30px 0 0}.table.collection-list{border:1px solid #eee}.formatted-json,.formatted-json ul{list-style:none}.formatted-json .key{font-family:marquette-medium}.formatted-json li{border-bottom:1px solid #eee;margin:3px 0}iframe[seamless]{background-color:transparent;border:0 none transparent;padding:0;overflow:visible;overflow-x:hidden;width:100%}.gravatar20{padding:7px 0 0 10px!important;margin:0;width:30px}#shell-panel *{font-family:monospace}#shell-panel .boxContent{font-family:monospace;font-size:14px;min-height:400px}#shell-panel input{font-family:monospace;overflow:auto;width:90%;margin-top:10px}#shell-panel hr{margin:2px;border-color:#e1e1e1}form input.has-error{-webkit-animation:pulse-red 1s alternate infinite;-moz-animation
 :pulse-red 1s alternate infinite;border:1px solid rgba(255,3,3,.6)}.validator-error-message{color:#ff0303}@-webkit-keyframes pulse-red{0%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.1),0 0 5px 2px rgba(255,3,3,.3)}100%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.3),0 0 5px 2px rgba(255,3,3,.1)}}@-moz-keyframes pulse-red{0%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.1),0 0 5px 2px rgba(255,3,3,.3)}100%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.3),0 0 5px 2px rgba(255,3,3,.1)}}.modal-instructions{padding-top:5px;padding-bottom:5px}.dropdown-menu{width:100%}.modal{width:560px!important}.dropdown-backdrop{position:static}.title.with-icons a{display:inline-block;text-transform:lowercase;font-size:.8em;margin:0 5px 0 0}.span9.tab-content{margin:0}.span9.tab-content .content-page{padding:0 0 0 30px}.button-toolbar,.menu-toolbar{padding:10px 0;margin:0;width:100%}.menu-toolbar{padding:0 0 20px}.menu-toolbar>ul.inline{border-bottom:1px solid #c5c5c5;margin:0}.btn-group .filter-selector,.btn-g
 roup .filter-selector:active,.btn-group .filter-selector:focus,.btn-group .filter-selector:hover,.btn-group .filter-title,.btn-group .filter-title:active,.btn-group .filter-title:focus,.btn-group.open .btn.dropdown-toggle.filter-selector,.btn-group.open .btn.dropdown-toggle.filter-title,.btn-group>.filter-selector.btn:first-child,.btn-group>.filter-title.btn:first-child,.btn.btn-primary,.btn.normal,.modal-footer .btn{color:#fff;padding:3px 9px;text-shadow:none;background-color:#494949;background-image:none;border:1px solid #c5c5c5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;box-shadow:none}ul.inline>li.tab{margin:0;padding:0}li.tab .btn.btn-primary{background-color:#eee;border:0;color:#494949;box-shadow:none;margin:0 -1px -1px -1px;padding:3px 19px 3px 16px;border-bottom:1px solid #c5c5c5}ul.inline>li.tab.selected{margin:0 0 -1px 0;border-bottom:1px solid #fff}li.tab.selected .btn.
 btn-primary.toolbar{color:#494949;border-left:1px solid #c5c5c5;border-right:1px solid #c5c5c5;border-top:1px solid #c5c5c5;border-bottom:0;background-color:#fff}li.tab.selected .btn-content{text-decoration:none;color:#494949}.btn-group.compare .filter-selector.btn:first-child,.btn.btn-primary.toolbar{color:#494949;background-color:#f1f1f1}li.selected .btn.btn-primary.toolbar{color:#fff;border:1px solid #00adee;background-color:#00adee}.btn.cancel,.btn.cancel:hover,.btn.normal.white,.btn.normal.white:hover{background-color:#fff;color:#5f5f5f}.btn-group .filter-selector:active,.btn-group .filter-title:hover,.btn-group.selected .filter-selector,.btn-group.selected>.filter-selector.btn:first-child,.btn.btn-primary:active,.btn.btn-primary:hover,.btn.normal:hover,.modal-footer .btn:active,.modal-footer .btn:hover{color:#fff;border:1px solid #00adee;background-color:#00adee}.btn-group .filter-selector .caret{margin:8px 0 0 10px;border-top:4px solid #fff;border-right:4px solid transparent;
 border-left:4px solid transparent}.btn-group.header-button{margin:4px 0 0;text-transform:none}.page-filters{padding:0;margin:10px 0}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;z-index:102}.modal{position:fixed;top:10%;left:50%;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3);*border:1px solid #999;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:0}.modal.fade{z-index:-200}.modal.fade.in{z-index:1050}.auto-update-container{padding:10px 0 0}.auto-updates{margin:0 10px 0 0}.super-help{font-size:9pt;vertical-align:super}.help_tooltip{font-size:9pt;text-transform:none}.helpButton{font-family:Helvetica,Arial,sans-serif;font-size:13px;font-weight:300;padding:5px 8px;text-align:ce
 nter;vertical-align:middle;color:#fff;border:1px solid #fff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#00adee;width:110px;outline:0}.helpButton:hover{cursor:pointer;background-color:#fff;color:#333;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-o-transition:background-color .1s;transition:background-color .1s}.helpButtonClicked{background-color:#fff;color:#333;outline:0}.introjs-overlay{background:0 0;filter:none;-ms-filter:"alpha(Opacity=20)";filter:alpha(opacity=20);background-color:#fff;opacity:.2}.introjs-helperLayer{border-radius:0;box-shadow:none;border:1px solid rgba(0,0,0,.25)}.introjs-helperNumberLayer{top:-12px;left:-12px;font-family:"Open Sans",Arial,sans-serif;font-weight:400;border:0;filter:none;filter:none;box-shadow:none}.introjs-arrow{border:10px solid #fff}.introjs-arrow.top{top:-20px;border-bottom-color:#6dbce3}.introjs-arrow.right{right:-20px;top:20px;border-left-color:#6dbce3}.introjs-arrow.
 bottom{bottom:-20px;border-top-color:#6dbce3}.introjs-arrow.left{left:-20px;top:20px;border-right-color:#6dbce3}.introjs-arrow:before{border:10px solid #fff;content:'';position:absolute}.introjs-arrow.top:before{top:-8px;left:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:#F0F8FC;border-left-color:transparent}.introjs-arrow.right:before{right:-7px;top:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:#F0F8FC}.introjs-arrow.bottom:before{bottom:-9px;left:-10px;border-top-color:#F0F8FC;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left:before{left:-7px;top:-10px;border-top-color:transparent;border-right-color:#F0F8FC;border-bottom-color:transparent;border-left-color:transparent}.introjs-tooltip{background-color:#F0F8FC;border-radius:0;border:1px solid #6dbce3;box-shadow:0 1px 7px rgba(0,0,0,.3)}.introjs-button{text-shado
 w:none;font:12px/normal sans-serif;color:#1f77a3;background-color:#F0F8FC;background-image:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #d4d4d4}.introjs-button:hover{font-family:"Open Sans",Arial,sans-serif}.introjs-button:active,.introjs-button:focus{text-decoration:none;outline:0}.introjs-skipbutton{color:#1f77a3;text-decoration:none;font-family:"Open Sans",Arial,sans-serif;margin-right:32px;border:1px solid #6dbce3}.introjs-nextbutton{text-decoration:none;font-family:"Open Sans",Arial,sans-serif;width:40px;margin-left:3px}.introjs-prevbutton{text-decoration:none;font-family:"Open Sans",Arial,sans-serif;width:40px}.introjs-nextbutton,.introjs-nextbutton:active,.introjs-nextbutton:focus,.introjs-nextbutton:hover{background-image:url(../img/introjs_arrow_step_next.png);background-position:45px 5px;background-repeat:no-repeat;text-align:left;border:1px solid #6dbce3}.introjs-prevbutton,.introjs-prevbutton:active,.introjs-prevbutton:focus,.i
 ntrojs-prevbutton:hover{background-image:url(../img/introjs_arrow_step_prev.png);background-position:2px 5px;background-repeat:no-repeat;text-align:right;border:1px solid #6dbce3}.introjs-nextbutton.introjs-disabled,.introjs-nextbutton.introjs-disabled:active,.introjs-nextbutton.introjs-disabled:focus,.introjs-nextbutton.introjs-disabled:hover{background-image:url(../img/introjs_arrow_step_next_disabled.png);background-position:48px 5px;background-repeat:no-repeat;text-align:left;border:1px solid #d4d4d4}.introjs-prevbutton.introjs-disabled,.introjs-prevbutton.introjs-disabled:active,.introjs-prevbutton.introjs-disabled:focus,.introjs-prevbutton.introjs-disabled:hover{background-image:url(../img/introjs_arrow_step_prev_disabled.png);background-position:2px 5px;background-repeat:no-repeat;text-align:right;border:1px solid #d4d4d4}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:gray;background-color:#F0F8FC}.introjs-tooltiptext{font-size:13px;line-height:19px}.
 introjstooltipheader{font-size:13px;line-height:19px;font-family:marquette-medium,'Helvetica Neue',Helvetica,Arial,sans-serif}.introjs-tooltip{min-width:210px;max-width:450px}
\ No newline at end of file
+.ng-cloak,.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none}html{min-height:100%;position:relative;margin:0 auto;background:#fff;min-width:1100px}body{padding:0;background-color:#fff;font-family:marquette-light,'Helvetica Neue',Helvetica,Arial,sans-serif;height:100%;max-height:100%;overflow-x:hidden}a{cursor:pointer}@font-face{font-family:entypo;src:url(entypo/entypo.eot);src:url(entypo/entypo.eot?#iefix) format('embedded-opentype'),url(entypo/entypo.woff) format('woff'),url(entypo/entypo.ttf) format('truetype'),url(entypo/entypo.svg#entypo) format('svg');font-weight:400;font-style:normal}.bold{font-family:marquette-medium}.main-content{background-color:#fff;margin:0 0 0 200px}.side-menu{position:absolute;top:60px;left:0;bottom:0;width:200px;float:left;background-color:#eee}footer{padding-top:20px;clear:both}.zero-out{padding:0;text-shadow:none;background-color:transparent;background-image:none;border:0;box-shadow:none;outline:0}.modal-body{overflow-y:visi
 ble}.demo-holder{margin:0 -20px 0 -20px;position:relative}.alert-holder{position:fixed;right:0;margin:20px 20px 0 0;z-index:10500;width:302px}.alert,.alert.alert-demo{padding:9px 35px 5px 14px;margin-bottom:3px;text-shadow:0 1px 0 rgba(255,255,255,.5);background-color:#eee;border:1px solid #eee;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-transition:all 1s ease;-moz-transition:all 1s ease;transition:all 1s ease;height:0;overflow:hidden;line-height:0;float:right}.alert.alert-demo{float:none}.alert{width:0}.alert.alert-success{background-color:rgba(155,198,144,.31);color:#1f6719;border-left:2px solid #1f6719}.alert.alert-warning{background-color:rgba(239,172,37,.2);color:#efac25;border-left:2px solid #efac25}.alert.alert-info{background-color:rgba(27,151,209,.2);color:#1b97d1;border-left:2px solid #1b97d1}.alert.alert-error{background-color:rgba(255,3,3,.2);color:#ff0303;border-left:2px solid #ff0303}.alert.alert-animate.alert-demo{height:20px;line-height:norma
 l;opacity:1;width:100%;-moz-box-shadow:inset 0 2px 13px #b8b8b8;-webkit-box-shadow:inset 0 2px 13px #b8b8b8;box-shadow:inset 0 2px 13px #b8b8b8}.alert.alert-animate{height:auto;line-height:normal;opacity:.9;width:300px}@-webkit-keyframes alert-out{from{opacity:1}to{-webkit-transform:translateY(500px);opacity:0}}@keyframes alert-out{from{opacity:1}to{transform:translateY(500px);opacity:0}}.fade-out{-webkit-animation-name:alert-out;-webkit-animation-duration:1s;-webkit-animation-timing-function:step-stop;-webkit-animation-direction:normal;-webkit-animation-iteration-count:1;animation-name:alert-out;animation-duration:1s;animation-timing-function:step-stop;animation-direction:normal;animation-iteration-count:1;opacity:.9}.margin-35{margin-top:35px}.modal-footer{background-color:transparent}.baloon{margin:20px;padding:20px 30px;position:fixed;bottom:0;top:auto;border-style:solid;border-radius:2px;box-shadow:0 0 4px rgba(0,0,0,.8)}.baloon:after{content:"";position:absolute;width:10px;hei
 ght:10px;-webkit-transform:rotate(45deg);-moz-transform:rotate(45deg);-o-transform:rotate(45deg);-ms-filter:"progid:DXImageTransform.Microsoft.Matrix(M11=0.7071067811865473, M12=-0.7071067811865477, M21=0.7071067811865477, M22=0.7071067811865473, SizingMethod='auto expand')"}.north.baloon:after{top:-6px;left:30px;border-top-style:solid;border-left-style:solid;box-shadow:-2px -2px 3px -1px rgba(0,0,0,.5)}.south.baloon:after{bottom:-6px;left:30px;border-bottom-style:solid;border-right-style:solid;box-shadow:2px 2px 3px -1px rgba(0,0,0,.5)}.left.baloon:after{top:10px;left:-6px;border-bottom-style:solid;border-left-style:solid;box-shadow:-2px 2px 3px -1px rgba(0,0,0,.5)}.right.baloon:after{bottom:10px;right:-6px;border-top-style:solid;border-right-style:solid;box-shadow:2px -2px 3px -1px rgba(0,0,0,.5)}.baloon,.baloon:after{font-family:sans-serif;font-weight:700;border-color:#f7f7f7;border-width:1px;background-color:#3ac62f;color:#fff}#globalNav{float:right;margin:15px 8px 0 9px;list-st
 yle:none;width:114px}#globalNav ul{list-style:none}#globalNavDetail>div{display:none;color:graytext;background-image:none;background-repeat:no-repeat;background-position:0 0;min-height:64px}#globalNavDetail #globalNavDetailApiPlatform{background-image:url(../img/appswitcher/apiPlatform_lg.png)}#globalNavDetail #globalNavDetailAppServices{background-image:url(../img/appswitcher/appServices_lg.png)}#globalNavDetail #globalNavDetailApigeeHome{margin-top:-10px;background-image:url(../img/appswitcher/home_lg.png)}#globalNavDetail #globalNavDetailApiConsoles{background-image:url(../img/appswitcher/console_lg.png)}#globalNavDetail #globalNavDetailApigeeHome .globalNavDetailApigeeLogo{margin-top:10px;background-image:url(../img/appswitcher/logo_color.png);width:116px;height:40px}#globalNavDetail>div .globalNavDetailSubtitle{font-size:10px;text-transform:uppercase}#globalNavDetail>div .globalNavDetailTitle{margin-top:5px;font-size:20px}#globalNavDetail>div .globalNavDetailDescription{margin-
 top:10px;line-height:17px;font-style:oblique}.navbar.navbar-static-top .dropdownContainingSubmenu .dropdown-menu a{color:#494949;padding:13px 10px}.navbar.navbar-static-top .dropdownContainingSubmenu .dropdown-menu .active a{color:#fff;background-color:#bb2d16}.navbar.navbar-static-top .dropdown-menu a{display:block;padding:3px 15px;clear:both;font-weight:400;line-height:18px;color:#333;white-space:nowrap}#globalNav .dropdown-toggle{border-radius:3px;padding:3px 6px;margin:0}.dropdown-toggle{background-color:#bb2d16;padding:3px}.demo-holder .alert.alert-demo{background-color:rgba(196,196,196,.1);color:#777;padding:12px 35px 7px 14px}.demo-holder-content{position:absolute;right:50px}.demo-text{position:absolute;right:223px;left:0;padding:0 0 0 10px}.b{display:block}.toggle,.toggle-form{position:absolute;top:10px;right:173px;width:50px;height:23px;border-radius:100px;background-color:#ddd;overflow:hidden;box-shadow:inset 0 0 2px 1px rgba(0,0,0,.05)}.form-horizontal.configs .control-la
 bel{width:250px;padding:0 10px 0 0}.toggle-form{position:relative;right:auto;top:auto;display:inline-block}.toggle-form-label{display:inline-block}input[type=checkbox].check{position:absolute;display:block;cursor:pointer;top:0;left:0;width:100%;height:100%;opacity:0;z-index:6}.check:checked~.track{box-shadow:inset 0 0 0 20px #00adee}.toggle-form .check:checked~.track{box-shadow:inset 0 0 0 20px #82ce85}.check:checked~.switch{right:2px;left:27px;transition:.4s ease;transition-property:left,right;transition-delay:.05s,0s}.switch{position:absolute;left:2px;top:2px;bottom:2px;right:27px;background-color:#fff;border-radius:36px;z-index:1;transition:.4s ease;transition-property:left,right;transition-delay:0s,.05s;box-shadow:0 1px 2px rgba(0,0,0,.2)}.track{position:absolute;left:0;top:0;right:0;bottom:0;transition:.4s ease;box-shadow:inset 0 0 0 2px rgba(0,0,0,.05);border-radius:40px}.add-app .pictogram,top-selector .pictogram{margin:0 3px 0 0}i.pictogram{font-family:entypo;display:inline-
 block;width:23px;margin:0 5px 0 0;font-size:2.5em;height:17px;line-height:.35;overflow:hidden;vertical-align:middle;padding:5px 0 0;font-style:normal;font-weight:100;-webkit-font-smoothing:antialiased}i.pictogram.sub{margin:0 0 0 10px;font-size:2.1em}i.pictogram.title{margin:0;font-size:2.1em}i.pictogram.chart{margin:0 0 0 3px;font-size:2.1em;line-height:.4em;height:.5em;width:100%}i.pictogram.apichart{margin:0 0 0 11px;font-size:2.1em;line-height:.4em;height:.5em;width:100%}[class*=" ma-icon-"],[class^=ma-icon-]{display:inline-block;width:23px;height:20px;margin:1px 3px 0 0;line-height:20px;vertical-align:text-top;background-image:url(../img/nav-sprites.png);background-position:14px 14px;background-repeat:no-repeat}[class*=" sdk-icon-"],[class^=sdk-icon-]{display:inline-block;width:25px;height:29px;margin:-3px 3px 0 0;line-height:32px;vertical-align:text-top;background-image:url(../img/sdk-sprites.png);background-position:14px 14px;background-repeat:no-repeat;cursor:pointer;overflo
 w:hidden}[class*=" sdk-icon-large-"],[class^=sdk-icon-large-]{display:inline-block;width:86px;height:86px;margin:-3px 3px 0 0;line-height:32px;vertical-align:text-top;background-image:url(../img/sdk-sprites-large.png);background-position:14px 14px;background-repeat:no-repeat;border:1px solid #aaa;-moz-box-shadow:3px 3px 0 -1px #ccc;-webkit-box-shadow:3px 3px 0 -1px #ccc;box-shadow:3px 3px 0 -1px #ccc}.sdk-icon-ios{background-position:-10px -4px}.sdk-icon-android{background-position:-48px -3px}.sdk-icon-js{background-position:-86px -4px}.sdk-icon-node{background-position:-120px -3px}.sdk-icon-ruby{background-position:-163px -3px}.sdk-icon-net{background-position:-199px -4px}.sdk-icon-perl{background-position:-231px -4px}.sdk-icon-large-ios{background-position:-6px -3px}.sdk-icon-large-android{background-position:-113px 0}.sdk-icon-large-js{background-position:-219px 0}.sdk-icon-large-node{background-position:-323px -3px}.sdk-icon-large-ruby{background-position:-431px 0}.sdk-icon-larg
 e-net{background-position:-537px -3px}.sdk-icon-large-perl{background-position:-630px -3px}body>header>.navbar{background-color:#00adee}body>header .navbar:first-child>a{height:22px;line-height:22px;padding:10px 20px 20px 13px}.navbar.navbar-static-top a{text-shadow:none;color:#fff}.navbar-text{color:#fff;margin:4px}.navbar-text .dropdown-menu a{color:#343434}.navbar-text.pull-left{margin-left:90px}.top-nav,ul.app-nav li,ul.org-nav li{background-color:#fff}.top-nav .btn-group{margin:9px 0 5px 5px}.nav .app-selector .caret,.nav .app-selector:active .caret,.nav .app-selector:focus .caret,.nav .app-selector:hover .caret,.nav .org-selector .caret,.nav .org-selector:active .caret,.nav .org-selector:focus .caret,.nav .org-selector:hover .caret{border-top-color:#5f5f5f;border-bottom-color:transparent;margin-top:8px;position:absolute;right:10px}.org-options{margin:5px 2px -8px -5px;border-top:3px solid #e6e6e6;overflow:hidden}.navbar.secondary{margin:0 -20px 0 -21px;border-bottom:3px solid 
 #e6e6e6}.navbar.secondary>.container-fluid{margin:0 -20px 0 -18px}.navbar.secondary .nav,.navbar.secondary>.container-fluid .nav-collapse.collapse.span9,.top-nav{margin:0}.top-nav>li,.top-nav>li>div{width:100%}.span9.button-area{margin-left:0}.navbar .nav a.btn-create i{margin:1px 0 0}.navbar .nav a.btn-create,.navbar .nav a.btn-create:hover{text-align:left;font-weight:400;color:#00adee;padding:0 0 0 10px;margin:4px 0 0 3px;display:block;width:140px;height:30px;line-height:30px;background-color:#f3f3f3}.navbar .nav a.btn-create:hover{color:#00adee}.navbar .nav a.btn-create:active{box-shadow:none}.sdks>ul>li.title label{color:#5f5f5f;font-size:15px;display:inline-block;padding:16px 0 0;line-height:6px;cursor:default}.sdks>ul>li.title a{color:#5f5f5f;font-size:15px;display:inline-block;padding:16px 0 0;line-height:6px}.sdks>ul{list-style:none;margin:0;height:32px;overflow:hidden}.sdks>ul>li{display:inline;margin:0 10px 0 0;line-height:11px}.navbar.secondary,.navbar.secondary .btn-grou
 p>.btn,.navbar.secondary .btn-group>.dropdown-menu,.side-menu .btn-group>.btn,.side-menu .dropdown-menu{text-transform:uppercase;font-family:marquette-regular,'Helvetica Neue',Helvetica,Arial,sans-serif;color:#5f5f5f;font-size:14px;-webkit-font-smoothing:antialiased}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover,.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover,.dropdown-submenu:focus>a,.dropdown-submenu:hover>a{text-decoration:none;color:#fff;background-color:#5f5f5f;background-image:-moz-linear-gradient(top,#5f5f5f,#787878);background-image:-webkit-gradient(linear,0 0,0 100%,from(#5f5f5f),to(#787878));background-image:-webkit-linear-gradient(top,#5f5f5f,#787878);background-image:-o-linear-gradient(top,#5f5f5f,#787878);background-image:linear-gradient(to bottom,#5f5f5f,#787878);background-repeat:repeat-x}.btn-group.open .btn.dropdown-toggle.top-selector,.top-selector,.top-selector:active,.top-selector:focus,.top-selector:hover{color:#5f5f5f
 ;padding:0;text-shadow:none;background-color:transparent;background-image:none;border:0;box-shadow:none;outline:0;width:100%;text-align:left}.dialog-body{padding:20px}h1.title{font-size:1.3em;font-family:marquette-medium,"Helvetica Neue",sans-serif;color:#686868;line-height:17px;display:inline-block;padding:0 10px 0 0}h2.title{text-transform:uppercase;font-size:1.2em;border-top:2px solid #eee;color:#828282}h2.title.chart{margin:10px 0 20px 10px;z-index:101;position:absolute;top:0;left:0;right:0}h3.title{text-transform:uppercase;font-size:1.1em}.sidebar-nav .nav-list{padding:0}.nav-list .nav-header,.sidebar-nav .nav-list>li>a{margin-right:0}.sidebar-nav .nav-list.trans{max-height:100000px;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;transition:all .5s ease;display:block;opacity:0}.sidebar-nav .nav-list li a{padding:10px 0 10px 25px;color:#5f5f5f;text-shadow:none;background-color:#eee;font-size:14px;text-transform:uppercase;position:relative}.sidebar-nav .nav-list li a
 .org-overview{background-color:#fff;font-family:marquette-light,'Helvetica Neue',Helvetica,Arial,sans-serif}.sidebar-nav .nav-list li a.org-overview:hover{color:#5f5f5f}.sidebar-nav .nav-list:first-child>li{margin:0;height:39px;overflow:hidden}.sidebar-nav .nav-list:first-child>li.active{height:auto;overflow:visible}.sidebar-nav .nav-list:first-child>li>ul>li>a{color:#5f5f5f}.sidebar-nav .nav-list:first-child>li.active>a,.sidebar-nav .nav-list:first-child>li>a:focus,.sidebar-nav .nav-list:first-child>li>a:hover{color:#fff;text-shadow:none;background-color:#00adee;margin:0 0 0 -15px}.sidebar-nav .nav-list:first-child li.active>ul>li>a{background-color:#fff}.sidebar-nav .nav-list li.option>ul{overflow:hidden;opacity:0;height:auto;display:block;-webkit-transition:all .5s ease;-moz-transition:all .5s ease;transition:all .5s ease;max-height:100000px}.sidebar-nav .nav-list li.option.active>ul{opacity:1}.sidebar-nav .nav-list li.active>ul>li a{border-bottom:1px solid #eee;color:#747474;tex
 t-transform:none;font-weight:300;padding:10px 0 10px 22px}.sidebar-nav .nav-list li.active>ul>li.active>a,.sidebar-nav .nav-list li.active>ul>li>a:focus,.sidebar-nav .nav-list li.active>ul>li>a:hover{color:#00adee;background:#fff url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAKCAYAAAB4zEQNAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyRpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYxIDY0LjE0MDk0OSwgMjAxMC8xMi8wNy0xMDo1NzowMSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNS4xIE1hY2ludG9za
 CIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDo1NkEzQ0Y1MUI0MjIxMUUyODZGN0I5RUE1NjAwQ0I0MCIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo1NkEzQ0Y1MkI0MjIxMUUyODZGN0I5RUE1NjAwQ0I0MCI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjU2QTNDRjRGQjQyMjExRTI4NkY3QjlFQTU2MDBDQjQwIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjU2QTNDRjUwQjQyMjExRTI4NkY3QjlFQTU2MDBDQjQwIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+poqUzgAAAG1JREFUeNpilC5YwIADqLNgEWQG4kYg9mNCk1AE4sNAXA3iIEuGAPF5ILaECYAkeYB4DhCvBmJ+ZGNAkt+B+CkQ/0W3nAkqWA/EblBFKJIwsA+IDYF4BzZJEHgNxJ5AXAbEv1hwBEA3EK8BCDAAwgoRW2zTv6EAAAAASUVORK5CYII=) no-repeat;background-position:206px 16px;font-family:marquette-medium,'Helvetica Neue',Helvetica,Arial,sans-serif;border-bottom:1px solid #eee;text-shadow:none;-webkit-font-smoothing:antialiased}.sidebar-nav .nav-list li.option ul{list-style:none}.new-tag{border-radius:3px;display:inline-block;font-family:marquette-medium;font-size:.6em;background-color:rgba(26,26,26,.5);co
 lor:#fff;padding:3px;height:8px;line-height:8px;position:absolute;right:5px;top:13px}.sidebar-nav .nav-list li:active a{background-color:rgba(255,255,255,.5)}.app-creds dt{font-family:marquette-medium}.intro-container{position:relative;height:auto;-webkit-transition:all .5s ease-out;-moz-transition:all .5s ease-out;transition:all .5s ease-out;overflow:hidden}.sdk-intro{position:absolute;border:1px solid #aaa;background-color:#f4f4f4;-moz-box-shadow:inset 0 0 10px #ccc;-webkit-box-shadow:inset 0 0 10px #ccc;box-shadow:inset 0 4px 10px #ccc;opacity:.4;top:0;left:6px;right:1px;bottom:0;height:auto;overflow:hidden}.sdk-intro-content{position:absolute;padding:10px 40px 10px 10px;top:0;left:6px;right:-20px;bottom:0;height:auto;overflow:auto}.sdk-intro-content .btn.normal{margin:19px 10px 0 0}.keys-creds h2{margin-bottom:-2px}.user-list{padding:0;margin:0;list-style:none;min-height:450px;float:left;width:100%}.user-list li{padding:10px;border-bottom:1px solid #c5c5c5;cursor:pointer}.user-l
 ist li .label{margin:0 0 0 22px}.user-list li input{margin:0 10px 0 0}.user-list li.selected{background-color:#eee}#user-panel{margin-top:20px}.user-col{border-right:1px solid #c5c5c5;-moz-box-shadow:inset -27px 1px 6px -27px #b8b8b8;-webkit-box-shadow:inset -27px 1px 6px -27px #b8b8b8;box-shadow:inset -27px 1px 6px -27px #b8b8b8}.user-profile-picture{width:40px;height:40px}.content-page>.well{padding:10px;height:40px}.table-header td{font-weight:800;color:#000}.user-header-title{font-size:13px;font-family:marquette-regular,'Helvetica Neue',Helvetica,Arial,sans-serif}.tabbable>.tab-content{overflow:visible}.button-strip{float:right;margin-bottom:10px}a.notifications-links{color:#1b97d1}.notifications-header{height:50px;background-color:#eee;padding:10px;border-bottom:1px solid #aaa;position:relative;overflow:hidden}.groups-row td.details,.notifications-row td.details,.roles-row td.details,.users-row td.details{line-height:25px!important;border-right:1px solid #e5e5e5}.nav-tabs>li{cu
 rsor:pointer}.login-content{position:absolute;top:91px;bottom:0;left:0;right:0;background-color:#fff;padding:9% 0 0 32%}.login-content form{margin:0}.login-content form h1{padding:10px 0 5px 20px}.login-holder{width:450px;border:1px solid #e5e5e5}.login-holder .form-actions{padding-left:30px;margin-bottom:0}.login-holder .form-actions .submit{padding:0 30px 0 0}.login-content .extra-actions{margin-top:10px;padding-left:30px;margin-bottom:0}.login-content .extra-actions .submit{padding:0 30px 0 0}.login-content .extra-actions .submit a{margin-left:3px;margin-right:3px}.signUp-content{position:absolute;top:91px;bottom:0;left:0;right:0;background-color:#fff;padding:9% 0 0 32%}.signUp-content form{margin:0}.signUp-content form h1{padding:10px 0 5px 20px}.signUp-holder{width:450px;border:1px solid #e5e5e5}.signUp-holder .form-actions{margin-bottom:0}.signUp-holder .form-actions .submit{padding:0 30px 0 0}.table.collection-list{border:1px solid #eee}.formatted-json,.formatted-json ul{list
 -style:none}.formatted-json .key{font-family:marquette-medium}.formatted-json li{border-bottom:1px solid #eee;margin:3px 0}iframe[seamless]{background-color:transparent;border:0 none transparent;padding:0;overflow:visible;overflow-x:hidden;width:100%}.gravatar20{padding:7px 0 0 10px!important;margin:0;width:30px}#shell-panel *{font-family:monospace}#shell-panel .boxContent{font-family:monospace;font-size:14px;min-height:400px}#shell-panel input{font-family:monospace;overflow:auto;width:90%;margin-top:10px}#shell-panel hr{margin:2px;border-color:#e1e1e1}form input.has-error{-webkit-animation:pulse-red 1s alternate infinite;-moz-animation:pulse-red 1s alternate infinite;border:1px solid rgba(255,3,3,.6)}.validator-error-message{color:#ff0303}@-webkit-keyframes pulse-red{0%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.1),0 0 5px 2px rgba(255,3,3,.3)}100%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.3),0 0 5px 2px rgba(255,3,3,.1)}}@-moz-keyframes pulse-red{0%{box-shadow:inset 0 0 5px 2px r
 gba(255,3,3,.1),0 0 5px 2px rgba(255,3,3,.3)}100%{box-shadow:inset 0 0 5px 2px rgba(255,3,3,.3),0 0 5px 2px rgba(255,3,3,.1)}}.modal-instructions{padding-top:5px;padding-bottom:5px}.dropdown-menu{width:100%}.modal{width:560px!important}.dropdown-backdrop{position:static}.title.with-icons a{display:inline-block;text-transform:lowercase;font-size:.8em;margin:0 5px 0 0}.span9.tab-content{margin:0}.span9.tab-content .content-page{padding:0 0 0 30px}.button-toolbar,.menu-toolbar{padding:10px 0;margin:0;width:100%}.menu-toolbar{padding:0 0 20px}.menu-toolbar>ul.inline{border-bottom:1px solid #c5c5c5;margin:0}.btn-group .filter-selector,.btn-group .filter-selector:active,.btn-group .filter-selector:focus,.btn-group .filter-selector:hover,.btn-group .filter-title,.btn-group .filter-title:active,.btn-group .filter-title:focus,.btn-group.open .btn.dropdown-toggle.filter-selector,.btn-group.open .btn.dropdown-toggle.filter-title,.btn-group>.filter-selector.btn:first-child,.btn-group>.filter-ti
 tle.btn:first-child,.btn.btn-primary,.btn.normal,.modal-footer .btn{color:#fff;padding:3px 9px;text-shadow:none;background-color:#494949;background-image:none;border:1px solid #c5c5c5;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;border-bottom-left-radius:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;box-shadow:none}ul.inline>li.tab{margin:0;padding:0}li.tab .btn.btn-primary{background-color:#eee;border:0;color:#494949;box-shadow:none;margin:0 -1px -1px -1px;padding:3px 19px 3px 16px;border-bottom:1px solid #c5c5c5}ul.inline>li.tab.selected{margin:0 0 -1px 0;border-bottom:1px solid #fff}li.tab.selected .btn.btn-primary.toolbar{color:#494949;border-left:1px solid #c5c5c5;border-right:1px solid #c5c5c5;border-top:1px solid #c5c5c5;border-bottom:0;background-color:#fff}li.tab.selected .btn-content{text-decoration:none;color:#494949}.btn-group.compare .filter-selector.btn:first-child,.btn.btn-primary.toolbar{color:#494949;background-color:#f1f1f1}li.selected
  .btn.btn-primary.toolbar{color:#fff;border:1px solid #00adee;background-color:#00adee}.btn.cancel,.btn.cancel:hover,.btn.normal.white,.btn.normal.white:hover{background-color:#fff;color:#5f5f5f}.btn-group .filter-selector:active,.btn-group .filter-title:hover,.btn-group.selected .filter-selector,.btn-group.selected>.filter-selector.btn:first-child,.btn.btn-primary:active,.btn.btn-primary:hover,.btn.normal:hover,.modal-footer .btn:active,.modal-footer .btn:hover{color:#fff;border:1px solid #00adee;background-color:#00adee}.btn-group .filter-selector .caret{margin:8px 0 0 10px;border-top:4px solid #fff;border-right:4px solid transparent;border-left:4px solid transparent}.btn-group.header-button{margin:4px 0 0;text-transform:none}.page-filters{padding:0;margin:10px 0}.dropdown-menu{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;z-index:102}.modal{position:fixed;top:10%;left:50%;margin-left:-280px;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.3)
 ;*border:1px solid #999;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:0 3px 7px rgba(0,0,0,.3);-moz-box-shadow:0 3px 7px rgba(0,0,0,.3);box-shadow:0 3px 7px rgba(0,0,0,.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:0}.modal.fade{z-index:-200}.modal.fade.in{z-index:1050}.auto-update-container{padding:10px 0 0}.auto-updates{margin:0 10px 0 0}.super-help{font-size:9pt;vertical-align:super}.help_tooltip{font-size:9pt;text-transform:none}.helpButton{font-family:Helvetica,Arial,sans-serif;font-size:13px;font-weight:300;padding:5px 8px;text-align:center;vertical-align:middle;color:#fff;border:1px solid #fff;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;background-color:#00adee;width:110px;outline:0}.helpButton:hover{cursor:pointer;background-color:#fff;color:#333;-webkit-transition:background-color .1s;-moz-transition:background-color .1s;-o-transition:background-color .1s;t
 ransition:background-color .1s}.helpButtonClicked{background-color:#fff;color:#333;outline:0}.introjs-overlay{background:0 0;filter:none;-ms-filter:"alpha(Opacity=20)";filter:alpha(opacity=20);background-color:#fff;opacity:.2}.introjs-helperLayer{border-radius:0;box-shadow:none;border:1px solid rgba(0,0,0,.25)}.introjs-helperNumberLayer{top:-12px;left:-12px;font-family:"Open Sans",Arial,sans-serif;font-weight:400;border:0;filter:none;filter:none;box-shadow:none}.introjs-arrow{border:10px solid #fff}.introjs-arrow.top{top:-20px;border-bottom-color:#6dbce3}.introjs-arrow.right{right:-20px;top:20px;border-left-color:#6dbce3}.introjs-arrow.bottom{bottom:-20px;border-top-color:#6dbce3}.introjs-arrow.left{left:-20px;top:20px;border-right-color:#6dbce3}.introjs-arrow:before{border:10px solid #fff;content:'';position:absolute}.introjs-arrow.top:before{top:-8px;left:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:#F0F8FC;border-left-color:transparent}.in
 trojs-arrow.right:before{right:-7px;top:-10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent;border-left-color:#F0F8FC}.introjs-arrow.bottom:before{bottom:-9px;left:-10px;border-top-color:#F0F8FC;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.introjs-arrow.left:before{left:-7px;top:-10px;border-top-color:transparent;border-right-color:#F0F8FC;border-bottom-color:transparent;border-left-color:transparent}.introjs-tooltip{background-color:#F0F8FC;border-radius:0;border:1px solid #6dbce3;box-shadow:0 1px 7px rgba(0,0,0,.3)}.introjs-button{text-shadow:none;font:12px/normal sans-serif;color:#1f77a3;background-color:#F0F8FC;background-image:none;-webkit-border-radius:2px;-moz-border-radius:2px;border-radius:2px;border:1px solid #d4d4d4}.introjs-button:hover{font-family:"Open Sans",Arial,sans-serif}.introjs-button:active,.introjs-button:focus{text-decoration:none;outline:0}.introjs-skipbutton{color:
 #1f77a3;text-decoration:none;font-family:"Open Sans",Arial,sans-serif;margin-right:32px;border:1px solid #6dbce3}.introjs-nextbutton{text-decoration:none;font-family:"Open Sans",Arial,sans-serif;width:40px;margin-left:3px}.introjs-prevbutton{text-decoration:none;font-family:"Open Sans",Arial,sans-serif;width:40px}.introjs-nextbutton,.introjs-nextbutton:active,.introjs-nextbutton:focus,.introjs-nextbutton:hover{background-image:url(../img/introjs_arrow_step_next.png);background-position:45px 5px;background-repeat:no-repeat;text-align:left;border:1px solid #6dbce3}.introjs-prevbutton,.introjs-prevbutton:active,.introjs-prevbutton:focus,.introjs-prevbutton:hover{background-image:url(../img/introjs_arrow_step_prev.png);background-position:2px 5px;background-repeat:no-repeat;text-align:right;border:1px solid #6dbce3}.introjs-nextbutton.introjs-disabled,.introjs-nextbutton.introjs-disabled:active,.introjs-nextbutton.introjs-disabled:focus,.introjs-nextbutton.introjs-disabled:hover{backgro
 und-image:url(../img/introjs_arrow_step_next_disabled.png);background-position:48px 5px;background-repeat:no-repeat;text-align:left;border:1px solid #d4d4d4}.introjs-prevbutton.introjs-disabled,.introjs-prevbutton.introjs-disabled:active,.introjs-prevbutton.introjs-disabled:focus,.introjs-prevbutton.introjs-disabled:hover{background-image:url(../img/introjs_arrow_step_prev_disabled.png);background-position:2px 5px;background-repeat:no-repeat;text-align:right;border:1px solid #d4d4d4}.introjs-disabled,.introjs-disabled:focus,.introjs-disabled:hover{color:gray;background-color:#F0F8FC}.introjs-tooltiptext{font-size:13px;line-height:19px}.introjstooltipheader{font-size:13px;line-height:19px;font-family:marquette-medium,'Helvetica Neue',Helvetica,Arial,sans-serif}.introjs-tooltip{min-width:210px;max-width:450px}
\ No newline at end of file


[02/23] incubator-usergrid git commit: Minor tweaks to comments.

Posted by sn...@apache.org.
Minor tweaks to comments.


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

Branch: refs/heads/two-dot-o
Commit: 5bdea9c0d2ba7642dd94205779abb9ac8650e1b8
Parents: 4bd1115
Author: Dave Johnson <dm...@apigee.com>
Authored: Thu Jun 25 16:16:01 2015 -0400
Committer: Dave Johnson <dm...@apigee.com>
Committed: Thu Jun 25 16:16:01 2015 -0400

----------------------------------------------------------------------
 .../org/apache/usergrid/tools/ExportAdmins.java | 25 +++++++++++++++-----
 .../org/apache/usergrid/tools/ImportAdmins.java | 21 ++++++++++++----
 2 files changed, 35 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5bdea9c0/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 f5d1b1d..d3d6371 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
@@ -14,11 +14,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.usergrid.tools;
 
 
-import au.com.bytecode.opencsv.CSVWriter;
 import com.google.common.collect.BiMap;
 import com.google.common.collect.HashBiMap;
 import org.apache.commons.cli.CommandLine;
@@ -26,7 +24,10 @@ import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionBuilder;
 import org.apache.commons.cli.Options;
 import org.apache.usergrid.management.UserInfo;
-import org.apache.usergrid.persistence.*;
+import org.apache.usergrid.persistence.Entity;
+import org.apache.usergrid.persistence.EntityManager;
+import org.apache.usergrid.persistence.Query;
+import org.apache.usergrid.persistence.Results;
 import org.apache.usergrid.persistence.Results.Level;
 import org.apache.usergrid.persistence.cassandra.CassandraService;
 import org.apache.usergrid.utils.StringUtils;
@@ -34,7 +35,6 @@ import org.codehaus.jackson.JsonGenerator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.FileWriter;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -43,9 +43,22 @@ import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEM
 
 
 /**
- * Export Admin Users and metadata including organizations.
+ * Export Admin Users and metadata including organizations and passwords.
  *
- * java -jar usergrid-tools.jar ExportAdmins
+ * Usage Example:
+ * 
+ * java -Xmx8000m -Dlog4j.configuration=file:/home/me/log4j.properties -classpath . \
+ *      -jar usergrid-tools-1.0.2.jar ImportAdmins -writeThreads 100 -auditThreads 100 \
+ *      -host casshost -inputDir=/home/me/export-data
+ * 
+ * If you want to provide any property overrides, put properties file named usergrid-custom-tools.properties
+ * in the same directory where you run the above command. For example, you might want to set the Cassandra
+ * client threads and export from a specific set of keyspaces:
+ * 
+ *    cassandra.connections=110
+ *    cassandra.system.keyspace=My_Usergrid
+ *    cassandra.application.keyspace=My_Usergrid_Applications
+ *    cassandra.lock.keyspace=My_Usergrid_Locks
  */
 public class ExportAdmins extends ExportingToolBase {
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/5bdea9c0/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 857e97e..39384e6 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
@@ -48,11 +48,22 @@ import static org.apache.usergrid.persistence.cassandra.CassandraService.MANAGEM
 
 
 /**
- * Usage example: 
+ * Import Admin Users and metadata including organizations and passwords.
  * 
- * java -Xmx8000m -Dlog4j.configuration=file:/home/dmjohnson/import-admins/log4j.properties -classpath . \
- *      -jar usergrid-tools-1.0.2.jar ImportAdmins -writeThreads 100 -auditThreads 100 -host cca03eadn \ 
- *      -inputDir=/home/dmjohnson/export-admins/exported > import3.log 2>&1 &
+ * Usage Example: 
+ * 
+ * java -Xmx8000m -Dlog4j.configuration=file:/home/me/log4j.properties -classpath . \
+ *      -jar usergrid-tools-1.0.2.jar ImportAdmins -writeThreads 100 -auditThreads 100 \
+ *      -host casshost -inputDir=/home/me/import-data 
+ *      
+ * If you want to provide any property overrides, put properties file named usergrid-custom-tools.properties
+ * in the same directory where you run the above command. For example, you might want to set the Cassandra
+ * client threads and import to a specific set of keyspaces:
+ *
+ *    cassandra.connections=110
+ *    cassandra.system.keyspace=My_Other_Usergrid
+ *    cassandra.application.keyspace=My_Other_Usergrid_Applications
+ *    cassandra.lock.keyspace=My_Other_Usergrid_Locks
  */
 public class ImportAdmins extends ToolBase {
 
@@ -651,7 +662,7 @@ public class ImportAdmins extends ToolBase {
 
                     if (entityProps == null) {
                         logger.warn("Reading from admin import queue was null!");
-                        Thread.sleep(1000);
+                        Thread.sleep( 1000 );
                         continue;
                     }