private void handleApp()

in stack/tools/src/main/java/org/apache/usergrid/tools/AppDeleter.java [311:473]


    private void handleApp(UUID appId, String orgAppName, boolean deletedApp,
                           EntityManager em, boolean performDelete, String bucketName,
                           boolean logEachItem) {
        logger.info(logLineSeparator);
        logger.info("APPLICATION: {}({}){}", orgAppName, appId.toString(), deletedApp ? " - DELETED" : "");
        logger.info(logLineSeparator);

        if (performDelete) {
            try {
                String clientId = managementService.getClientIdForApplication(appId);
                String oldClientSecret = managementService.getClientSecretForApplication(appId);
                logger.info(logLineSeparator);
                logger.info("OLD APP CLIENT ID: {}", clientId);
                logger.info("OLD APP CLIENT SECRET: {}", oldClientSecret);
                String newClientSecret = managementService.newClientSecretForApplication(appId);
                logger.info("NEW APP CLIENT SECRET: {}", newClientSecret);
                logger.info(logLineSeparator);
            } catch (Exception e) {
                logger.error("FAILED TO CHANGE CREDENTIALS FOR APP " + orgAppName + ": " + e.getMessage(), e);
            }
        }

        logger.info(logLineSeparator);
        logger.info("FINDING APP DICTIONARIES");
        logger.info(logLineSeparator);
        // check for entity dictionaries
        try {
            EntityManager rootEm = emf.getEntityManager( emf.getManagementAppId() );

            Application application = em.getApplication();
            //logger.info("APP: {}", application.toString());

            for ( String dictionary : rootEm.getDictionaries( application ) ) {
                try {
                    //logger.info("DICTIONARY NAME: {}", dictionary);
                    Map<Object, Object> dictMap = rootEm.getDictionaryAsMap(application, dictionary, false);
                    for (Object key : dictMap.keySet()) {
                        appDictionaryEntriesFound.incrementAndGet();
                        if (logEachItem) {
                            logger.info("APP DICTIONARY {} ENTRY: ({})", dictionary, key.toString());
                        }
                    }
                }
                catch (Exception e) {
                    // ignore
                }
            }
        }
        catch (Exception e) {
            logger.error("APP DICTIONARY CHECK FOR APP " + orgAppName + " FAILED: " + e.getMessage(), e);
        }
        logger.info(logLineSeparator);
        logger.info("APP DICTIONARIES {} DONE! App Dictionary Entries found: {}", performDelete ? "DELETE" : "LIST", appDictionaryEntriesFound.get());
        logger.info(logLineSeparator);

        logger.info(logLineSeparator);
        logger.info("FINDING ENTITIES");
        logger.info(logLineSeparator);
        entitiesFound.set(0);
        Observable<String> collectionsObservable = Observable.create( new CollectionsObservable( em ) );

        collectionsObservable.flatMap( collection -> {

            return Observable.create( new EntityObservable( em, collection ) )
                .doOnNext( new EntityDeleteAction(em, performDelete, logEachItem) ).subscribeOn(deleteScheduler);


        } ).doOnCompleted( new EntityDeleteWrapUpAction(performDelete) ).toBlocking().lastOrDefault(null);


        logger.info(logLineSeparator);
        logger.info("FINDING ASSETS");
        logger.info(logLineSeparator);
        assetsFound.set(0);

        ObjectListing listing = null;
        try {
            listing = s3Client.listObjects(bucketName, appId.toString() + "/");
        }
        catch (Exception e) {
            logger.error("FAILED TO RETRIEVE ASSETS: ", e);
        }
        if (listing != null) {
            for (S3ObjectSummary summary : listing.getObjectSummaries()) {
                String assetKey = summary.getKey();
                assetsFound.getAndIncrement();
                if (logEachItem) {
                    logger.info("ASSET: {}", assetKey);
                }
                if (performDelete) {
                    try {
                        s3Client.deleteObject(bucketName, assetKey);
                    }
                    catch (Exception e) {
                        logger.error("FAILED TO DELETE ASSET: " + assetKey, e);
                    }
                }
            }
        }
        logger.info(logLineSeparator);
        logger.info("Asset {} DONE! Assets: {}", performDelete ? "DELETE" : "LIST", assetsFound.get());
        logger.info(logLineSeparator);

        // Elasticsearch docs
        logger.info(logLineSeparator);
        logger.info("FINDING ES DOCS");
        logger.info(logLineSeparator);
        esDocsFound.set(0);

        ApplicationScope applicationScope = new ApplicationScopeImpl(new SimpleId(appId, "application"));
        // IndexLocationStrategy strategy = ilsf.getIndexLocationStrategy(applicationScope);

        QueryBuilder qb = QueryBuilders.matchQuery("applicationId", "appId(" + appId.toString() + ",application)");
        SearchResponse scrollResponse = esProvider.getClient()
            .prepareSearch(ALL_INDEXES)
            .setScroll(SCROLL_TIMEOUT)
            .setSearchType(SearchType.SCAN)
            .setQuery(qb)
            .setSize(SCROLL_SIZE)
            .setNoFields()
            .execute().actionGet();

        //logger.info(scrollResponse.toString());

        while (true) {
            BulkRequestBuilder bulkRequest = null;
            if (performDelete) {
                bulkRequest = esProvider.getClient().prepareBulk();
            }
            boolean docsToDelete = false;
            for (SearchHit hit : scrollResponse.getHits().getHits()) {
                esDocsFound.getAndIncrement();
                if (logEachItem) {
                    logger.info("ES DOC: {}", hit.getId());
                }
                if (performDelete) {
                    docsToDelete = true;
                    bulkRequest.add(esProvider.getClient()
                        .prepareDelete(hit.getIndex(), hit.getType(), hit.getId()));
                }
            }

            if (docsToDelete) {
                BulkResponse bulkResponse = bulkRequest.execute().actionGet();
                if (bulkResponse.hasFailures()) {
                    throw new RuntimeException(bulkResponse.buildFailureMessage());
                }
            }

            scrollResponse = esProvider.getClient().prepareSearchScroll(scrollResponse.getScrollId())
                .setScroll(SCROLL_TIMEOUT).execute().actionGet();

            //logger.info(scrollResponse.toString());

            if (scrollResponse.getHits().getHits().length == 0) {
                break;
            }
        }
        logger.info(logLineSeparator);
        logger.info("ES Doc {} DONE! ES Docs: {}", performDelete ? "DELETE" : "LIST", esDocsFound.get());
        logger.info(logLineSeparator);

    }