package com.constellio.app.services.schemas.bulkImport.authorization; import static com.constellio.app.ui.i18n.i18n.$; import static com.constellio.model.entities.schemas.Schemas.IDENTIFIER; import static com.constellio.model.entities.security.global.AuthorizationDeleteRequest.authorizationDeleteRequest; import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.where; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.LogManager; import org.apache.log4j.Logger; import org.jdom2.Document; import org.jdom2.JDOMException; import org.jdom2.input.SAXBuilder; import com.constellio.app.services.schemas.bulkImport.BulkImportResults; import com.constellio.app.services.schemas.bulkImport.ImportError; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_AuthorizationIDMissing; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_AuthorizationPrincipalsMissing; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_AuthorizationTargetsMissing; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_EmptyLegacyId; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_EmptyPrincipalId; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_InvalidAccess; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_InvalidPrincipalType; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_InvalidRole; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_InvalidTargetType; import com.constellio.app.services.schemas.bulkImport.authorization.ImportedAuthorizationValidatorRuntimeException.ImportedAuthorizationValidatorRuntimeException_UseOfAccessAndRole; import com.constellio.model.entities.records.wrappers.SolrAuthorizationDetails; import com.constellio.model.entities.records.wrappers.User; import com.constellio.model.entities.security.Authorization; import com.constellio.model.entities.security.global.AuthorizationAddRequest; import com.constellio.model.entities.security.global.AuthorizationDeleteRequest; import com.constellio.model.entities.security.global.AuthorizationDetails; import com.constellio.model.services.factories.ModelLayerFactory; import com.constellio.model.services.records.RecordServices; import com.constellio.model.services.records.RecordServicesException; import com.constellio.model.services.records.SchemasRecordsServices; import com.constellio.model.services.security.AuthorizationsServices; import com.constellio.model.services.security.AuthorizationsServicesRuntimeException; import com.constellio.model.services.security.AuthorizationsServicesRuntimeException.NoSuchAuthorizationWithId; public class AuthorizationImportServices { private static final Logger LOGGER = LogManager.getLogger(AuthorizationImportServices.class); public static final String AUTHORIZATION_ID_ADDED_SEVERAL_TIMES = "AuthorizationImportServices.authorizationIdAddedSeveralTimes"; public static final String INVALID_ROLE = "AuthorizationImportServices.invalidRole"; public static final String INVALID_ACCESS = "AuthorizationImportServices.invalidAccess"; public static final String USE_ROLE_OR_ACCESS = "AuthorizationImportServices.useRoleOrAccess"; public static final String AUTHORIZATION_ID_MISSING = "AuthorizationImportServices.authorizationIDMissing"; public static final String AUTHORIZATION_TARGETS_MISSING = "AuthorizationImportServices.authorizationTargetsMissing"; public static final String AUTHORIZATION_PRINCIPALS_MISSING = "AuthorizationImportServices.authorizationPrincipalsMissing"; public static final String INVALID_TARGET_TYPE = "AuthorizationImportServices.invalidTargetType"; public static final String INVALID_PRINCIPAL_TYPE = "AuthorizationImportServices.invalidPrincipalType"; public static final String EMPTY_LEGACY_ID = "AuthorizationImportServices.emptyLegacyId"; public static final String EMPTY_PRINCIPAL_ID = "AuthorizationImportServices.emptyPrincipalId"; private RecordServices recordServices; private SchemasRecordsServices schemas; public BulkImportResults bulkImport(File file, String collection, ModelLayerFactory modelLayerFactory) { this.schemas = new SchemasRecordsServices(collection, modelLayerFactory); this.recordServices = modelLayerFactory.newRecordServices(); BulkImportResults result = new BulkImportResults(); if (file != null) { Document document = getDocumentFromFile(file); bulkImport(document, result, collection, modelLayerFactory); } return result; } private void bulkImport(Document document, BulkImportResults bulkImportResults, String collection, ModelLayerFactory modelLayerFactory) { try { List<ImportedAuthorization> allImportedAuthorizations = new ImportedAuthorizationReader( document).readAll(); List<ImportedAuthorization> validAuthorizations = addInvalidAuthorizationsToErrorsAndGetValidAuthorizations( allImportedAuthorizations, bulkImportResults); addUpdateOrDeleteAuthorizations(validAuthorizations, collection, modelLayerFactory, bulkImportResults); } catch (Exception e) { bulkImportResults.add(new ImportError("", e.getMessage())); } } private void addUpdateOrDeleteAuthorizations(List<ImportedAuthorization> authorizations, String collection, ModelLayerFactory modelLayerFactory, BulkImportResults bulkImportResults) { if (!authorizations.isEmpty()) { AuthorizationsServices authorizationServices = modelLayerFactory.newAuthorizationsServices(); ImportedAuthorizationToAuthorizationBuilder builder = new ImportedAuthorizationToAuthorizationBuilder(collection, modelLayerFactory); for (ImportedAuthorization importedAuthorization : authorizations) { try { addUpdateOrDeleteAuthorization(importedAuthorization, builder, collection, authorizationServices); bulkImportResults.inc(); } catch (Exception e) { bulkImportResults.add(new ImportError(importedAuthorization.getId(), e.getMessage())); } } modelLayerFactory.getBatchProcessesManager().waitUntilAllFinished(); } } void addUpdateOrDeleteAuthorization(ImportedAuthorization importedAuthorization, ImportedAuthorizationToAuthorizationBuilder builder, String collection, AuthorizationsServices authorizationServices) { if (StringUtils.isBlank(importedAuthorization.getAccess()) && (importedAuthorization.getRoles() == null || importedAuthorization.getRoles().isEmpty())) { deleteAuthorizationIfExists(authorizationServices, collection, importedAuthorization.getId()); } else { try { AuthorizationAddRequest authorizationAddRequest = builder.buildAddRequest(importedAuthorization); AuthorizationDetails details = schemas.getSolrAuthorizationDetailsWithLegacyId(importedAuthorization.getId()); if (details != null) { authorizationServices.execute(authorizationDeleteRequest(details.getId(), collection)); } String authId = authorizationServices.add(authorizationAddRequest); try { recordServices.update(schemas.getSolrAuthorizationDetails(authId).setLegacyId(importedAuthorization.getId())); } catch (RecordServicesException e) { throw new RuntimeException(e); } } catch (ImportedAuthorizationBuilderRuntimeException e) { deleteAuthorizationIfExists(authorizationServices, collection, importedAuthorization.getId()); } } } private void deleteAuthorizationIfExists(AuthorizationsServices authorizationServices, String collection, String id) { SolrAuthorizationDetails authorization = schemas .getSolrAuthorizationDetailsWithLegacyId(id);// getAuthorizationIdByIdWithoutPrefix(collection, id); if (authorization == null) { LOGGER.warn("Authorization not deleted : no authorization with legacy id " + id); } else { authorizationServices.execute(authorizationDeleteRequest(authorization.getId(), collection)); } } // public String getAuthorizationIdByIdWithoutPrefix(String collection, String idWithoutPrefix) { // // List<SolrAuthorizationDetails> authorizationDetails = schemas.searchSolrAuthorizationDetailss( // where(IDENTIFIER).isEndingWithText(idWithoutPrefix)); // // if (authorizationDetails.isEmpty()) { // throw new AuthorizationsServicesRuntimeException.NoSuchAuthorizationWithId(idWithoutPrefix); // } // return authorizationDetails.get(0).getId(); // } List<ImportedAuthorization> addInvalidAuthorizationsToErrorsAndGetValidAuthorizations( List<ImportedAuthorization> allImportedAuthorizations, BulkImportResults bulkImportResults) { List<String> addedAuthorizationsCodes = new ArrayList<>(); List<ImportedAuthorization> validAuthorizations = new ArrayList<>(); ImportedAuthorizationValidator importedAuthorizationValidator = new ImportedAuthorizationValidator(); for (ImportedAuthorization importedAuthorization : allImportedAuthorizations) { String id = importedAuthorization.getId(); if (addedAuthorizationsCodes.contains(id)) { bulkImportResults.add(new ImportError(id, AUTHORIZATION_ID_ADDED_SEVERAL_TIMES)); } else { try { importedAuthorizationValidator.validate(importedAuthorization); validAuthorizations.add(importedAuthorization); } catch (ImportedAuthorizationValidatorRuntimeException e) { bulkImportResults.add(new ImportError(id, getErrorCode(e))); } } } return validAuthorizations; } private String getErrorCode(ImportedAuthorizationValidatorRuntimeException e) { if (e instanceof ImportedAuthorizationValidatorRuntimeException_InvalidRole) { return $(INVALID_ROLE); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_InvalidAccess) { return $(INVALID_ACCESS); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_UseOfAccessAndRole) { return $(USE_ROLE_OR_ACCESS); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_AuthorizationIDMissing) { return $(AUTHORIZATION_ID_MISSING); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_AuthorizationTargetsMissing) { return $(AUTHORIZATION_TARGETS_MISSING); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_AuthorizationPrincipalsMissing) { return $(AUTHORIZATION_PRINCIPALS_MISSING); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_InvalidTargetType) { return $(INVALID_TARGET_TYPE); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_InvalidPrincipalType) { return $(INVALID_PRINCIPAL_TYPE); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_EmptyLegacyId) { return $(EMPTY_LEGACY_ID); } else if (e instanceof ImportedAuthorizationValidatorRuntimeException_EmptyPrincipalId) { return $(EMPTY_PRINCIPAL_ID); } else { throw new RuntimeException("Unsupported exception"); } } private Document getDocumentFromFile(File file) { SAXBuilder builder = new SAXBuilder(); try { return builder.build(file); } catch (JDOMException e) { throw new RuntimeException("JDOM2 Exception", e); } catch (IOException e) { throw new RuntimeException("build Document JDOM2 from file", e); } } }