package com.constellio.app.services.schemas.bulkImport; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.joda.time.LocalDateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.constellio.app.services.schemas.bulkImport.data.ImportData; import com.constellio.app.services.schemas.bulkImport.data.ImportDataProvider; import com.constellio.app.services.schemas.bulkImport.data.ImportServices; import com.constellio.data.utils.BatchBuilderIterator; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.security.global.UserCredential; import com.constellio.model.entities.security.global.UserCredentialStatus; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.users.UserServices; public class UserImportServices implements ImportServices { private static final Logger LOGGER = LoggerFactory.getLogger(UserImportServices.class); private static final int DEFAULT_BATCH_SIZE = 100; private int batchSize; private UserServices userServices; private int currentElement; public UserImportServices(ModelLayerFactory modelLayerFactory) { this(modelLayerFactory, DEFAULT_BATCH_SIZE); } public UserImportServices(ModelLayerFactory modelLayerFactory, int batchSize) { this.batchSize = batchSize; userServices = modelLayerFactory.newUserServices(); } void importUser(List<String> collections, UserCredential userCredential) { userCredential = userCredential.withCollections(collections); userServices.addUpdateUserCredential(userCredential); } @Override public BulkImportResults bulkImport(ImportDataProvider importDataProvider, BulkImportProgressionListener progressionListener, User user, List<String> collections) throws RecordsImportServicesRuntimeException { currentElement = 0; importDataProvider.initialize(); BulkImportResults importResults = new BulkImportResults(); try { bulkImport(importResults, importDataProvider, collections); return importResults; } catch (Exception e) { LOGGER.warn(e.toString(), e); importResults.add(new ImportError("element" + currentElement, e.getMessage())); return importResults; } finally { importDataProvider.close(); } } @Override public BulkImportResults bulkImport(ImportDataProvider importDataProvider, BulkImportProgressionListener bulkImportProgressionListener, User user, List<String> collections, BulkImportParams params) { return bulkImport(importDataProvider, bulkImportProgressionListener, user, collections); } int bulkImport(BulkImportResults importResults, ImportDataProvider importDataProvider, List<String> collections) { int skipped = 0; Iterator<ImportData> importDataIterator = importDataProvider.newDataIterator("user"); Iterator<List<ImportData>> importDataBatches = new BatchBuilderIterator<>(importDataIterator, batchSize); while (importDataBatches.hasNext()) { try { List<ImportData> batch = importDataBatches.next(); skipped += importBatch(importResults, batch, collections); } catch (Exception e) { skipped++; LOGGER.warn(e.toString(), e); importResults.add(new ImportError("element" + currentElement, e.getMessage())); } } return skipped; } private int importBatch(BulkImportResults importResults, List<ImportData> batch, List<String> collections) { int skipped = 0; for (ImportData toImport : batch) { buildUser(importResults, toImport, collections); } return skipped; } void buildUser(BulkImportResults importResults, ImportData toImport, List<String> collections) { currentElement++; String username = (String) toImport.getFields().get("username"); String firstName = (String) toImport.getFields().get("firstName"); String lastName = (String) toImport.getFields().get("lastName"); String email = (String) toImport.getFields().get("email"); List<String> globalGroups = (List<String>) toImport.getFields().get("globalGroups"); UserCredentialStatus userCredentialStatus; String status = (String) toImport.getFields().get("status"); if (status.equals("p")) { userCredentialStatus = UserCredentialStatus.PENDING; } else if (status.equals("s")) { userCredentialStatus = UserCredentialStatus.SUSPENDED; } else if (status.equals("d")) { userCredentialStatus = UserCredentialStatus.DELETED; } else { userCredentialStatus = UserCredentialStatus.ACTIVE; } UserCredential userCredential; Object systemAdmin = toImport.getFields().get("systemAdmin"); if (systemAdmin != null) { boolean systemAdminBoolean = Boolean.valueOf((String) systemAdmin); Map<String, LocalDateTime> tokens = new HashMap<>(); userCredential = userServices.createUserCredential( username, firstName, lastName, email, null, systemAdminBoolean, globalGroups, collections, tokens, userCredentialStatus); } else { userCredential = userServices.createUserCredential( username, firstName, lastName, email, globalGroups, collections, userCredentialStatus); } try { userServices.addUpdateUserCredential(userCredential); } catch (Exception e) { LOGGER.warn(e.toString(), e); Throwable cause = e.getCause(); if (cause != null && cause instanceof RecordServicesException.ValidationException) { String message = ((RecordServicesException.ValidationException) cause).getErrors().toErrorsSummaryString(); importResults.add(new ImportError(username, message)); } else { importResults.add(new ImportError(username, e.getMessage())); } } } }