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/03/30 21:58:07 UTC

[03/50] incubator-usergrid git commit: Changes to merge appinfo and application_info collections into one application_info collection. Also: - Removed unnecessary system and default applications - Now use seek rather than search to load application info

Changes to merge appinfo and application_info collections into one application_info collection. Also:
- Removed unnecessary system and default applications
- Now use seek rather than search to load application info entities
- Uncommented the parts of ApplicationDeleteTest that did not work before the appinfo fix
- Will migrate old appinfo collection to application_info on startup, but can be configured to skip that


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

Branch: refs/heads/two-dot-o-dev
Commit: c0d50394e0e4f3b3669fcfd582b78ce49a86a542
Parents: 4d8678c
Author: Dave Johnson <dm...@apigee.com>
Authored: Wed Mar 4 13:34:11 2015 -0500
Committer: Dave Johnson <dm...@apigee.com>
Committed: Wed Mar 4 13:34:11 2015 -0500

----------------------------------------------------------------------
 .../main/resources/usergrid-default.properties  |   2 +
 .../corepersistence/CpEntityManagerFactory.java | 220 +++++++++++++------
 .../usergrid/corepersistence/CpSetup.java       |  12 +-
 .../rx/ApplicationObservable.java               |  14 +-
 .../corepersistence/util/CpNamingUtils.java     |  12 +-
 .../persistence/EntityManagerFactory.java       |   2 -
 .../cassandra/EntityManagerFactoryImpl.java     |   4 -
 .../persistence/cassandra/SetupImpl.java        |   2 -
 .../java/org/apache/usergrid/CoreITSetup.java   |   2 -
 .../org/apache/usergrid/CoreITSetupImpl.java    |   6 -
 .../rx/ApplicationObservableTestIT.java         |   1 -
 .../cassandra/EntityManagerFactoryImplIT.java   |   2 +-
 .../exceptions/NotFoundExceptionMapper.java     |  35 +++
 .../applications/ApplicationDeleteTest.java     |  71 +++---
 .../endpoints/mgmt/ManagementResponse.java      |   9 +
 .../cassandra/ManagementServiceImpl.java        |   5 +-
 .../services/ServiceManagerFactory.java         |   4 -
 .../usergrid/services/ServiceRequestIT.java     |   9 +-
 18 files changed, 249 insertions(+), 163 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/config/src/main/resources/usergrid-default.properties
----------------------------------------------------------------------
diff --git a/stack/config/src/main/resources/usergrid-default.properties b/stack/config/src/main/resources/usergrid-default.properties
index d42d12c..ffc7628 100644
--- a/stack/config/src/main/resources/usergrid-default.properties
+++ b/stack/config/src/main/resources/usergrid-default.properties
@@ -67,6 +67,8 @@ index.query.limit.default=1000
 usergrid.entity_cache_size=200
 usergrid.entity_cache_timeout_ms=500
 
+# Once you've run once with migration true, it is safe to disable this
+usergrid.twodoto.appinfo.migration=true
 
 ###############################################################################
 #

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
index 39243d2..99e07a5 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpEntityManagerFactory.java
@@ -29,13 +29,8 @@ import org.apache.commons.lang.StringUtils;
 
 import org.apache.usergrid.corepersistence.rx.AllEntitiesInSystemObservable;
 import org.apache.usergrid.corepersistence.util.CpNamingUtils;
-import org.apache.usergrid.persistence.AbstractEntity;
-import org.apache.usergrid.persistence.Entity;
-import org.apache.usergrid.persistence.EntityFactory;
-import org.apache.usergrid.persistence.EntityManager;
-import org.apache.usergrid.persistence.EntityManagerFactory;
-import org.apache.usergrid.persistence.EntityRef;
-import org.apache.usergrid.persistence.Results;
+import org.apache.usergrid.persistence.*;
+
 import static org.apache.usergrid.persistence.Schema.PROPERTY_NAME;
 import static org.apache.usergrid.persistence.Schema.PROPERTY_UUID;
 import static org.apache.usergrid.persistence.Schema.TYPE_APPLICATION;
@@ -50,7 +45,7 @@ import org.apache.usergrid.persistence.core.scope.ApplicationScope;
 import org.apache.usergrid.persistence.core.scope.ApplicationScopeImpl;
 import org.apache.usergrid.persistence.core.util.Health;
 import org.apache.usergrid.persistence.entities.Application;
-import org.apache.usergrid.persistence.entities.ApplicationInfo;
+import org.apache.usergrid.persistence.entities.Group;
 import org.apache.usergrid.persistence.exceptions.ApplicationAlreadyExistsException;
 import org.apache.usergrid.persistence.exceptions.DuplicateUniquePropertyExistsException;
 import org.apache.usergrid.persistence.exceptions.EntityNotFoundException;
