Search in sources :

Example 1 with UsersExportStrategy

use of org.keycloak.exportimport.UsersExportStrategy in project keycloak by keycloak.

the class MultipleStepsExportProvider method exportRealmImpl.

protected void exportRealmImpl(KeycloakSessionFactory factory, final String realmName) throws IOException {
    final UsersExportStrategy usersExportStrategy = ExportImportConfig.getUsersExportStrategy();
    final int usersPerFile = ExportImportConfig.getUsersPerFile();
    final UsersHolder usersHolder = new UsersHolder();
    final boolean exportUsersIntoRealmFile = usersExportStrategy == UsersExportStrategy.REALM_FILE;
    FederatedUsersHolder federatedUsersHolder = new FederatedUsersHolder();
    KeycloakModelUtils.runJobInTransaction(factory, new ExportImportSessionTask() {

        @Override
        protected void runExportImportTask(KeycloakSession session) throws IOException {
            RealmModel realm = session.realms().getRealmByName(realmName);
            RealmRepresentation rep = ExportUtils.exportRealm(session, realm, exportUsersIntoRealmFile, true);
            writeRealm(realmName + "-realm.json", rep);
            logger.info("Realm '" + realmName + "' - data exported");
            // Count total number of users
            if (!exportUsersIntoRealmFile) {
                usersHolder.totalCount = session.users().getUsersCount(realm, true);
                federatedUsersHolder.totalCount = session.userFederatedStorage().getStoredUsersCount(realm);
            }
        }
    });
    if (usersExportStrategy != UsersExportStrategy.SKIP && !exportUsersIntoRealmFile) {
        // We need to export users now
        usersHolder.currentPageStart = 0;
        // usersExportStrategy==SAME_FILE  means exporting all users into single file (but separate to realm)
        final int countPerPage = (usersExportStrategy == UsersExportStrategy.SAME_FILE) ? usersHolder.totalCount : usersPerFile;
        while (usersHolder.currentPageStart < usersHolder.totalCount) {
            if (usersHolder.currentPageStart + countPerPage < usersHolder.totalCount) {
                usersHolder.currentPageEnd = usersHolder.currentPageStart + countPerPage;
            } else {
                usersHolder.currentPageEnd = usersHolder.totalCount;
            }
            KeycloakModelUtils.runJobInTransaction(factory, new ExportImportSessionTask() {

                @Override
                protected void runExportImportTask(KeycloakSession session) throws IOException {
                    RealmModel realm = session.realms().getRealmByName(realmName);
                    usersHolder.users = session.users().getUsersStream(realm, usersHolder.currentPageStart, usersHolder.currentPageEnd - usersHolder.currentPageStart, true).collect(Collectors.toList());
                    writeUsers(realmName + "-users-" + (usersHolder.currentPageStart / countPerPage) + ".json", session, realm, usersHolder.users);
                    logger.info("Users " + usersHolder.currentPageStart + "-" + (usersHolder.currentPageEnd - 1) + " exported");
                }
            });
            usersHolder.currentPageStart = usersHolder.currentPageEnd;
        }
    }
    if (usersExportStrategy != UsersExportStrategy.SKIP && !exportUsersIntoRealmFile) {
        // We need to export users now
        federatedUsersHolder.currentPageStart = 0;
        // usersExportStrategy==SAME_FILE  means exporting all users into single file (but separate to realm)
        final int countPerPage = (usersExportStrategy == UsersExportStrategy.SAME_FILE) ? federatedUsersHolder.totalCount : usersPerFile;
        while (federatedUsersHolder.currentPageStart < federatedUsersHolder.totalCount) {
            if (federatedUsersHolder.currentPageStart + countPerPage < federatedUsersHolder.totalCount) {
                federatedUsersHolder.currentPageEnd = federatedUsersHolder.currentPageStart + countPerPage;
            } else {
                federatedUsersHolder.currentPageEnd = federatedUsersHolder.totalCount;
            }
            KeycloakModelUtils.runJobInTransaction(factory, new ExportImportSessionTask() {

                @Override
                protected void runExportImportTask(KeycloakSession session) throws IOException {
                    RealmModel realm = session.realms().getRealmByName(realmName);
                    federatedUsersHolder.users = session.userFederatedStorage().getStoredUsersStream(realm, federatedUsersHolder.currentPageStart, federatedUsersHolder.currentPageEnd - federatedUsersHolder.currentPageStart).collect(Collectors.toList());
                    writeFederatedUsers(realmName + "-federated-users-" + (federatedUsersHolder.currentPageStart / countPerPage) + ".json", session, realm, federatedUsersHolder.users);
                    logger.info("Users " + federatedUsersHolder.currentPageStart + "-" + (federatedUsersHolder.currentPageEnd - 1) + " exported");
                }
            });
            federatedUsersHolder.currentPageStart = federatedUsersHolder.currentPageEnd;
        }
    }
}
Also used : RealmModel(org.keycloak.models.RealmModel) UsersExportStrategy(org.keycloak.exportimport.UsersExportStrategy) KeycloakSession(org.keycloak.models.KeycloakSession) RealmRepresentation(org.keycloak.representations.idm.RealmRepresentation) IOException(java.io.IOException)

Aggregations

IOException (java.io.IOException)1 UsersExportStrategy (org.keycloak.exportimport.UsersExportStrategy)1 KeycloakSession (org.keycloak.models.KeycloakSession)1 RealmModel (org.keycloak.models.RealmModel)1 RealmRepresentation (org.keycloak.representations.idm.RealmRepresentation)1