@@ -92,7 +87,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     private static final Set<UUID> applicationIndexesCreated = new HashSet<UUID>();
 
 
-    // cache of already instantiated entity managers
+    // cache of already instantiated oldAppInfo managers
     private LoadingCache<UUID, EntityManager> entityManagers
         = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<UUID, EntityManager>() {
             public EntityManager load(UUID appId) { // no checked exception
@@ -118,7 +113,11 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         this.managerCache = injector.getInstance( ManagerCache.class );
         this.dataMigrationManager = injector.getInstance( DataMigrationManager.class );
 
-
+        // can be removed after everybody moves to Usergrid 2.0, default is true
+        Properties configProps = cassandraService.getProperties();
+        if ( configProps.getProperty("usergrid.twodoto.appinfo.migration", "true").equals("true")) {
+            migrateOldAppInfos();
+        }
     }
 
 
@@ -164,7 +163,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
             return entityManagers.get( applicationId );
         }
         catch ( Exception ex ) {
-            logger.error("Error getting entity manager", ex);
+            logger.error("Error getting oldAppInfo manager", ex);
         }
         return _getEntityManager( applicationId );
     }
@@ -254,13 +253,12 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
             em.refreshIndex();
         }
 
-        // create appinfo entry in the system app
+        // create appinfo entry in the management app
         final UUID appId = applicationId;
         final UUID orgId = orgUuid;
         Map<String, Object> appInfoMap = new HashMap<String, Object>() {{
             put( PROPERTY_NAME, appName );
             put( PROPERTY_UUID, appId );
-            put( "organizationUuid", orgId );
         }};
 
         try {
@@ -270,7 +268,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         }
         em.refreshIndex();
 
-        // create application entity
+        // create application oldAppInfo
         if ( properties == null ) {
             properties = new TreeMap<String, Object>( CASE_INSENSITIVE_ORDER );
         }
@@ -299,21 +297,19 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     @Override
     public void deleteApplication(UUID applicationId) throws Exception {
 
-        // remove old appinfo Entity, which is in the System App's appinfos collection
+        // remove old appinfo Entity, which is in the Management App's appinfos collection
         EntityManager em = getEntityManager( this.getManagementAppId() );
-        Query q = Query.fromQL(String.format("select * where applicationUuid = '%s'", applicationId.toString()));
-        Results results = em.searchCollection( em.getApplicationRef(), CpNamingUtils.APPLICATION_INFOS, q );
-        Entity appToDelete = results.getEntity();
-        em.delete( appToDelete );
+        Entity applicationInfo = em.get(new SimpleEntityRef(CpNamingUtils.APPLICATION_INFO, applicationId));
+        em.delete( applicationInfo );
 
         // create new Entity in deleted_appinfos collection, with same UUID and properties as deleted appinfo
-        em.create( CpNamingUtils.DELETED_APPINFO, appToDelete.getProperties() );
+        em.create( applicationId, CpNamingUtils.DELETED_APPLICATION_INFO, applicationInfo.getProperties() );
 
         em.refreshIndex();
 
         // delete the application's index
-        EntityIndex ei = managerCache.getEntityIndex(new ApplicationScopeImpl(
-            new SimpleId(applicationId, TYPE_APPLICATION)));
+        EntityIndex ei = managerCache.getEntityIndex(
+            new ApplicationScopeImpl( new SimpleId(applicationId, TYPE_APPLICATION)) );
         ei.deleteIndex();
     }
 
@@ -323,9 +319,7 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
 
         // remove old delete_appinfos Entity
         EntityManager em = getEntityManager(CpNamingUtils.MANAGEMENT_APPLICATION_ID);
-        Query q = Query.fromQL(String.format("select * where applicationUuid = '%s'", applicationId.toString()));
-        Results results = em.searchCollection(em.getApplicationRef(), CpNamingUtils.DELETED_APPINFOS, q);
-        Entity appToRestore = results.getEntity();
+        Entity appToRestore = em.get( new SimpleEntityRef( CpNamingUtils.DELETED_APPLICATION_INFO, applicationId ));
 
         if ( appToRestore == null ) {
             throw new EntityNotFoundException("Cannot restore. Deleted Application not found: " + applicationId );
@@ -333,18 +327,15 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
 
         em.delete( appToRestore );
 
-        // restore entity in appinfo collection
-        Map<String, Object> appProps = appToRestore.getProperties();
-        appProps.remove("uuid");
-        Entity restoredApp = em.create(CpNamingUtils.APPLICATION_INFO, appToRestore.getProperties());
-
+        // restore oldAppInfo in appinfo collection
+        em.create( appToRestore.getUuid(), CpNamingUtils.APPLICATION_INFO, appToRestore.getProperties());
         em.refreshIndex();
 
         // rebuild the apps index
         this.rebuildApplicationIndexes(applicationId, new ProgressObserver() {
             @Override
             public void onProgress(EntityRef entity) {
-                logger.info("Restored entity {}:{}", entity.getType(), entity.getUuid());
+                logger.info("Restored oldAppInfo {}:{}", entity.getType(), entity.getUuid());
             }
 
         });
@@ -383,20 +374,67 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
 
 
     @Override
-    public UUID lookupApplication( String name ) throws Exception {
+    public UUID lookupApplication( final String name ) throws Exception {
         init();
 
+        // attempt to look up APPLICATION_INFO oldAppInfo by name
+
+        UUID applicationId = null;
         EntityManager em = getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
         final EntityRef alias = em.getAlias( CpNamingUtils.APPLICATION_INFO, name );
-        if ( alias == null ) {
-            return null;
-        }
-        final Entity entity = em.get( alias );
-        if ( entity == null ) {
-            return null;
-        }
-        final UUID property = ( UUID ) entity.getProperty( "uuid" );
-        return property;
+        if ( alias != null ) {
+            Entity entity = em.get(alias);
+            applicationId = (UUID) entity.getProperty("uuid");
+        }
+
+        // below is not necessary if migrateOldAppInfos() has already run
+
+//        if ( applicationId == null ) {
+//
+//            // maybe there is a record in the old and deprecated "appinfos" collection
+//
+//            UUID organizationId = null;
+//
+//            Query q = Query.fromQL( PROPERTY_NAME + " = '" + name + "'");
+//            Results results = em.searchCollection( em.getApplicationRef(), "appinfos" , q);
+//            if ( !results.isEmpty() ) {
+//                Entity entity = results.iterator().next();
+//                Object uuidObject = entity.getProperty("applicationUuid");
+//                if (uuidObject instanceof UUID) {
+//                    applicationId = (UUID)uuidObject;
+//                } else {
+//                    applicationId = UUIDUtils.tryExtractUUID(uuidObject.toString());
+//                }
+//                uuidObject = entity.getProperty("organizationUuid");
+//                if (uuidObject instanceof UUID) {
+//                    organizationId = (UUID)uuidObject;
+//                } else {
+//                    organizationId = UUIDUtils.tryExtractUUID(uuidObject.toString());
+//                }
+//            }
+//
+//            if ( applicationId != null ) {
+//
+//                // copy application information into new APPLICATION_INFO collection
+//
+//                final UUID appId = applicationId;
+//                Map<String, Object> appInfoMap = new HashMap<String, Object>() {{
+//                    put( PROPERTY_NAME, name );
+//                    put( PROPERTY_UUID, appId );
+//                }};
+//
+//                final Entity appInfo;
+//                try {
+//                    appInfo = em.create( appId, CpNamingUtils.APPLICATION_INFO, appInfoMap );
+//                } catch (DuplicateUniquePropertyExistsException e) {
+//                    throw new ApplicationAlreadyExistsException(name);
+//                }
+//                em.createConnection( new SimpleEntityRef( Group.ENTITY_TYPE, organizationId ), "owns", appInfo );
+//                em.refreshIndex();
+//            }
+//        }
+
+        return applicationId;
     }
 
 
@@ -429,8 +467,8 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         final String scopeName;
         final String edgeType;
         if ( deleted ) {
-            edgeType = CpNamingUtils.getEdgeTypeFromCollectionName(CpNamingUtils.DELETED_APPINFOS);
-            scopeName = CpNamingUtils.getCollectionScopeNameFromCollectionName(CpNamingUtils.DELETED_APPINFOS);
+            edgeType = CpNamingUtils.getEdgeTypeFromCollectionName(CpNamingUtils.DELETED_APPLICATION_INFOS);
+            scopeName = CpNamingUtils.getCollectionScopeNameFromCollectionName(CpNamingUtils.DELETED_APPLICATION_INFOS);
         } else {
             edgeType = CpNamingUtils.getEdgeTypeFromCollectionName(CpNamingUtils.APPLICATION_INFOS );
             scopeName = CpNamingUtils.getCollectionScopeNameFromCollectionName(CpNamingUtils.APPLICATION_INFOS);
@@ -464,19 +502,82 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
                         .toBlockingObservable().lastOrDefault(null);
 
             if ( e == null ) {
-                logger.warn("Applicaion {} in index but not found in collections", targetId );
+                logger.warn("Application {} in index but not found in collections", targetId );
                 continue;
             }
 
-            appMap.put(
-                (String)e.getField( PROPERTY_NAME ).getValue(),
-                (UUID)e.getField( "applicationUuid" ).getValue());
+            appMap.put( (String)e.getField( PROPERTY_NAME ).getValue(), e.getId().getUuid());
         }
 
         return appMap;
     }
 
 
+    private void migrateOldAppInfos() {
+
+        EntityManager em = getEntityManager( CpNamingUtils.MANAGEMENT_APPLICATION_ID);
+
+        Query q = Query.fromQL("select *");
+        Results results = null;
+        try {
+            results = em.searchCollection(em.getApplicationRef(), "appinfos", q);
+        } catch (Exception e) {
+            logger.error("Error reading old appinfos collection, not migrating", e);
+            return;
+        }
+
+        if ( !results.isEmpty() ) {
+
+            // applications still found in old appinfos collection, migrate them.
+            logger.info("Migrating old appinfos");
+
+            for ( Entity oldAppInfo : results.getEntities() ) {
+
+                final String appName = oldAppInfo.getName();
+
+                UUID applicationId = null, organizationId = null;
+                Object uuidObject = oldAppInfo.getProperty("applicationUuid");
+                if (uuidObject instanceof UUID) {
+                    applicationId = (UUID) uuidObject;
+                } else {
+                    applicationId = UUIDUtils.tryExtractUUID(uuidObject.toString());
+                }
+                uuidObject = oldAppInfo.getProperty("organizationUuid");
+                if (uuidObject instanceof UUID) {
+                    organizationId = (UUID) uuidObject;
+                } else {
+                    organizationId = UUIDUtils.tryExtractUUID(uuidObject.toString());
+                }
+
+                // create and connect new APPLICATION_INFO oldAppInfo to Organization
+
+                final UUID appId = applicationId;
+                Map<String, Object> appInfoMap = new HashMap<String, Object>() {{
+                    put(PROPERTY_NAME, appName);
+                    put(PROPERTY_UUID, appId);
+                }};
+
+                final Entity appInfo;
+                try {
+                    appInfo = em.create(appId, CpNamingUtils.APPLICATION_INFO, appInfoMap);
+                    em.createConnection(new SimpleEntityRef(Group.ENTITY_TYPE, organizationId), "owns", appInfo);
+                    em.delete( oldAppInfo );
+                    logger.info("Migrated old appinfo for app {}", appName);
+
+                } catch (Exception e) {
+                    logger.error("Error migration application " + appName + " continuing ", e);
+                }
+            }
+
+            em.refreshIndex();
+
+        } else {
+            logger.info("No old appinfos found, no need for migration");
+        }
+
+    }
+
+
     @Override
     public void setup() throws Exception {
         getSetup().init();
@@ -628,14 +729,6 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     }
 
 
-    @Override
-    public UUID getDefaultAppId() {
-        return CpNamingUtils.DEFAULT_APPLICATION_ID;
-    }
-
-
-
-
     /**
      * Gets the setup.
      * @return Setup helper
@@ -678,14 +771,8 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     private List<EntityIndex> getManagementIndexes() {
 
         return Arrays.asList(
-
-            // management app
-            managerCache
-                .getEntityIndex( new ApplicationScopeImpl( new SimpleId( getManagementAppId(), "application" ) ) ),
-
-            // default app TODO: do we need this in two-dot-o
-            managerCache
-                .getEntityIndex( new ApplicationScopeImpl( new SimpleId( getDefaultAppId(), "application" ) ) ) );
+            managerCache.getEntityIndex( // management app
+                new ApplicationScopeImpl(new SimpleId(getManagementAppId(), "application"))));
     }
 
 
@@ -700,7 +787,11 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
         logger.info("About to rebuild indexes for {} applications", appMap.keySet().size());
 
         for ( UUID appUuid : appMap.values() ) {
-            rebuildApplicationIndexes( appUuid, po );
+            try {
+                rebuildApplicationIndexes(appUuid, po);
+            } catch ( Exception e) {
+                logger.error("Error rebuilding index for app " + appUuid + " continuing...", e );
+            }
         }
     }
 
@@ -708,7 +799,6 @@ public class CpEntityManagerFactory implements EntityManagerFactory, Application
     @Override
     public void rebuildInternalIndexes( ProgressObserver po ) throws Exception {
         rebuildApplicationIndexes( CpNamingUtils.MANAGEMENT_APPLICATION_ID, po );
-        rebuildApplicationIndexes( CpNamingUtils.DEFAULT_APPLICATION_ID, po );
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
index d70c16c..066a5eb 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/CpSetup.java
@@ -99,17 +99,7 @@ public class CpSetup implements Setup {
 
         injector.getInstance( DataMigrationManager.class ).migrate();
 
-        logger.info( "Setting up default applications" );
-
-        try {
-            emf.initializeApplication( DEFAULT_ORGANIZATION, emf.getDefaultAppId(), DEFAULT_APPLICATION, null );
-        }
-        catch ( ApplicationAlreadyExistsException ex ) {
-            logger.warn( "Application {}/{} already exists", DEFAULT_ORGANIZATION, DEFAULT_APPLICATION );
-        }
-        catch ( OrganizationAlreadyExistsException oaee ) {
-            logger.warn( "Organization {} already exists", DEFAULT_ORGANIZATION );
-        }
+        logger.info( "Setting up management app" );
 
         try {
             emf.initializeApplication( DEFAULT_ORGANIZATION, emf.getManagementAppId(), MANAGEMENT_APPLICATION, null );

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/corepersistence/rx/ApplicationObservable.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/rx/ApplicationObservable.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/rx/ApplicationObservable.java
index 65022e6..bc8882f 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/rx/ApplicationObservable.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/rx/ApplicationObservable.java
@@ -58,14 +58,10 @@ public class ApplicationObservable {
      */
     public static Observable<Id> getAllApplicationIds( final ManagerCache managerCache ) {
 
-        //emit our 3 hard coded applications that are used the manage the system first.
-        //this way consumers can perform whatever work they need to on the root system first
-
-
-        final Observable<Id> systemIds = Observable.from( Arrays
-            .asList( generateApplicationId( CpNamingUtils.DEFAULT_APPLICATION_ID ),
-                generateApplicationId( CpNamingUtils.MANAGEMENT_APPLICATION_ID ) ) );
-
+        // emit internal hard-coded applications first (currently there is only one)
+        // this way consumers can perform whatever work they need to on the root system first
+        final Observable<Id> systemIds = Observable.from(
+            Arrays.asList(  generateApplicationId( CpNamingUtils.MANAGEMENT_APPLICATION_ID ) ) );
 
         final ApplicationScope appScope = getApplicationScope( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
 
@@ -114,7 +110,7 @@ public class ApplicationObservable {
                             @Override
                             public Id call( final org.apache.usergrid.persistence.model.entity.Entity entity ) {
 
-                                final UUID uuid = ( UUID ) entity.getField( "applicationUuid" ).getValue();
+                                final UUID uuid = entity.getId().getUuid();
 
                                 return CpNamingUtils.generateApplicationId( uuid );
                             }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/corepersistence/util/CpNamingUtils.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/corepersistence/util/CpNamingUtils.java b/stack/core/src/main/java/org/apache/usergrid/corepersistence/util/CpNamingUtils.java
index 8c8f1c7..8f3327d 100644
--- a/stack/core/src/main/java/org/apache/usergrid/corepersistence/util/CpNamingUtils.java
+++ b/stack/core/src/main/java/org/apache/usergrid/corepersistence/util/CpNamingUtils.java
@@ -51,20 +51,14 @@ public class CpNamingUtils {
     public static final  UUID MANAGEMENT_APPLICATION_ID =
             UUID.fromString("b6768a08-b5d5-11e3-a495-11ddb1de66c8");
 
-    /** TODO Do we need this in two-dot-o? */
-    public static final  UUID DEFAULT_APPLICATION_ID =
-            UUID.fromString("b6768a08-b5d5-11e3-a495-11ddb1de66c9");
-
     /**
-     * The app infos entity object type. This holds the app name, appId, and org name
+     * Information about applications is stored in the management app using these types
      */
     public static final String APPLICATION_INFO = "application_info";
-
     public static final String APPLICATION_INFOS = "application_infos";
 
-    public static final String DELETED_APPINFO = "deleted_application_info";
-
-    public static final String DELETED_APPINFOS = "deleted_application_infos";
+    public static final String DELETED_APPLICATION_INFO = "deleted_application_info";
+    public static final String DELETED_APPLICATION_INFOS = "deleted_application_infos";
 
     /**
      * The name of the map that holds our entity id->type mapping

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManagerFactory.java b/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManagerFactory.java
index b668e24..3420b7f 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManagerFactory.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/EntityManagerFactory.java
@@ -117,8 +117,6 @@ public interface EntityManagerFactory {
 
     public UUID getManagementAppId();
 
-    public UUID getDefaultAppId();
-
     public void refreshIndex();
 
     public void rebuildAllIndexes( ProgressObserver po ) throws Exception;

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImpl.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImpl.java
index 9a90e59..54eefa4 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImpl.java
@@ -406,10 +406,6 @@ public class EntityManagerFactoryImpl implements EntityManagerFactory, Applicati
         return MANAGEMENT_APPLICATION_ID;
     }
 
-    @Override
-    public UUID getDefaultAppId() {
-        return DEFAULT_APPLICATION_ID;
-    }
 
     @Override
     public void refreshIndex() {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/SetupImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/SetupImpl.java b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/SetupImpl.java
index 23c0489..778f2d0 100644
--- a/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/SetupImpl.java
+++ b/stack/core/src/main/java/org/apache/usergrid/persistence/cassandra/SetupImpl.java
@@ -63,8 +63,6 @@ public class SetupImpl implements Setup {
 
     public void createDefaultApplications() throws Exception {
         // TODO unique check?
-        emf.initializeApplication( DEFAULT_ORGANIZATION, emf.getDefaultAppId(), DEFAULT_APPLICATION, null );
-
         emf.initializeApplication( DEFAULT_ORGANIZATION, emf.getManagementAppId(), MANAGEMENT_APPLICATION, null );
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/test/java/org/apache/usergrid/CoreITSetup.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/CoreITSetup.java b/stack/core/src/test/java/org/apache/usergrid/CoreITSetup.java
index 201a0c5..27475af 100644
--- a/stack/core/src/test/java/org/apache/usergrid/CoreITSetup.java
+++ b/stack/core/src/test/java/org/apache/usergrid/CoreITSetup.java
@@ -29,8 +29,6 @@ import org.apache.usergrid.persistence.cassandra.CassandraService;
 
 public interface CoreITSetup extends TestRule {
 
-    boolean USE_DEFAULT_APPLICATION = false;
-
     EntityManagerFactory getEmf();
 
     QueueManagerFactory getQmf();

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/test/java/org/apache/usergrid/CoreITSetupImpl.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/CoreITSetupImpl.java b/stack/core/src/test/java/org/apache/usergrid/CoreITSetupImpl.java
index d403a1e..6557b02 100644
--- a/stack/core/src/test/java/org/apache/usergrid/CoreITSetupImpl.java
+++ b/stack/core/src/test/java/org/apache/usergrid/CoreITSetupImpl.java
@@ -129,15 +129,9 @@ public class CoreITSetupImpl implements CoreITSetup {
 
     @Override
     public UUID createApplication( String organizationName, String applicationName ) throws Exception {
-
-        if ( USE_DEFAULT_APPLICATION ) {
-            return emf.getDefaultAppId();
-        }
-
         return emf.createApplication( organizationName, applicationName );
     }
 
-
     @Override
     public void dump( String name, Object obj ) {
         if ( obj != null && LOG.isInfoEnabled() ) {

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/test/java/org/apache/usergrid/corepersistence/rx/ApplicationObservableTestIT.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/corepersistence/rx/ApplicationObservableTestIT.java b/stack/core/src/test/java/org/apache/usergrid/corepersistence/rx/ApplicationObservableTestIT.java
index f21ca94..b564366 100644
--- a/stack/core/src/test/java/org/apache/usergrid/corepersistence/rx/ApplicationObservableTestIT.java
+++ b/stack/core/src/test/java/org/apache/usergrid/corepersistence/rx/ApplicationObservableTestIT.java
@@ -54,7 +54,6 @@ public class ApplicationObservableTestIT extends AbstractCoreIT {
 
         //now our get all apps we expect.  There may be more, but we don't care about those.
         final Set<UUID> applicationIds = new HashSet<UUID>() {{
-            add( CpNamingUtils.DEFAULT_APPLICATION_ID );
             add( CpNamingUtils.MANAGEMENT_APPLICATION_ID );
             add( createdApplication.getUuid() );
         }};

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/core/src/test/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImplIT.java
----------------------------------------------------------------------
diff --git a/stack/core/src/test/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImplIT.java b/stack/core/src/test/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImplIT.java
index c3bc020..2f29735 100644
--- a/stack/core/src/test/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImplIT.java
+++ b/stack/core/src/test/java/org/apache/usergrid/persistence/cassandra/EntityManagerFactoryImplIT.java
@@ -132,7 +132,7 @@ public class EntityManagerFactoryImplIT extends AbstractCoreIT {
             }
         }
 
-        assertTrue("Deleted app not found in deleted apps collection", found );
+        assertTrue( "Deleted app must be found in in deleted apps collection", found );
 
         // attempt to get entities in application's collections in various ways should all fail
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/NotFoundExceptionMapper.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/NotFoundExceptionMapper.java b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/NotFoundExceptionMapper.java
new file mode 100644
index 0000000..165a8d3
--- /dev/null
+++ b/stack/rest/src/main/java/org/apache/usergrid/rest/exceptions/NotFoundExceptionMapper.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      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.
+ */
+package org.apache.usergrid.rest.exceptions;
+
+
+import com.sun.jersey.api.NotFoundException;
+
+import javax.ws.rs.core.Response;
+import javax.ws.rs.ext.Provider;
+
+import static javax.ws.rs.core.Response.Status.NOT_FOUND;
+
+
+@Provider
+public class NotFoundExceptionMapper extends AbstractExceptionMapper<NotFoundException> {
+
+    @Override
+    public Response toResponse( NotFoundException e ) {
+        return toResponse( NOT_FOUND, e );
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteTest.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteTest.java b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteTest.java
index 82ec478..8ac449a 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteTest.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/applications/ApplicationDeleteTest.java
@@ -28,6 +28,7 @@ import org.junit.Test;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import javax.ws.rs.core.MediaType;
+import java.io.StringReader;
 import java.util.*;
 
 
@@ -41,14 +42,14 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
         // create app with a collection of "things"
 
         String orgName = clientSetup.getOrganization().getName();
-        String appToDelete = clientSetup.getAppName() + "_appToDelete";
+        String appToDeleteName = clientSetup.getAppName() + "_appToDelete";
         Token orgAdminToken = getAdminToken( clientSetup.getUsername(), clientSetup.getUsername());
 
         ApiResponse appCreateResponse = clientSetup.getRestClient()
             .management().orgs().organization( orgName ).app().getResource()
             .queryParam( "access_token", orgAdminToken.getAccessToken() )
             .type( MediaType.APPLICATION_JSON )
-            .post( ApiResponse.class, new Application( appToDelete ) );
+            .post( ApiResponse.class, new Application( appToDeleteName ) );
         UUID appToDeleteId = appCreateResponse.getEntities().get(0).getUuid();
 
         List<Entity> entities = new ArrayList<>();
@@ -61,7 +62,7 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
             }});
 
             ApiResponse createResponse = clientSetup.getRestClient()
-                .org(orgName).app( appToDelete ).collection("things").getResource()
+                .org(orgName).app( appToDeleteName ).collection("things").getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken())
                 .type(MediaType.APPLICATION_JSON)
                 .post( ApiResponse.class, entity );
@@ -80,7 +81,7 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
 
         try {
             clientSetup.getRestClient()
-                .org(orgName).app(appToDelete).getResource()
+                .org(orgName).app(appToDeleteName).getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken())
                 .type(MediaType.APPLICATION_JSON)
                 .get(ApiResponse.class);
@@ -97,7 +98,7 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
 
         try {
             clientSetup.getRestClient()
-                .org(orgName).app(appToDelete).collection("things").getResource()
+                .org(orgName).app(appToDeleteName).collection("things").getResource()
                 .queryParam("access_token", orgAdminToken.getAccessToken() )
                 .type(MediaType.APPLICATION_JSON )
                 .get(ApiResponse.class);
@@ -115,7 +116,7 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
         try {
             UUID entityId = entities.get(0).getUuid();
             clientSetup.getRestClient()
-                .org(orgName).app(appToDelete).collection("things").entity( entityId ).getResource()
+                .org(orgName).app(appToDeleteName).collection("things").entity( entityId ).getResource()
                 .queryParam( "access_token", orgAdminToken.getAccessToken())
                 .type( MediaType.APPLICATION_JSON)
                 .get(ApiResponse.class);
@@ -123,6 +124,7 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
             Assert.fail("Must not be able to get deleted app entity");
 
         } catch ( UniformInterfaceException expected ) {
+            // TODO: why not a 404?
             Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
             JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
             Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
@@ -132,43 +134,40 @@ public class ApplicationDeleteTest  extends AbstractRestIT {
 
         refreshIndex();
 
+        ManagementResponse orgAppResponse = clientSetup.getRestClient()
+            .management().orgs().organization( orgName ).apps().getOrganizationApplications();
 
-        // TODO: uncomment this when USERGRID-448 (redundant appinfos) is fixed
-//        ManagementResponse orgAppResponse = clientSetup.getRestClient()
-//            .management().orgs().organization( orgName ).apps().getOrganizationApplications();
-//
-//        for ( String appName : orgAppResponse.getData().keySet() ) {
-//            if ( orgAppResponse.getData().get( appName ).equals( appToDeleteId.toString() )) {
-//                Assert.fail("Deleted app must not be included in list of org apps");
-//            }
-//        }
+        for ( String appName : orgAppResponse.getData().keySet() ) {
+            if ( orgAppResponse.getData().get( appName ).equals( appToDeleteId.toString() )) {
+                Assert.fail("Deleted app must not be included in list of org apps");
+            }
+        }
 
         // test that we cannot delete the application a second time
 
-        // TODO: uncomment this when USERGRID-448 (redundant appinfos) is fixed
-//        try {
-//            clientSetup.getRestClient()
-//                .org(orgName).app(appToDeleteId.toString()).getResource()
-//                .queryParam("access_token", orgAdminToken.getAccessToken())
-//                .delete();
-//
-//        } catch ( UniformInterfaceException expected ) {
-//            Assert.assertEquals("Error must be 400", 400, expected.getResponse().getStatus() );
-//            JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
-//            Assert.assertEquals("organization_application_not_found", node.get("error").textValue());
-//        }
+        try {
+            clientSetup.getRestClient()
+                .org(orgName).app(appToDeleteId.toString()).getResource()
+                .queryParam("access_token", orgAdminToken.getAccessToken())
+                .delete();
+
+        } catch ( UniformInterfaceException expected ) {
+            Assert.assertEquals("Error must be 404", 404, expected.getResponse().getStatus() );
+            JsonNode node = mapper.readTree( expected.getResponse().getEntity( String.class ));
+            Assert.assertEquals("not_found", node.get("error").textValue());
+        }
 
         // test that we can create a new application with the same name
 
-        // TODO: uncomment this when USERGRID-448 (redundant appinfos) is fixed
-//        ApiResponse appCreateAgainResponse = clientSetup.getRestClient()
-//            .management().orgs().organization( orgName ).app().getResource()
-//            .queryParam( "access_token", orgAdminToken.getAccessToken() )
-//            .type( MediaType.APPLICATION_JSON )
-//            .post( ApiResponse.class, new Application( appToDelete ) );
-//
-//        Assert.assertEquals("Must be able to create app with same name as deleted app",
-//            "CREATED", appCreateAgainResponse.getStatus().toUpperCase());
+        ApiResponse appCreateAgainResponse = clientSetup.getRestClient()
+            .management().orgs().organization( orgName ).app().getResource()
+            .queryParam( "access_token", orgAdminToken.getAccessToken() )
+            .type( MediaType.APPLICATION_JSON )
+            .post( ApiResponse.class, new Application( appToDeleteName ) );
+
+        Assert.assertEquals("Must be able to create app with same name as deleted app",
+            (orgName + "/" + appToDeleteName).toLowerCase(),
+            appCreateAgainResponse.getEntities().get(0).get("name"));
     }
 
 

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ManagementResponse.java
----------------------------------------------------------------------
diff --git a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ManagementResponse.java b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ManagementResponse.java
index 74240dc..b5cd751 100644
--- a/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ManagementResponse.java
+++ b/stack/rest/src/test/java/org/apache/usergrid/rest/test/resource2point0/endpoints/mgmt/ManagementResponse.java
@@ -28,6 +28,7 @@ public class ManagementResponse {
     private Map<String, Object> data;
     private long timestamp;
     private long duration;
+    private String uri;
 
     public long getDuration() {
         return duration;
@@ -60,4 +61,12 @@ public class ManagementResponse {
     public void setAction(String action) {
         this.action = action;
     }
+
+    public String getUri() {
+        return uri;
+    }
+
+    public void setUri(String uri) {
+        this.uri = uri;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
index a128b4e..39af2eb 100644
--- a/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
+++ b/stack/services/src/main/java/org/apache/usergrid/management/cassandra/ManagementServiceImpl.java
@@ -1639,10 +1639,7 @@ public class ManagementServiceImpl implements ManagementService {
         EntityManager em = emf.getEntityManager( smf.getManagementAppId() );
         em.refreshIndex();
 
-        // already done by EMF
-//      properties.put( "name", buildAppName( applicationName, organizationInfo ) );
-//      properties.put( "appUuid", applicationId );
-//      Entity appInfo = em.create(applicationId, CpNamingUtils.APPLICATION_INFO, properties);
+        // TODO: move this logic into the EntityManagerFactory implementation
 
         String appName = buildAppName( applicationName, organizationInfo );
         Query q = Query.fromQL(PROPERTY_NAME + " = '" + appName + "'");

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/services/src/main/java/org/apache/usergrid/services/ServiceManagerFactory.java
----------------------------------------------------------------------
diff --git a/stack/services/src/main/java/org/apache/usergrid/services/ServiceManagerFactory.java b/stack/services/src/main/java/org/apache/usergrid/services/ServiceManagerFactory.java
index 9a55aa8..abab195 100644
--- a/stack/services/src/main/java/org/apache/usergrid/services/ServiceManagerFactory.java
+++ b/stack/services/src/main/java/org/apache/usergrid/services/ServiceManagerFactory.java
@@ -134,8 +134,4 @@ public class ServiceManagerFactory implements ApplicationContextAware {
         return emf.getManagementAppId();
     }
 
-    public UUID getDefaultAppId() {
-        return emf.getDefaultAppId();
-    }
-
 }

http://git-wip-us.apache.org/repos/asf/incubator-usergrid/blob/c0d50394/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
----------------------------------------------------------------------
diff --git a/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java b/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
index c581611..e80bb06 100644
--- a/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
+++ b/stack/services/src/test/java/org/apache/usergrid/services/ServiceRequestIT.java
@@ -41,7 +41,7 @@ import static org.apache.usergrid.services.ServiceParameter.parameters;
 
 
 
-public class ServiceRequestIT {
+public class ServiceRequestIT extends AbstractServiceIT {
 
     private static final Logger logger = LoggerFactory.getLogger( ServiceRequestIT.class );
 
@@ -49,16 +49,11 @@ public class ServiceRequestIT {
     @Rule
     public ClearShiroSubject clearShiroSubject = new ClearShiroSubject();
 
-    @Rule
-    public ServiceITSetup setup = new ServiceITSetupImpl( );
-
-
     @Test
     public void testPaths() throws Exception {
 
-        UUID applicationId = setup.getEmf().getDefaultAppId();
 
-        ServiceManager services = setup.getSmf().getServiceManager( applicationId );
+        ServiceManager services = setup.getSmf().getServiceManager( app.getId() );
 
         ServiceRequest path = services.newRequest( ServiceAction.GET, parameters( "users", "bob" ), null );
         // path = path.addSegment("users", "bob");