From 480d6bd2cb668e786a51410e3088add2a94ed56e Mon Sep 17 00:00:00 2001 From: philippe tcheriatinsky <philippe.tcherniatinsky@inrae.fr> Date: Mon, 27 Jan 2025 18:55:15 +0100 Subject: [PATCH] =?UTF-8?q?Refonte=20des=20droits=20pour=20les=20op=C3=A9r?= =?UTF-8?q?ations=20de=20publication=20/=20d=C3=A9p=C3=B4t/=20suppression?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - utilisation de serviceContainer.authorizationService().getPrivilegeAssessorForApplication - créations de rôles dédies Reste à faire du refactoring pour remonter certaines fonctionnailtes dans les objets métiers pour réutilisation Code mort à supprimer --- .../oresing/domain/BinaryFileDataset.java | 35 +++- .../application/configuration/Submission.java | 2 +- .../AuthorizationsForApplicationUser.java | 55 ++++-- ...PrivilegeAssessorDomainForApplication.java | 84 +++++++-- .../NotApplicationDataReaderException.java | 25 +++ .../NotApplicationDataWriterException.java | 25 +++ ...licationDataWriterForDepositException.java | 17 ++ ...licationDataWriterForPublishException.java | 25 +++ .../exception/NotOpenAdomAdminException.java | 6 +- .../role/ApplicationAdminUser.java | 31 +++- .../role/ApplicationDataDelete.java | 22 +++ .../role/ApplicationDataReader.java | 15 ++ .../role/ApplicationDataWriter.java | 161 +++++++++++++++++ .../role/ApplicationDeleteUser.java | 75 ++++++++ .../role/ApplicationDepositUser.java | 8 + .../role/ApplicationDepositWriterUser.java | 50 ++++++ .../role/ApplicationManager.java | 3 +- .../role/ApplicationManagerUser.java | 33 +++- .../role/ApplicationPublishWriterUser.java | 51 ++++++ .../role/ApplicationReader.java | 34 ---- .../role/ApplicationUser.java | 3 +- .../role/PrivilegeApplicationDomain.java | 1 + .../data/read/query/ComponentOrderBy.java | 4 +- .../read/query/ComponentOrderByForExport.java | 5 +- .../read/query/ComponentPatternOrderBy.java | 4 +- .../query/ComponentPatternValueOrderBy.java | 10 +- .../read/query/DynamicComponentOrderBy.java | 4 +- .../AuthorizationRequestException.java | 2 +- .../inra/oresing/domain/file/FileOrUUID.java | 14 +- .../repository/data/DataRepository.java | 4 +- .../data/DataRepositoryForBuffer.java | 6 + .../services/file/BinaryFileService.java | 7 +- .../oresing/persistence/DataRepository.java | 4 +- .../fr/inra/oresing/persistence/DataRow.java | 12 +- .../data/read/DataRepositoryWithBuffer.java | 16 +- .../fr/inra/oresing/rest/OreSiResources.java | 71 ++++---- .../rest/binaryFile/BinaryFileService.java | 13 +- .../inra/oresing/rest/data/DataService.java | 21 ++- .../oresing/rest/data/VersioningService.java | 72 +++++--- .../rest/data/extraction/DataCsvBuilder.java | 12 +- .../data/extraction/DataCsvHeaderWriter.java | 8 +- .../data/extraction/DataCsvRowBuilder.java | 3 +- .../publication/AuthorizationForUser.java | 6 +- .../AuthorizationForUserBuilder.java | 166 ------------------ .../AuthorizationPublicationService.java | 80 ++++----- ...uthorizationPublicationServiceBuilder.java | 93 +++++----- ...heckRights.java => CheckAndStoreFile.java} | 24 +-- .../data/publication/FileNameResolver.java | 13 +- .../rest/data/publication/ParamsResolver.java | 42 ----- .../oresing/rest/data/publication/State.java | 36 +--- .../rest/data/publication/StoreFile.java | 84 +++++---- .../data/publication/StoredFileBuilder.java | 28 +++ .../data/publication/UnPublishedVersions.java | 10 +- .../rest/exceptions/OreSiIOException.java | 14 ++ .../authorization/GetGrantableResult.java | 3 +- .../rest/model/data/DataRowResult.java | 3 +- .../java/fr/inra/oresing/rest/Fixtures.java | 4 +- .../inra/oresing/rest/OreSiResourcesTest.java | 36 ++-- .../fixtures/applications/errors/errors.json | 2 +- .../ore/monsore/changeMonsore.txt | 34 ++-- .../ore/monsore/createMonsore.txt | 42 ++--- .../ore/monsore/validateMonsore.txt | 20 +-- 62 files changed, 1143 insertions(+), 650 deletions(-) create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataReaderException.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterException.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForDepositException.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForPublishException.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataDelete.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataReader.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataWriter.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDeleteUser.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositUser.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositWriterUser.java create mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationPublishWriterUser.java delete mode 100644 src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationReader.java delete mode 100644 src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUserBuilder.java rename src/main/java/fr/inra/oresing/rest/data/publication/{CheckRights.java => CheckAndStoreFile.java} (58%) delete mode 100644 src/main/java/fr/inra/oresing/rest/data/publication/ParamsResolver.java create mode 100644 src/main/java/fr/inra/oresing/rest/data/publication/StoredFileBuilder.java create mode 100644 src/main/java/fr/inra/oresing/rest/exceptions/OreSiIOException.java diff --git a/src/main/java/fr/inra/oresing/domain/BinaryFileDataset.java b/src/main/java/fr/inra/oresing/domain/BinaryFileDataset.java index b42f9bd..e7fdd14 100644 --- a/src/main/java/fr/inra/oresing/domain/BinaryFileDataset.java +++ b/src/main/java/fr/inra/oresing/domain/BinaryFileDataset.java @@ -3,20 +3,23 @@ package fr.inra.oresing.domain; import com.google.common.base.Strings; import fr.inra.oresing.domain.application.configuration.Ltree; import fr.inra.oresing.domain.application.configuration.date.LocalDateTimeRange; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import lombok.Getter; import lombok.Setter; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; @Getter @Setter public class BinaryFileDataset { - public static BinaryFileDataset EMPTY_INSTANCE(){ + public static BinaryFileDataset EMPTY_INSTANCE() { return new BinaryFileDataset(); } + private String datatype; private Map<String, List<Ltree>> requiredAuthorizations = new HashMap<>(); private String from; @@ -25,12 +28,36 @@ public class BinaryFileDataset { @Override public String toString() { - final String authorizationsString =requiredAuthorizations.entrySet().stream() + final String authorizationsString = requiredAuthorizations.entrySet().stream() .map(ra -> String.format("%s : %s", ra.getKey(), ra.getValue().getFirst().getSql())) .collect(Collectors.joining(",", "[", "]")); return String.format("%s -> [%s, %s]", - authorizationsString, Strings.isNullOrEmpty(from) ?"": LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(LocalDateTimeRange.DATE_TIME_FORMATTER.parse(from)), - Strings.isNullOrEmpty(to)?"": LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(LocalDateTimeRange.DATE_TIME_FORMATTER.parse(to)) + authorizationsString, Strings.isNullOrEmpty(from) ? "" : LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(LocalDateTimeRange.DATE_TIME_FORMATTER.parse(from)), + Strings.isNullOrEmpty(to) ? "" : LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(LocalDateTimeRange.DATE_TIME_FORMATTER.parse(to)) ); } + + + public BinaryFileDataset testrequiredAuthorizationsAndReturnHierarchicalKeys(DataRepositoryForBuffer dataRepositoryForBuffer) { + BinaryFileDataset binaryFileDataset = this.copy(); + Map<String, List<Ltree>> requiredAuthorizationsTested = Optional.ofNullable(binaryFileDataset) + .map(BinaryFileDataset::getRequiredAuthorizations). + orElseGet(HashMap::new); + for (Map.Entry<String, List<Ltree>> requiredAuthorizationByReference : requiredAuthorizationsTested.entrySet()) { + List<Ltree> hierarchicalKeyForEntry = dataRepositoryForBuffer.getHierarchicalKeyForEntry(requiredAuthorizationByReference); + requiredAuthorizationsTested.put(requiredAuthorizationByReference.getKey(), hierarchicalKeyForEntry); + } + return binaryFileDataset; + + } + + public BinaryFileDataset copy() { + BinaryFileDataset binaryFileDataset = new BinaryFileDataset(); + binaryFileDataset.setRequiredAuthorizations(requiredAuthorizations); + binaryFileDataset.setTo(to); + binaryFileDataset.setFrom(from); + binaryFileDataset.setComment(comment); + binaryFileDataset.setDatatype(datatype); + return binaryFileDataset; + } } \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/application/configuration/Submission.java b/src/main/java/fr/inra/oresing/domain/application/configuration/Submission.java index 0757ecb..5af7bd3 100644 --- a/src/main/java/fr/inra/oresing/domain/application/configuration/Submission.java +++ b/src/main/java/fr/inra/oresing/domain/application/configuration/Submission.java @@ -85,7 +85,7 @@ public record Submission( } catch (Exception e) { throw new SiOreAuthorizationRequestException( - AuthorizationRequestException.INVAALID_FILE_NAME, + AuthorizationRequestException.INVALID_FILE_NAME, Map.of("fileNameFormat", fileNameParsing().createExampleSubmissionFileName()) ); diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/AuthorizationsForApplicationUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/AuthorizationsForApplicationUser.java index adb573e..025c72b 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/AuthorizationsForApplicationUser.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/AuthorizationsForApplicationUser.java @@ -4,10 +4,8 @@ import fr.inra.oresing.domain.application.Application; import fr.inra.oresing.domain.repository.authorization.OperationType; import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public record AuthorizationsForApplicationUser( List<String> roles, @@ -18,20 +16,45 @@ public record AuthorizationsForApplicationUser( Map<String, AuthorizationParsed> publicAuthorizations ) { public boolean canRead(String dataName) { + return canDoAction(dataName, Set.of(OperationType.extraction)); + } + + /* find if exists authorization foroperationtype of action */ + private boolean canDoAction(String dataName, Set<OperationType> actions) { if(isApplicationManager || isUserManager){ return true; } - return - Optional.of(userAuthorizations()) - .map(authorizations -> authorizations.get(dataName)) - .stream().flatMap(List::stream) - .map(AuthorizationParsed::operationTypes) - .flatMap(Set::stream) - .anyMatch(OperationType.extraction::equals) || - Optional.of(publicAuthorizations()) - .map(authorizations -> authorizations.get(dataName)) - .map(AuthorizationParsed::operationTypes) - .stream().flatMap(Set::stream) - .anyMatch(OperationType.extraction::equals); + return Optional.of(userAuthorizations()) + .map(authorizations -> authorizations.get(dataName)) + .stream().flatMap(List::stream) + .map(AuthorizationParsed::operationTypes) + .flatMap(Set::stream) + .anyMatch(actions::contains) || + Optional.of(publicAuthorizations()) + .map(authorizations -> authorizations.get(dataName)) + .map(AuthorizationParsed::operationTypes) + .stream().flatMap(Set::stream) + .anyMatch(actions::contains); + } + + public ArrayList<AuthorizationParsed> getAuthorizations(String dataName, Set<OperationType> actions){ + ArrayList<AuthorizationParsed> parsedAuthorisationForActions = Optional.of(userAuthorizations()) + .map(authorizations -> authorizations.get(dataName)) + .stream().flatMap(List::stream) + .filter(authorizationParsed -> authorizationParsed.operationTypes().stream().anyMatch(actions::contains)) + .collect(Collectors.toCollection(ArrayList::new)); + Optional.of(publicAuthorizations()) + .map(authorizations -> authorizations.get(dataName)) + .filter(authorizationParsed -> authorizationParsed.operationTypes().stream().anyMatch(actions::contains)) + .ifPresent(parsedAuthorisationForActions::add); + return parsedAuthorisationForActions; + } + + public boolean canWrite(String dataName, boolean toPublish) { + return canDoAction(dataName, toPublish?Set.of(OperationType.publication):Set.of(OperationType.depot)); + } + + public boolean canDelete(String dataName, boolean isRepository) { + return canDoAction(dataName, isRepository?Set.of(OperationType.publication, OperationType.delete):Set.of(OperationType.publication)); } } diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/PrivilegeAssessorDomainForApplication.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/PrivilegeAssessorDomainForApplication.java index 0457897..a0e5890 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/PrivilegeAssessorDomainForApplication.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/PrivilegeAssessorDomainForApplication.java @@ -1,13 +1,10 @@ package fr.inra.oresing.domain.authorization.privilegeassessor; import fr.inra.oresing.domain.application.Application; -import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationManagerRightsException; -import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationUserManagerRightsException; -import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationUserReaderRightsException; -import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationAdminUser; -import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationManager; -import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationManagerUser; -import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationReader; +import fr.inra.oresing.domain.application.configuration.Submission; +import fr.inra.oresing.domain.application.configuration.SubmissionType; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.*; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.*; import fr.inra.oresing.domain.repository.authorization.OperationType; import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; import fr.inra.oresing.rest.model.authorization.AuthorizationsForUserResult; @@ -21,6 +18,9 @@ public record PrivilegeAssessorDomainForApplication<PrivilegeApplicationDomain>( PrivilegeApplicationDomain domain, Application application, GetGrantableResult grantable) implements PrivilegeAssessorDomain { + /* + Test if is applicationAdminUserForUpdate + */ public ApplicationManager forUpdateApplication() { if (!authorizations.isApplicationManager()) { throw new NotApplicationManagerRightsException(application.getName()); @@ -28,20 +28,30 @@ public record PrivilegeAssessorDomainForApplication<PrivilegeApplicationDomain>( return new ApplicationAdminUser(application()); } + /* + Test if is applicationManagerUserForUpdateRights + */ public ApplicationManager forManageAuthorizations() { if (!authorizations.isUserManager()) { throw new NotApplicationUserManagerRightsException(application.getName()); } - return new ApplicationManagerUser(); + return new ApplicationManagerUser(application()); } + + /* + Test if is applicationManagerUserForCreateRights + */ public ApplicationManager forAddAuthorization() { if (!authorizations.isUserManager()) { throw new NotApplicationUserReaderRightsException(application.getName()); } - return new ApplicationManagerUser(); + return new ApplicationManagerUser(application()); } + /* + Test if is applicationManagerUserForManageAdministrator + */ public ApplicationAdminUser forManageAdministrator() { if (!authorizations.isApplicationManager()) { throw new NotApplicationManagerRightsException(application.getName()); @@ -49,11 +59,15 @@ public record PrivilegeAssessorDomainForApplication<PrivilegeApplicationDomain>( return new ApplicationAdminUser(application()); } - public ApplicationReader forDataRead(String dataName) { + + /* + Test if is applicationUserForReadingData + */ + public ApplicationDataReader forDataRead(String dataName) { Optional.of(authorizations()) .filter(authorizationsForApplicationUser -> authorizationsForApplicationUser.canRead(dataName)) - .orElseThrow(NotApplicationManagerRightsException::new); - return new ApplicationReader(application()); + .orElseThrow(()->new NotApplicationDataReaderException(application().getName(), dataName)); + return new ApplicationDataReader(application()); } public Map<AuthorizationsForUserResult.Roles, Boolean> getAuthorizationsForUser(String dataName) { @@ -91,4 +105,50 @@ public record PrivilegeAssessorDomainForApplication<PrivilegeApplicationDomain>( } return new ApplicationAdminUser(application()); } + + public ApplicationDataWriter forDataWrite(String dataName, boolean toPublish) { + AuthorizationsForApplicationUser authorizationsForApplicationUser = Optional.of(authorizations()) + .filter(authorizations -> authorizations.canWrite(dataName, toPublish)) + .orElseThrow(() -> new NotApplicationDataWriterException(application().getName(), dataName)); + if(authorizationsForApplicationUser.isApplicationManager()){ + return new ApplicationAdminUser(application(),dataName); + } + if(authorizationsForApplicationUser.isUserManager()){ + return new ApplicationManagerUser(application(), dataName); + } + if(toPublish || !application().isData(dataName)){ + return new ApplicationPublishWriterUser( + application(), + dataName, + authorizationsForApplicationUser.getAuthorizations(dataName, Set.of(OperationType.publication)) + ); + } + return new ApplicationDepositWriterUser( + application(), + dataName, + authorizationsForApplicationUser.getAuthorizations(dataName, Set.of(OperationType.depot)) + ); + } + + public ApplicationDataDelete forDataDelete(String dataName) { + boolean isRepository = application().findSubmission(dataName) + .map(Submission::strategy) + .filter(SubmissionType.OA_VERSIONING::equals) + .isPresent(); + AuthorizationsForApplicationUser authorizationsForApplicationUser = Optional.of(authorizations()) + .filter(authorizations -> authorizations.canDelete(dataName, isRepository)) + .orElseThrow(() -> new NotApplicationCanDeleteRightsException(application().getName(), dataName)); + if(authorizationsForApplicationUser.isApplicationManager()){ + return new ApplicationAdminUser(application(),dataName); + } + if(authorizationsForApplicationUser.isUserManager()){ + return new ApplicationManagerUser(application(), dataName); + } + return new ApplicationDeleteUser( + application(), + dataName, + authorizationsForApplicationUser.getAuthorizations(dataName, Set.of(OperationType.delete)) + ); + } + } diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataReaderException.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataReaderException.java new file mode 100644 index 0000000..9823578 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataReaderException.java @@ -0,0 +1,25 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.exception; + +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import lombok.Getter; + +@Getter +public class NotApplicationDataReaderException extends OreSiTechnicalException { + public static final String NO_RIGHT_FOR_USER_DATA_READER = "NO_RIGHT_FOR_USER_DATA_READER"; + public String applicationName; + public String dataName; + + public NotApplicationDataReaderException(final String applicationName, String dataName) { + super(NO_RIGHT_FOR_USER_DATA_READER); + this.applicationName = applicationName; + this.dataName = dataName; + } + + public NotApplicationDataReaderException() { + super(NO_RIGHT_FOR_USER_DATA_READER); + } + + public NotApplicationDataReaderException(final Throwable cause) { + super(NO_RIGHT_FOR_USER_DATA_READER, cause); + } +} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterException.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterException.java new file mode 100644 index 0000000..1285de4 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterException.java @@ -0,0 +1,25 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.exception; + +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import lombok.Getter; + +@Getter +public class NotApplicationDataWriterException extends OreSiTechnicalException { + public static final String NO_RIGHT_FOR_USER_DATA_WRITER = "NO_RIGHT_FOR_USER_DATA_WRITER"; + public String applicationName; + public String dataName; + + public NotApplicationDataWriterException(final String applicationName, String dataName) { + super(NO_RIGHT_FOR_USER_DATA_WRITER); + this.applicationName = applicationName; + this.dataName = dataName; + } + + public NotApplicationDataWriterException() { + super(NO_RIGHT_FOR_USER_DATA_WRITER); + } + + public NotApplicationDataWriterException(final Throwable cause) { + super(NO_RIGHT_FOR_USER_DATA_WRITER, cause); + } +} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForDepositException.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForDepositException.java new file mode 100644 index 0000000..d3e72f6 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForDepositException.java @@ -0,0 +1,17 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.exception; + +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import lombok.Getter; + +@Getter +public class NotApplicationDataWriterForDepositException extends OreSiTechnicalException { + public static final String NO_RIGHT_FOR_USER_DATA_WRITER_FOR_DEPOSIT = "NO_RIGHT_FOR_USER_DATA_WRITER_FOR_DEPOSIT"; + public String applicationName; + public String dataName; + + public NotApplicationDataWriterForDepositException(final String applicationName, String dataName) { + super(NO_RIGHT_FOR_USER_DATA_WRITER_FOR_DEPOSIT); + this.applicationName = applicationName; + this.dataName = dataName; + } +} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForPublishException.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForPublishException.java new file mode 100644 index 0000000..14f4281 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotApplicationDataWriterForPublishException.java @@ -0,0 +1,25 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.exception; + +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import lombok.Getter; + +@Getter +public class NotApplicationDataWriterForPublishException extends OreSiTechnicalException { + public static final String NO_RIGHT_FOR_USER_DATA_WRITER_FOR_PUBLISH = "NO_RIGHT_FOR_USER_DATA_WRITER_FOR_PUBLISH"; + public String applicationName; + public String dataName; + + public NotApplicationDataWriterForPublishException(final String applicationName, String dataName) { + super(NO_RIGHT_FOR_USER_DATA_WRITER_FOR_PUBLISH); + this.applicationName = applicationName; + this.dataName = dataName; + } + + public NotApplicationDataWriterForPublishException() { + super(NO_RIGHT_FOR_USER_DATA_WRITER_FOR_PUBLISH); + } + + public NotApplicationDataWriterForPublishException(final Throwable cause) { + super(NO_RIGHT_FOR_USER_DATA_WRITER_FOR_PUBLISH, cause); + } +} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotOpenAdomAdminException.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotOpenAdomAdminException.java index 9b6f628..088dbba 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotOpenAdomAdminException.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/exception/NotOpenAdomAdminException.java @@ -3,12 +3,12 @@ package fr.inra.oresing.domain.authorization.privilegeassessor.exception; import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; public class NotOpenAdomAdminException extends OreSiTechnicalException { - public static final String openAdomAdmin_REQUIRED_FOR_OPERATION = "openAdomAdmin_REQUIRED_FOR_OPERATION"; + public static final String OPEN_ADOM_ADMIN_REQUIRED_FOR_OPERATION = "OPEN_ADOM_ADMIN_REQUIRED_FOR_OPERATION"; public NotOpenAdomAdminException() { - super(openAdomAdmin_REQUIRED_FOR_OPERATION); + super(OPEN_ADOM_ADMIN_REQUIRED_FOR_OPERATION); } public NotOpenAdomAdminException(final Throwable cause) { - super(openAdomAdmin_REQUIRED_FOR_OPERATION, cause); + super(OPEN_ADOM_ADMIN_REQUIRED_FOR_OPERATION, cause); } } \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationAdminUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationAdminUser.java index 1b60257..7f5acfd 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationAdminUser.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationAdminUser.java @@ -5,13 +5,22 @@ import fr.inra.oresing.domain.OreSiUser; import fr.inra.oresing.domain.application.Application; import fr.inra.oresing.domain.authorization.privilegeassessor.exception.IllegalRoleToBeGranted; import fr.inra.oresing.domain.authorization.privilegeassessor.exception.IllegalUserToBeGranted; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.file.FileOrUUID; import fr.inra.oresing.domain.repository.authorization.role.OreSiRightOnApplicationRole; import java.util.List; import java.util.Objects; import java.util.Optional; -public record ApplicationAdminUser(Application application) implements ApplicationManager { +public record ApplicationAdminUser( + Application application, + String dataName +) implements ApplicationManager, ApplicationDataWriter, ApplicationDataDelete { + public ApplicationAdminUser(Application application) { + this(application, ApplicationManager.ALL_DATANAMES); + } + @Override public boolean canUpdateApplication() { return true; @@ -31,4 +40,24 @@ public record ApplicationAdminUser(Application application) implements Applicati } return true; } + + @Override + public boolean canDelete(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public boolean hasRightForPublishOrUnPublish(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public boolean hasRightForDeposit(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public OreSiTechnicalException getException() { + return null; + } } diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataDelete.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataDelete.java new file mode 100644 index 0000000..b752eb0 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataDelete.java @@ -0,0 +1,22 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +import com.google.common.base.Strings; +import fr.inra.oresing.domain.BinaryFileDataset; +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.application.configuration.Ltree; +import fr.inra.oresing.domain.application.configuration.date.LocalDateTimeRange; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; +import org.apache.commons.collections.CollectionUtils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public sealed interface ApplicationDataDelete extends ApplicationDataWriter + permits ApplicationAdminUser, ApplicationDeleteUser, ApplicationManagerUser { +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataReader.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataReader.java new file mode 100644 index 0000000..be9563a --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataReader.java @@ -0,0 +1,15 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +import fr.inra.oresing.domain.OreSiRoleForUser; +import fr.inra.oresing.domain.OreSiUser; +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.IllegalRoleToBeGranted; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.IllegalUserToBeGranted; +import fr.inra.oresing.domain.repository.authorization.role.OreSiRightOnApplicationRole; + +import java.util.List; +import java.util.Objects; +import java.util.Optional; + +public record ApplicationDataReader(Application application) implements ApplicationUser { +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataWriter.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataWriter.java new file mode 100644 index 0000000..6da07e2 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDataWriter.java @@ -0,0 +1,161 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +import com.google.common.base.Strings; +import fr.inra.oresing.domain.BinaryFileDataset; +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.application.configuration.Ltree; +import fr.inra.oresing.domain.application.configuration.date.LocalDateTimeRange; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; +import org.apache.commons.collections.CollectionUtils; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.function.Predicate; +import java.util.stream.Collectors; + +public sealed interface ApplicationDataWriter extends ApplicationUser + permits ApplicationAdminUser, ApplicationDataDelete, ApplicationDeleteUser, ApplicationDepositWriterUser, ApplicationManagerUser, ApplicationPublishWriterUser { + boolean canDelete(FileOrUUID fileOrUUID); + + boolean hasRightForPublishOrUnPublish(FileOrUUID fileOrUUID); + + boolean hasRightForDeposit(FileOrUUID fileOrUUID); + + + Application application(); + + default String applicationName() { + return application().getName(); + } + + ; + + String dataName(); + + default boolean isData() { + return application().isData(dataName()); + } + + OreSiTechnicalException getException(); + + default boolean testRequiredAuthorizations(Map<String, Set<String>> authorizationsScope, Map<String, List<Ltree>> submissionScope) { + if (submissionScope.isEmpty()) { + return true; + } + for (Map.Entry<String, Set<String>> authorizationScopeByReference : authorizationsScope.entrySet()) { + Set<String> authorizationScopes = authorizationScopeByReference.getValue(); + if (!CollectionUtils.isEmpty(authorizationScopes) && !testSumissionScopeForReference( + authorizationScopes, + submissionScope.get(authorizationScopeByReference.getKey()) + )) { + return false; + } + } + return true; + } + + default boolean testSumissionScopeForReference(Set<String> authorizationScopes, List<Ltree> submissionScopes) { + if (CollectionUtils.isEmpty(submissionScopes)) { + return false; + } + if (!submissionScopes.stream() + .allMatch(sc -> authorizationScopes.contains(sc.getSql()))) { + return false; + } + return true; + }default boolean isDateInRangeAuthorized( + BinaryFileDataset binaryfiledataset, + List<AuthorizationParsed> authorizationParseds + ) { + // Extraction des dates de soumission + LocalDateTime from = Optional.ofNullable(binaryfiledataset) + .map(BinaryFileDataset::getFrom) + .filter(Predicate.not(Strings::isNullOrEmpty)) + .map(date -> LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) + .orElse(LocalDateTime.MIN); + + LocalDateTime to = Optional.ofNullable(binaryfiledataset) + .map(BinaryFileDataset::getTo) + .filter(Predicate.not(Strings::isNullOrEmpty)) + .map(date -> LocalDateTime.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) + .orElse(LocalDateTime.MAX); + + LocalDateTimeRange submissionIntervalScope = LocalDateTimeRange.between(from, to); + + // Liste des intervalles d'intersection + List<LocalDateTimeRange> authorizationMatchingIntervals = new ArrayList<>(); + + for (AuthorizationParsed authorizationParsed : authorizationParseds) { + LocalDateTimeRange authorizationIntervalScope = LocalDateTimeRange.between( + Optional.ofNullable(authorizationParsed) + .map(AuthorizationParsed::fromDay) + .map(LocalDate::atStartOfDay) + .orElse(LocalDateTime.MIN), + Optional.ofNullable(authorizationParsed) + .map(AuthorizationParsed::toDay) + .map(LocalDate::atStartOfDay) + .orElse(LocalDateTime.MAX) + ); + + // Vérification du chevauchement + if (submissionIntervalScope.getRange().lowerEndpoint() + .compareTo(authorizationIntervalScope.getRange().upperEndpoint()) <= 0 && + submissionIntervalScope.getRange().upperEndpoint() + .compareTo(authorizationIntervalScope.getRange().lowerEndpoint()) >= 0) { + + // Calcul de l'intervalle d'intersection + LocalDateTimeRange intersectionInterval = LocalDateTimeRange.between( + submissionIntervalScope.getRange().lowerEndpoint().compareTo(authorizationIntervalScope.getRange().lowerEndpoint()) <= 0 ? + authorizationIntervalScope.getRange().lowerEndpoint() : + submissionIntervalScope.getRange().lowerEndpoint(), + submissionIntervalScope.getRange().upperEndpoint().compareTo(authorizationIntervalScope.getRange().upperEndpoint()) >= 0 ? + authorizationIntervalScope.getRange().upperEndpoint() : + submissionIntervalScope.getRange().upperEndpoint() + ); + + authorizationMatchingIntervals.add(intersectionInterval); + } + } + + // Vérification de la couverture totale + return verifyCoverageCompleteness(submissionIntervalScope, authorizationMatchingIntervals); + } + + private boolean verifyCoverageCompleteness( + LocalDateTimeRange submissionIntervalScope, + List<LocalDateTimeRange> authorizationMatchingIntervals + ) { + // Trier les intervalles par date de début + List<LocalDateTimeRange> sortedIntervals = authorizationMatchingIntervals.stream() + .sorted(Comparator.comparing(interval -> interval.getRange().lowerEndpoint())) + .collect(Collectors.toList()); + + LocalDateTime currentCoverageEnd = submissionIntervalScope.getRange().lowerEndpoint(); + + for (LocalDateTimeRange interval : sortedIntervals) { + // Vérifier si l'intervalle couvre le trou précédent + if (interval.getRange().lowerEndpoint().compareTo(currentCoverageEnd) > 0) { + return false; // Trou dans la couverture + } + + // Mettre à jour la fin de couverture + currentCoverageEnd = interval.getRange().upperEndpoint().compareTo(currentCoverageEnd) > 0 + ? interval.getRange().upperEndpoint() + : currentCoverageEnd; + } + + // Vérifier si la couverture atteint la fin de l'intervalle de soumission + boolean isFullyCovered = currentCoverageEnd.compareTo(submissionIntervalScope.getRange().upperEndpoint()) >= 0; + + if (!isFullyCovered) { + throw getException(); + } + + return true; + } + +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDeleteUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDeleteUser.java new file mode 100644 index 0000000..c7258f6 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDeleteUser.java @@ -0,0 +1,75 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationCanDeleteRightsException; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.domain.repository.authorization.OperationType; +import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; +import org.apache.commons.collections.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; + +public record ApplicationDeleteUser( + Application application, + String dataName, + ArrayList<AuthorizationParsed> authorizations, + boolean isRepository +) implements ApplicationDataDelete, ApplicationDataWriter { + public ApplicationDeleteUser(Application application, String dataName, ArrayList<AuthorizationParsed> authorizations) { + this(application, dataName, authorizations, application.findSubmission(dataName).isPresent()); + } + + @Override + public boolean canDelete(FileOrUUID fileOrUUID) { + List<AuthorizationParsed> authorizationParseds = authorizations().stream() + .filter(authorizationParsed -> Optional.ofNullable(authorizationParsed) + .map(AuthorizationParsed::operationTypes) + .stream().anyMatch(operationTypes->operationTypes.contains(OperationType.delete)) + ) + .filter(authorizationParsed -> testRequiredAuthorizations(authorizationParsed.requiredAuthorizations(), fileOrUUID.binaryfiledataset().getRequiredAuthorizations())) + .toList(); + if(authorizationParseds.isEmpty()){ + throw getException(); + } + if(!isDateInRangeAuthorized(fileOrUUID.binaryfiledataset(), authorizationParseds)){ + throw getException(); + } + return true; + } + + @Override + public boolean hasRightForPublishOrUnPublish(FileOrUUID fileOrUUID) { + List<AuthorizationParsed> authorizationParseds = authorizations().stream() + .filter(authorizationParsed -> Optional.ofNullable(authorizationParsed) + .map(AuthorizationParsed::operationTypes) + .stream().anyMatch(operationTypes->operationTypes.contains(OperationType.delete)) + ) + .filter(authorizationParsed -> testRequiredAuthorizations(authorizationParsed.requiredAuthorizations(), fileOrUUID.binaryfiledataset().getRequiredAuthorizations())) + .toList(); + if(!isRepository()){ + if(CollectionUtils.isEmpty(authorizationParseds)){ + throw getException(); + } + return true; + } + if(authorizationParseds.isEmpty()){ + throw getException(); + } + if(!isDateInRangeAuthorized(fileOrUUID.binaryfiledataset(), authorizationParseds)){ + throw getException(); + } + return true; + } + + @Override + public boolean hasRightForDeposit(FileOrUUID fileOrUUID) { + return false; + } + + public OreSiTechnicalException getException() { + return new NotApplicationCanDeleteRightsException(applicationName(), dataName()); + } +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositUser.java new file mode 100644 index 0000000..81c0b1a --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositUser.java @@ -0,0 +1,8 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +public record ApplicationDepositUser() implements ApplicationManager { + @Override + public boolean canUpdateApplication() { + return false; + } +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositWriterUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositWriterUser.java new file mode 100644 index 0000000..bb6e10a --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationDepositWriterUser.java @@ -0,0 +1,50 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterForDepositException; +import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; +import org.apache.commons.collections.CollectionUtils; + +import java.util.*; + +public record ApplicationDepositWriterUser( + Application application, + String dataName, + ArrayList<AuthorizationParsed> authorizations +) implements ApplicationDataWriter { + @Override + public boolean canDelete(FileOrUUID fileOrUUID) { + return false; + } + + @Override + public boolean hasRightForPublishOrUnPublish(FileOrUUID fileOrUUID) { + return false; + } + + @Override + public boolean hasRightForDeposit(FileOrUUID fileOrUUID) { + if(!isData()){ + if(CollectionUtils.isEmpty(authorizations)){ + throw getException(); + } + return true; + } + List<AuthorizationParsed> authorizationParseds = authorizations().stream() + .filter(authorizationParsed -> testRequiredAuthorizations(authorizationParsed.requiredAuthorizations(), fileOrUUID.binaryfiledataset().getRequiredAuthorizations())) + .toList(); + if(authorizationParseds.isEmpty()){ + throw getException(); + } + if(!isDateInRangeAuthorized(fileOrUUID.binaryfiledataset(), authorizationParseds)){ + throw getException(); + } + return true; + } + + @Override + public NotApplicationDataWriterForDepositException getException() { + return new NotApplicationDataWriterForDepositException(applicationName(), dataName()); + } +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManager.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManager.java index 7a26c30..fbf8800 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManager.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManager.java @@ -1,6 +1,7 @@ package fr.inra.oresing.domain.authorization.privilegeassessor.role; public sealed interface ApplicationManager - permits ApplicationManagerUser, ApplicationAdminUser { + permits ApplicationAdminUser, ApplicationDepositUser, ApplicationManagerUser { + public static String ALL_DATANAMES = "ALL_DATANAMES"; boolean canUpdateApplication(); } diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManagerUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManagerUser.java index b009567..582cc1e 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManagerUser.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationManagerUser.java @@ -1,9 +1,40 @@ package fr.inra.oresing.domain.authorization.privilegeassessor.role; -public record ApplicationManagerUser() implements ApplicationManager { +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.file.FileOrUUID; + +public record ApplicationManagerUser( + Application application, + String dataName +) implements ApplicationManager, ApplicationDataWriter, ApplicationDataDelete { + + public ApplicationManagerUser(Application application) { + this(application, ApplicationManager.ALL_DATANAMES); + } @Override public boolean canUpdateApplication() { return false; } + + @Override + public boolean canDelete(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public boolean hasRightForPublishOrUnPublish(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public boolean hasRightForDeposit(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public OreSiTechnicalException getException() { + return null; + } } diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationPublishWriterUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationPublishWriterUser.java new file mode 100644 index 0000000..8c64f95 --- /dev/null +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationPublishWriterUser.java @@ -0,0 +1,51 @@ +package fr.inra.oresing.domain.authorization.privilegeassessor.role; + +import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterForDepositException; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; +import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; +import org.apache.commons.collections.CollectionUtils; + +import java.util.ArrayList; +import java.util.List; + +public record ApplicationPublishWriterUser( + Application application, + String dataName, + ArrayList<AuthorizationParsed> authorizations +) implements ApplicationDataWriter { + @Override + public boolean canDelete(FileOrUUID fileOrUUID) { + return true; + } + + @Override + public boolean hasRightForPublishOrUnPublish(FileOrUUID fileOrUUID) { + if(!isData()){ + if(CollectionUtils.isEmpty(authorizations)){ + throw getException(); + } + return true; + } + List<AuthorizationParsed> authorizationParseds = authorizations().stream() + .filter(authorizationParsed -> testRequiredAuthorizations(authorizationParsed.requiredAuthorizations(), fileOrUUID.binaryfiledataset().getRequiredAuthorizations())) + .toList(); + if(authorizationParseds.isEmpty()){ + throw getException(); + } + if(!isDateInRangeAuthorized(fileOrUUID.binaryfiledataset(), authorizationParseds)){ + throw getException(); + } + return true; + } + + @Override + public boolean hasRightForDeposit(FileOrUUID fileOrUUID) { + return hasRightForPublishOrUnPublish(fileOrUUID); + } + + public OreSiTechnicalException getException() { + return new NotApplicationDataWriterForDepositException(applicationName(), dataName()); + } +} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationReader.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationReader.java deleted file mode 100644 index 57f4946..0000000 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationReader.java +++ /dev/null @@ -1,34 +0,0 @@ -package fr.inra.oresing.domain.authorization.privilegeassessor.role; - -import fr.inra.oresing.domain.OreSiRoleForUser; -import fr.inra.oresing.domain.OreSiUser; -import fr.inra.oresing.domain.application.Application; -import fr.inra.oresing.domain.authorization.privilegeassessor.exception.IllegalRoleToBeGranted; -import fr.inra.oresing.domain.authorization.privilegeassessor.exception.IllegalUserToBeGranted; -import fr.inra.oresing.domain.repository.authorization.role.OreSiRightOnApplicationRole; - -import java.util.List; -import java.util.Objects; -import java.util.Optional; - -public record ApplicationReader(Application application) implements ApplicationUser { - @Override - public boolean canUpdateApplication() { - return true; - } - - public boolean canManagerRightOfUserForRole(OreSiUser user, OreSiRoleForUser roleForUser) { - if (Optional.ofNullable(user) - .map(OreSiUser::getChartes) - .map(chartes -> chartes.get(application().getId().toString())) - .isEmpty()) { - throw new IllegalUserToBeGranted(Objects.requireNonNull(user), application().getName()); - } - OreSiRightOnApplicationRole userManager = OreSiRightOnApplicationRole.userAdminOn(application()); - OreSiRightOnApplicationRole applicationManager = OreSiRightOnApplicationRole.adminOn(application()); - if (!List.of(applicationManager.getAsSqlRole(), userManager.getAsSqlRole()).toString().contains(roleForUser.role())) { - throw new IllegalRoleToBeGranted(roleForUser.role()); - } - return true; - } -} diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationUser.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationUser.java index da01230..21d73a6 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationUser.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/ApplicationUser.java @@ -1,6 +1,5 @@ package fr.inra.oresing.domain.authorization.privilegeassessor.role; public sealed interface ApplicationUser - permits ApplicationReader { - boolean canUpdateApplication(); + permits ApplicationDataReader, ApplicationDataWriter { } diff --git a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/PrivilegeApplicationDomain.java b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/PrivilegeApplicationDomain.java index 4270995..9bca692 100644 --- a/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/PrivilegeApplicationDomain.java +++ b/src/main/java/fr/inra/oresing/domain/authorization/privilegeassessor/role/PrivilegeApplicationDomain.java @@ -5,6 +5,7 @@ public enum PrivilegeApplicationDomain { APPLICATION_MANAGER, DATA_MANAGEMENT, DATA_READ, + DATA_WRITE, ADDITIONAL_FILE_MANAGEMENT, AUTHORIZATION_MANAGEMENT, RIGHTS_REQUEST_MANAGEMENT, diff --git a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderBy.java b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderBy.java index 7b53785..e985a46 100644 --- a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderBy.java +++ b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderBy.java @@ -3,8 +3,8 @@ package fr.inra.oresing.domain.data.read.query; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.checker.type.FieldType; import fr.inra.oresing.domain.exceptions.data.data.BadDownloadDatasetQuery; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.DataRepository; -import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import java.util.Map; import java.util.stream.Stream; @@ -26,7 +26,7 @@ public record ComponentOrderBy(String componentKey, DataRepository.Order order, public Stream<String> toValue( String language, - DataRepositoryWithBuffer dataRepository, + DataRepositoryForBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription ) { diff --git a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderByForExport.java b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderByForExport.java index 6dd3613..e117881 100644 --- a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderByForExport.java +++ b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentOrderByForExport.java @@ -7,6 +7,7 @@ import fr.inra.oresing.domain.application.configuration.checker.ReferenceChecker import fr.inra.oresing.domain.checker.type.DateType; import fr.inra.oresing.domain.checker.type.FieldType; import fr.inra.oresing.domain.checker.type.MapType; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import java.time.LocalDateTime; @@ -20,7 +21,7 @@ import java.util.stream.Stream; public sealed interface ComponentOrderByForExport permits ComponentOrderBy, ComponentPatternOrderBy, ComponentPatternValueOrderBy, DynamicComponentOrderBy { - Stream<String> toValue(String language, DataRepositoryWithBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription); + Stream<String> toValue(String language, DataRepositoryForBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription); String componentKey(); @@ -28,7 +29,7 @@ public sealed interface ComponentOrderByForExport default String valueToString( String language, - DataRepositoryWithBuffer dataRepository, + DataRepositoryForBuffer dataRepository, StandardDataDescription dataDescription, FieldType fieldType) { if (fieldType instanceof MapType mapType) { diff --git a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternOrderBy.java b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternOrderBy.java index 9c2d972..8d29dc7 100644 --- a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternOrderBy.java +++ b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternOrderBy.java @@ -3,8 +3,8 @@ package fr.inra.oresing.domain.data.read.query; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.checker.type.*; import fr.inra.oresing.domain.data.deposit.context.column.Column; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.DataRepository; -import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import java.util.ArrayList; import java.util.List; @@ -16,7 +16,7 @@ public record ComponentPatternOrderBy(String componentKey, String qualifierKey, ComponentType sqlType, List<ComponentOrderBy> qualifiersColumns) implements ComponentOrderByForExport { @Override - public Stream<String> toValue(String language, DataRepositoryWithBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription) { + public Stream<String> toValue(String language, DataRepositoryForBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription) { String componentKey = componentKey(); FieldType fieldType = dataRowValues.get(componentKey); Optional<MapType> valueOpt = ((ListType) fieldType).getValue().stream().filter(mapType -> qualifierKey().equals(((MapType) mapType).getValue().get(Column.__ORIGINAL_COLUMN_NAME__).toString())).findFirst(); diff --git a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternValueOrderBy.java b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternValueOrderBy.java index 51bdcaf..4555019 100644 --- a/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternValueOrderBy.java +++ b/src/main/java/fr/inra/oresing/domain/data/read/query/ComponentPatternValueOrderBy.java @@ -5,8 +5,8 @@ import fr.inra.oresing.domain.checker.type.FieldType; import fr.inra.oresing.domain.checker.type.ListType; import fr.inra.oresing.domain.checker.type.MapType; import fr.inra.oresing.domain.data.deposit.context.column.Column; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.DataRepository; -import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import java.util.*; import java.util.stream.Stream; @@ -16,7 +16,7 @@ public record ComponentPatternValueOrderBy(String componentKey, String qualifier Set<ComponentOrderBy> qualifiersColumns, Set<ComponentOrderBy> adjacentColumns) implements ComponentOrderByForExport { @Override - public Stream<String> toValue(String language, DataRepositoryWithBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription) { + public Stream<String> toValue(String language, DataRepositoryForBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription) { String componentKey = componentKey(); ListType fieldType = (ListType) dataRowValues.get(componentKey); @@ -38,18 +38,18 @@ public record ComponentPatternValueOrderBy(String componentKey, String qualifier return Stream.empty(); } - private String getAdacentValue(String language, DataRepositoryWithBuffer dataRepository, StandardDataDescription dataDescription, ComponentOrderBy qualifier, MapType patternMapTypeOpt) { + private String getAdacentValue(String language, DataRepositoryForBuffer dataRepository, StandardDataDescription dataDescription, ComponentOrderBy qualifier, MapType patternMapTypeOpt) { String adjacentKey = qualifier.componentKey().split(Column.COLUMN_IN_COLUMN_SEPARATOR)[1]; FieldType adjacentField = (FieldType) patternMapTypeOpt.getValue().get(adjacentKey); return valueToString(language, dataRepository, dataDescription, adjacentField); } - private String getQualifierValue(String language, DataRepositoryWithBuffer dataRepository, StandardDataDescription dataDescription, ComponentOrderBy qualifier, MapType patternMapTypeOpt) { + private String getQualifierValue(String language, DataRepositoryForBuffer dataRepository, StandardDataDescription dataDescription, ComponentOrderBy qualifier, MapType patternMapTypeOpt) { FieldType adjacentField = (FieldType) patternMapTypeOpt.getValue().get(qualifier.componentKey()); return valueToString(language, dataRepository, dataDescription, adjacentField); } - private String getValue(String language, DataRepositoryWithBuffer dataRepository, StandardDataDescription dataDescription, MapType mapType) { + private String getValue(String language, DataRepositoryForBuffer dataRepository, StandardDataDescription dataDescription, MapType mapType) { return valueToString(language, dataRepository, dataDescription, (FieldType) mapType.getValue().get(Column.__VALUE__)); } diff --git a/src/main/java/fr/inra/oresing/domain/data/read/query/DynamicComponentOrderBy.java b/src/main/java/fr/inra/oresing/domain/data/read/query/DynamicComponentOrderBy.java index 89e65a2..c8a8aea 100644 --- a/src/main/java/fr/inra/oresing/domain/data/read/query/DynamicComponentOrderBy.java +++ b/src/main/java/fr/inra/oresing/domain/data/read/query/DynamicComponentOrderBy.java @@ -3,14 +3,14 @@ package fr.inra.oresing.domain.data.read.query; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.checker.type.FieldType; import fr.inra.oresing.domain.checker.type.StringType; -import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import java.util.Map; import java.util.stream.Stream; public record DynamicComponentOrderBy(String componentKey, Map<String, ComponentOrderBy> dynamicColumns) implements ComponentOrderByForExport { @Override - public Stream<String> toValue(String language, DataRepositoryWithBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription) { + public Stream<String> toValue(String language, DataRepositoryForBuffer dataRepository, Map<String, FieldType> dataRowValues, StandardDataDescription dataDescription) { String componentKey = componentKey(); Map<String, StringType> values = (Map<String, StringType>) dataRowValues.get(componentKey).getValue(); return dynamicColumns().keySet().stream() diff --git a/src/main/java/fr/inra/oresing/domain/exceptions/authorization/AuthorizationRequestException.java b/src/main/java/fr/inra/oresing/domain/exceptions/authorization/AuthorizationRequestException.java index 04a7872..ea750df 100644 --- a/src/main/java/fr/inra/oresing/domain/exceptions/authorization/AuthorizationRequestException.java +++ b/src/main/java/fr/inra/oresing/domain/exceptions/authorization/AuthorizationRequestException.java @@ -17,7 +17,7 @@ public enum AuthorizationRequestException { BAD_FILE_NAME_START_DATE, BAD_FILE_NAME_END_DATE, - INVAALID_FILE_NAME, + INVALID_FILE_NAME, MISSING_REQUIRED_AUTHORIZATION, NO_RIGHT_ON_TABLE_FOR_DEPOSIT; diff --git a/src/main/java/fr/inra/oresing/domain/file/FileOrUUID.java b/src/main/java/fr/inra/oresing/domain/file/FileOrUUID.java index 3dd335d..5c7a5e2 100644 --- a/src/main/java/fr/inra/oresing/domain/file/FileOrUUID.java +++ b/src/main/java/fr/inra/oresing/domain/file/FileOrUUID.java @@ -21,6 +21,12 @@ public record FileOrUUID(UUID fileid, BinaryFileDataset binaryfiledataset, Boole ); } + public static FileOrUUID forUUID(UUID id) { + return new FileOrUUID( + id, null, false + ); + } + public FileOrUUID withParams(BinaryFileInfos binaryFileInfos) { return new FileOrUUID( fileid(), @@ -30,17 +36,17 @@ public record FileOrUUID(UUID fileid, BinaryFileDataset binaryfiledataset, Boole } - public boolean requiredAuthorizationMatchForFile(final Map<String, Set<String>>requiredAuthorizationInDataBase) { + public boolean requiredAuthorizationMatchForFile(final Map<String, Set<String>> requiredAuthorizationInDataBase) { Optional<Map<String, List<Ltree>>> requiredAuthorizationForFile = Optional.ofNullable(binaryfiledataset()) .map(BinaryFileDataset::getRequiredAuthorizations); if (requiredAuthorizationForFile.isPresent()) { for (final Map.Entry<String, List<Ltree>> requiredAuthorizationForFileEntry : requiredAuthorizationForFile.get().entrySet()) { final String scope = requiredAuthorizationForFileEntry.getKey(); final String ltree = requiredAuthorizationForFileEntry.getValue().getFirst().getSql(); - if(requiredAuthorizationInDataBase.get(scope).stream() + if (requiredAuthorizationInDataBase.get(scope).stream() .noneMatch(pathAuthorized -> ltree.equals(pathAuthorized) || - ltree.startsWith(pathAuthorized+Ltree.SEPARATOR)) - ){ + ltree.startsWith(pathAuthorized + Ltree.SEPARATOR)) + ) { return false; } } diff --git a/src/main/java/fr/inra/oresing/domain/repository/data/DataRepository.java b/src/main/java/fr/inra/oresing/domain/repository/data/DataRepository.java index e68c5bc..1fd274b 100644 --- a/src/main/java/fr/inra/oresing/domain/repository/data/DataRepository.java +++ b/src/main/java/fr/inra/oresing/domain/repository/data/DataRepository.java @@ -24,7 +24,7 @@ public interface DataRepository { ImmutableMap<DataValue.LineIdentityPatternColumnName, UUID> getDataIdPerKeys(String s); @Transactional(readOnly = true) - Stream<DataValue> findAllByReferenceTypeStream(String ref); + Stream<DataValue> findAllByReferenceTypeStream(String referenceName); @Transactional(readOnly = true) Stream<DataValue> findAllByReferenceTypeWithReferencingReferencesStream(final String refType, final MultiValueMap<String, String> params); @@ -42,4 +42,6 @@ public interface DataRepository { Flux<FileContent> getStoredData(Application application, String dataName); void flush(); + + Map<String, Map<String, String>> findDisplayByNaturalKey(String replace); } diff --git a/src/main/java/fr/inra/oresing/domain/repository/data/DataRepositoryForBuffer.java b/src/main/java/fr/inra/oresing/domain/repository/data/DataRepositoryForBuffer.java index eb1e1c7..e914ed2 100644 --- a/src/main/java/fr/inra/oresing/domain/repository/data/DataRepositoryForBuffer.java +++ b/src/main/java/fr/inra/oresing/domain/repository/data/DataRepositoryForBuffer.java @@ -1,10 +1,12 @@ package fr.inra.oresing.domain.repository.data; import fr.inra.oresing.domain.application.configuration.Ltree; +import fr.inra.oresing.domain.data.DataValue; import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException; import java.util.List; import java.util.Map; +import java.util.stream.Stream; public interface DataRepositoryForBuffer { Map<String, Map<String, String>> findDisplayByReferenceType(String referenceType); @@ -14,4 +16,8 @@ public interface DataRepositoryForBuffer { String findDisplayByReferenceTypeAndNaturalKeyAndLocale(String referenceType, String naturalKey, String locale); Map<String, List<Ltree>> checkHierarchicalKey(Map<String, List<Ltree>> requiredAuthorizations) throws SiOreIllegalArgumentException; + + List<Ltree> getHierarchicalKeyForEntry(Map.Entry<String, List<Ltree>> requiredAuthorizationByReference); + + Stream<DataValue> findAllByReferenceTypeStream(String referenceName); } diff --git a/src/main/java/fr/inra/oresing/domain/services/file/BinaryFileService.java b/src/main/java/fr/inra/oresing/domain/services/file/BinaryFileService.java index 544bd28..a966ff3 100644 --- a/src/main/java/fr/inra/oresing/domain/services/file/BinaryFileService.java +++ b/src/main/java/fr/inra/oresing/domain/services/file/BinaryFileService.java @@ -32,7 +32,12 @@ public interface BinaryFileService extends ServiceContainerBean { ReportErrors findPublishedVersion(String nameOrId, String dataType, FileOrUUID params, Set<BinaryFile> filesToStore, boolean searchOverlaps); - List<BinaryFile> getFilesOnRepository(String nameOrId, String datatype, BinaryFileDataset fileDatasetID, boolean overlap); + List<BinaryFile> getFilesOnRepository( + String nameOrId, + String datatype, + BinaryFileDataset fileDatasetID, + boolean overlap + ); AdditionalBinaryFileResult getAdditionalBinaryFileResult( AdditionalBinaryFile additionalBinaryFile, diff --git a/src/main/java/fr/inra/oresing/persistence/DataRepository.java b/src/main/java/fr/inra/oresing/persistence/DataRepository.java index 93ab3d9..a5397c5 100644 --- a/src/main/java/fr/inra/oresing/persistence/DataRepository.java +++ b/src/main/java/fr/inra/oresing/persistence/DataRepository.java @@ -201,7 +201,7 @@ public class DataRepository extends JsonTableInApplicationSchemaRepositoryTempla return getNamedParameterJdbcTemplate().queryForList(query, paramSource, UUID.class); } - public Stream<DataValue> findAllByReferenceTypeStream(final String refType) { + public Stream<DataValue> findAllByReferenceTypeStream(final String referenceName) { String query = """ SELECT DISTINCT '%1$s' as "@class", to_jsonb(t) as json @@ -212,7 +212,7 @@ public class DataRepository extends JsonTableInApplicationSchemaRepositoryTempla """ .formatted(DataValue.class.getName(), getTable().getSqlIdentifier()); final MapSqlParameterSource paramSource = new MapSqlParameterSource(APPLICATION_ID, getApplication().getId()) - .addValue(REF_TYPE, refType); + .addValue(REF_TYPE, referenceName); return getNamedParameterJdbcTemplate() .queryForStream(query, paramSource, getJsonRowMapper()); } diff --git a/src/main/java/fr/inra/oresing/persistence/DataRow.java b/src/main/java/fr/inra/oresing/persistence/DataRow.java index 20beaa7..fadfcfc 100644 --- a/src/main/java/fr/inra/oresing/persistence/DataRow.java +++ b/src/main/java/fr/inra/oresing/persistence/DataRow.java @@ -15,9 +15,15 @@ import java.util.stream.Collectors; /** * @param allPatternColumnNames Long totalRows;Long rowNumber; */ -public record DataRow(List<String> rowId, List<String> patternColumnName, Ltree naturalKey, Ltree hierarchicalKey, - Map<String, FieldType> values, Map<String, Map<String, RefsLinkedToValue>> refsLinkedTo, - List<String> allPatternColumnNames) { +public record DataRow( + List<String> rowId, + List<String> patternColumnName, + Ltree naturalKey, + Ltree hierarchicalKey, + Map<String, FieldType> values, + Map<String, Map<String, RefsLinkedToValue>> refsLinkedTo, + List<String> allPatternColumnNames +) { public static DataRow of(Optional<StandardDataDescription> application, DataRows dataRows) { List<String> patternComponentKeys = application .map(StandardDataDescription::componentDescriptions) diff --git a/src/main/java/fr/inra/oresing/persistence/data/read/DataRepositoryWithBuffer.java b/src/main/java/fr/inra/oresing/persistence/data/read/DataRepositoryWithBuffer.java index 039abe4..8ba3b10 100644 --- a/src/main/java/fr/inra/oresing/persistence/data/read/DataRepositoryWithBuffer.java +++ b/src/main/java/fr/inra/oresing/persistence/data/read/DataRepositoryWithBuffer.java @@ -3,9 +3,10 @@ package fr.inra.oresing.persistence.data.read; import fr.inra.oresing.domain.application.Application; import fr.inra.oresing.domain.application.configuration.Ltree; import fr.inra.oresing.domain.application.configuration.Node; +import fr.inra.oresing.domain.data.DataValue; import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException; -import fr.inra.oresing.persistence.DataRepository; +import fr.inra.oresing.domain.repository.data.DataRepository; import java.io.*; import java.nio.file.*; @@ -15,7 +16,11 @@ import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; -public record DataRepositoryWithBuffer(Application application, DataRepository repository, Path tempDir) +public record DataRepositoryWithBuffer( + Application application, + DataRepository repository, + Path tempDir +) implements fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer { public static final String PREFIX_FOR_HIERARCHICAL = "hierarchical"; @@ -87,7 +92,7 @@ public record DataRepositoryWithBuffer(Application application, DataRepository r if (hierarchicalKey == null) { String availableKeysMessage = String.join(", ", availableKeys); - throw new IllegalArgumentException( + throw new IllegalArgumentException(//TODO throw sioretechnicalException String.format("Clé non trouvée pour le type de référence: %s, clé: %s. Clés disponibles: %s", referenceType, keyForScope, availableKeysMessage) ); @@ -206,4 +211,9 @@ public record DataRepositoryWithBuffer(Application application, DataRepository r throw new UncheckedIOException("Erreur lors du nettoyage du répertoire temporaire", e); } } + + @Override + public Stream<DataValue> findAllByReferenceTypeStream(String referenceName) { + return repository().findAllByReferenceTypeStream(referenceName); + } } \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/rest/OreSiResources.java b/src/main/java/fr/inra/oresing/rest/OreSiResources.java index 2049ba9..181fa7f 100644 --- a/src/main/java/fr/inra/oresing/rest/OreSiResources.java +++ b/src/main/java/fr/inra/oresing/rest/OreSiResources.java @@ -11,6 +11,10 @@ import fr.inra.oresing.domain.additionalfiles.AdditionalFilesInfos; import fr.inra.oresing.domain.application.Application; import fr.inra.oresing.domain.application.ApplicationInformation; import fr.inra.oresing.domain.application.configuration.*; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationCanDeleteReferencesRightsException; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterForPublishException; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationDataDelete; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.PrivilegeApplicationDomain; import fr.inra.oresing.domain.chart.OreSiSynthesis; import fr.inra.oresing.domain.checker.InvalidDatasetContentException; import fr.inra.oresing.domain.checker.LineChecker; @@ -28,11 +32,10 @@ import fr.inra.oresing.domain.exceptions.binaryfile.binaryfile.BadFileOrUUIDQuer import fr.inra.oresing.domain.exceptions.data.data.BadDownloadDatasetQuery; import fr.inra.oresing.domain.exceptions.data.data.DeleteOnrepositoryApplicationNotAllowedException; import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.DataRow; import fr.inra.oresing.persistence.JsonRowMapper; -import fr.inra.oresing.persistence.OreSiRepository; import fr.inra.oresing.persistence.UserRepository; -import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import fr.inra.oresing.rest.binaryFile.BinaryFileService; import fr.inra.oresing.rest.data.publication.*; import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException; @@ -68,7 +71,6 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.apache.commons.io.output.TeeOutputStream; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; @@ -173,34 +175,49 @@ public class OreSiResources implements ServiceContainerBean { public ResponseEntity<String> removeFile(@PathVariable("name") final String applicationName, @PathVariable("id") final UUID id) { Application application = serviceContainer.applicationService().getApplication(applicationName); - StoreFile storeFile = serviceContainer.versioningService().getStoreFile(application, + StoreFile storeFile = serviceContainer.versioningService().getStoreFile( + application, null, - """ - {"fileid": "%s"}""".formatted(id), null); + FileOrUUID.forUUID(id), + null, + null + ); Optional<UUID> fileId = Optional.ofNullable(storeFile) - .map(State::params) + .map(State::fileOrUuid) .map(FileOrUUID::fileid); if (fileId.isEmpty()) { throw new SiOreIllegalArgumentException(SiOreIllegalArgumentException.NO_FILE_To_DELETE, Map.of("fileId", id)); } - Boolean canDelete = Optional.of(storeFile) + String dataName = Optional.of(storeFile) .map(StoreFile::builder) - .map(AuthorizationPublicationService::getAuthorizations) - .map(AuthorizationForUser::canDelete) - .orElse(false); + .map(AuthorizationPublicationService::getDataName) + .orElse("notFoundDataName"); + ApplicationDataDelete applicationDataDelete = serviceContainer.authorizationService().getPrivilegeAssessorForApplication(PrivilegeApplicationDomain.DATA_ACCESS, application) + .forDataDelete(dataName); + storeFile = serviceContainer.versioningService().getStoreFile( + application, + dataName, + storeFile.fileOrUuid(), + null, + applicationDataDelete + ); + + StoreFile finalStoreFile = storeFile; + Boolean canDelete = applicationDataDelete.canDelete(finalStoreFile.fileOrUuid()); if (!canDelete) { - String dataName = Optional.of(storeFile) - .map(StoreFile::builder) - .map(AuthorizationPublicationService::getDataName) - .orElse("notFoundDataname"); throw new NotApplicationCanDeleteRightsException(applicationName, dataName); } - DataVersioningResult dataVersioningResult = serviceContainer.versioningService().unPublishVersionBeforeDelete(applicationName, id); + if(!storeFile.builder().getFileOrUUID().topublish()) { + if (!applicationDataDelete.hasRightForPublishOrUnPublish(storeFile.fileOrUuid())) { + throw new NotApplicationDataWriterForPublishException(applicationName, dataName); + } + DataVersioningResult dataVersioningResult = serviceContainer.versioningService().unPublishVersionBeforeDelete(applicationName, id); + } Optional<UUID> uuid = serviceContainer.binaryFileService().removeFile(application, id); if (uuid.isPresent()) { return ResponseEntity.ok(id.toString()); } else { - return ResponseEntity.notFound().build(); + throw new NotApplicationCanDeleteRightsException(applicationName, dataName); } } @@ -209,6 +226,7 @@ public class OreSiResources implements ServiceContainerBean { @PathVariable("dataType") final String dataType, @RequestParam("repositoryId") final String repositoryId) { final BinaryFileDataset binaryFileDataset = BinaryFileService.deserialiseBinaryFileDatasetQuery(dataType, repositoryId); + Application application = serviceContainer.applicationService().getApplication(nameOrId); final List<BinaryFile> files = serviceContainer.binaryFileService().getFilesOnRepository(nameOrId, dataType, binaryFileDataset, false); return ResponseEntity.ok(files); } @@ -859,7 +877,7 @@ public class OreSiResources implements ServiceContainerBean { } else { //TODO on est dans le cas ou aucun computationChecker reference n'est décrit : authorizationscope n'est pas un referentiel } - DataRepositoryWithBuffer dataRepositoryWithBuffer = serviceContainer.dataService().getNewDataRepositoryWithBuffer(application); + DataRepositoryForBuffer dataRepositoryWithBuffer = serviceContainer.dataService().getDataRepositoryWithBuffer(application); final List<DataRowResult> dataRowResults = data.stream() .map(dataRow -> DataRowResult.of( @@ -902,20 +920,13 @@ public class OreSiResources implements ServiceContainerBean { @DeleteMapping(value = "/applications/{nameOrId}/data/{dataType}", produces = MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<String> deleteData( @PathVariable("nameOrId") final String nameOrId, - @PathVariable("dataType") final String dataType, + @PathVariable("dataType") final String dataName, @RequestParam(value = "downloadDatasetQuery", required = false) final String params) { + Application application = serviceContainer.applicationService().getApplication(nameOrId); + ApplicationDataDelete applicationDataDelete = serviceContainer.authorizationService().getPrivilegeAssessorForApplication(PrivilegeApplicationDomain.DATA_ACCESS, application) + .forDataDelete(dataName); - final ResponseEntity<String> resposeEntity = null; - final boolean deleteOnrepositoryApplicationNotAllowed = serviceContainer.applicationService().getApplication(nameOrId) - .findSubmission(dataType) - .map(Submission::strategy) - .map(SubmissionType.OA_VERSIONING::equals) - .isPresent(); - if (deleteOnrepositoryApplicationNotAllowed) { - throw new DeleteOnrepositoryApplicationNotAllowedException(); - } - - final fr.inra.oresing.domain.data.read.query.DownloadDatasetQuery downloadDatasetQuery = deserialiseParamDownloadDatasetQuery(params, nameOrId, dataType, false); + final fr.inra.oresing.domain.data.read.query.DownloadDatasetQuery downloadDatasetQuery = deserialiseParamDownloadDatasetQuery(params, nameOrId, dataName, false); final List<UUID> deletedData = serviceContainer.dataService().deleteData(downloadDatasetQuery); return ResponseEntity.ok(deletedData.stream().map(UUID::toString).collect(Collectors.joining(","))); diff --git a/src/main/java/fr/inra/oresing/rest/binaryFile/BinaryFileService.java b/src/main/java/fr/inra/oresing/rest/binaryFile/BinaryFileService.java index 538af94..cc022a7 100644 --- a/src/main/java/fr/inra/oresing/rest/binaryFile/BinaryFileService.java +++ b/src/main/java/fr/inra/oresing/rest/binaryFile/BinaryFileService.java @@ -11,15 +11,16 @@ import fr.inra.oresing.domain.data.deposit.validation.DefaultValidationCheckResu import fr.inra.oresing.domain.exceptions.ReportErrors; import fr.inra.oresing.domain.exceptions.data.data.BadBinaryFileDatasetQuery; import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.domain.repository.file.BinaryFileRepository; import fr.inra.oresing.persistence.*; +import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import fr.inra.oresing.rest.OreSiApiRequestContext; import fr.inra.oresing.rest.model.additionalfiles.AdditionalBinaryFileResult; import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; import fr.inra.oresing.rest.services.ServiceContainer; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -102,7 +103,9 @@ public class BinaryFileService implements fr.inra.oresing.domain.services.file.B public Optional<UUID> removeFile(Application application, UUID id) { Function<BinaryFile, UUID> deleteBinaryFile = binaryFile -> getBinaryFileRepository(application).delete(binaryFile.getId()) ? binaryFile.getId() : null; return getFile(application.getName(), id) - .map(deleteBinaryFile); + .map(BinaryFile::getId) + .map(getBinaryFileRepository(application)::delete) + .orElse(false)?Optional.of(id):Optional.empty(); } @Override @@ -143,9 +146,11 @@ public class BinaryFileService implements fr.inra.oresing.domain.services.file.B } @Override - public List<BinaryFile> getFilesOnRepository(final String nameOrId, final String datatype, final BinaryFileDataset fileDatasetID, final boolean overlap) { + public List<BinaryFile> getFilesOnRepository(final String nameOrId, final String datatype, final BinaryFileDataset binaryFileDataset, final boolean overlap) { authenticationService.setRoleForClient(); - return getBinaryFileRepository(nameOrId).findByBinaryFileDataset(datatype, fileDatasetID, overlap); + Application application= serviceContainer.applicationService().getApplication(nameOrId); + DataRepositoryForBuffer dataRepositoryForBuffer = serviceContainer.dataService().getDataRepositoryWithBuffer(application); + return getBinaryFileRepository(nameOrId).findByBinaryFileDataset(datatype, binaryFileDataset.testrequiredAuthorizationsAndReturnHierarchicalKeys(dataRepositoryForBuffer), overlap); } @Override diff --git a/src/main/java/fr/inra/oresing/rest/data/DataService.java b/src/main/java/fr/inra/oresing/rest/data/DataService.java index 500b584..e81dfec 100644 --- a/src/main/java/fr/inra/oresing/rest/data/DataService.java +++ b/src/main/java/fr/inra/oresing/rest/data/DataService.java @@ -11,7 +11,7 @@ import fr.inra.oresing.domain.application.Application; import fr.inra.oresing.domain.application.configuration.*; import fr.inra.oresing.domain.application.configuration.checker.CheckerDescription; import fr.inra.oresing.domain.application.configuration.internationalization.InternationalizationTitle; -import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationReader; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationDataReader; import fr.inra.oresing.domain.checker.CheckerFactory; import fr.inra.oresing.domain.checker.InvalidDatasetContentException; import fr.inra.oresing.domain.checker.LineChecker; @@ -30,6 +30,7 @@ import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException; import fr.inra.oresing.domain.filesenderclient.FileSenderInternationalisation; import fr.inra.oresing.domain.filesenderclient.FileSenderInternationalisationForBuildBundleReport; import fr.inra.oresing.domain.filesenderclient.FileSenderInternationalisationForDownloadDatasetQuery; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.data.read.bundle.FileContent; import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; import fr.inra.oresing.domain.file.DataFile; @@ -61,9 +62,7 @@ import reactor.core.publisher.Mono; import java.io.*; import java.net.URL; import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; -import java.nio.file.attribute.PosixFilePermission; import java.util.*; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; @@ -553,7 +552,7 @@ public class DataService implements ServiceContainerBean { .withDownloadDatasetQuery(downloadDatasetQuery) .withReferenceService(this) .withOutputStream(outputStream) - .onRepositories(new DataRepositoryWithBuffer(application, dataRepository), null) + .onRepositories(getDataRepositoryWithBuffer(application), null) .addDatas(datas) .buildDataCsv(downloadDatasetQuery.getLanguage(), dataDescription, downloadDatasetQuery.horizontalDisplay()); } @@ -587,6 +586,10 @@ public class DataService implements ServiceContainerBean { this.serviceContainer = serviceContainer; } + public DataRepositoryForBuffer getDataRepositoryWithBuffer(Application application) { + return new DataRepositoryWithBuffer(application, dataRepository); + } + private record BuildColumns(PatternColumnFactory patternColumnFactory, ImmutableSet<Column> columns) { } @@ -620,7 +623,7 @@ public class DataService implements ServiceContainerBean { DownloadDatasetQuery downloadDatasetQuery) { Application application = downloadDatasetQuery.application(); DataRepository dataRepository = repository.getRepository(downloadDatasetQuery.application()).data(); - DataRepositoryWithBuffer dataRepositoryWithBuffer = new DataRepositoryWithBuffer(application, dataRepository); + DataRepositoryForBuffer dataRepositoryWithBuffer = getDataRepositoryWithBuffer(application); serviceContainer.authenticationService().setRoleForClient(); @@ -698,7 +701,7 @@ public class DataService implements ServiceContainerBean { public UUIDsfromData addDatacsv( final ZipOutputStream zipOutputStream, - DataRepositoryWithBuffer dataRepositoryWithBuffer, + DataRepositoryForBuffer dataRepositoryWithBuffer, final DownloadDatasetQuery downloadDatasetQuery, String fileNamePattern) { final Flux<DataRow> datas = serviceContainer.dataService().findDataFlux(downloadDatasetQuery); @@ -719,7 +722,7 @@ public class DataService implements ServiceContainerBean { } public List<DataRow> findData(final DownloadDatasetQuery downloadDatasetQuery) { - ApplicationReader applicationReader = serviceContainer.authorizationService() + ApplicationDataReader applicationReader = serviceContainer.authorizationService() .getPrivilegeAssessorForApplication(DATA_READ, downloadDatasetQuery.application()) .forDataRead(downloadDatasetQuery.dataName()); return serviceContainer.dataService().findDataFlux(downloadDatasetQuery).collectList().block(); @@ -1030,10 +1033,6 @@ public class DataService implements ServiceContainerBean { return repository.getRepository(application).data().delete(downloadDatasetQuery); } - public DataRepositoryWithBuffer getNewDataRepositoryWithBuffer(Application application) { - return new DataRepositoryWithBuffer(application, repository.getRepository(application).data()); - } - public Map<Ltree, List<DataValue>> getReferenceDisplaysById(final Application application, final Set<String> listOfDataIds) { return repository.getRepository(application).data().getReferenceDisplaysById(listOfDataIds); } diff --git a/src/main/java/fr/inra/oresing/rest/data/VersioningService.java b/src/main/java/fr/inra/oresing/rest/data/VersioningService.java index 1fc5d2c..5fa6100 100644 --- a/src/main/java/fr/inra/oresing/rest/data/VersioningService.java +++ b/src/main/java/fr/inra/oresing/rest/data/VersioningService.java @@ -1,13 +1,18 @@ package fr.inra.oresing.rest.data; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; import fr.inra.oresing.domain.BinaryFile; import fr.inra.oresing.domain.BinaryFileDataset; import fr.inra.oresing.domain.application.Application; -import fr.inra.oresing.domain.application.configuration.Ltree; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationDataWriter; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.PrivilegeApplicationDomain; import fr.inra.oresing.domain.exceptions.ReportErrors; +import fr.inra.oresing.domain.exceptions.binaryfile.binaryfile.BadFileOrUUIDQuery; import fr.inra.oresing.domain.file.DataFile; import fr.inra.oresing.domain.file.FileOrUUID; import fr.inra.oresing.domain.repository.data.DataRepository; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.domain.repository.file.BinaryFileRepository; import fr.inra.oresing.persistence.*; import fr.inra.oresing.rest.data.publication.*; @@ -16,7 +21,6 @@ import fr.inra.oresing.rest.services.ServiceContainer; import fr.inra.oresing.rest.services.ServiceContainerBean; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -24,6 +28,7 @@ import org.springframework.web.multipart.MultipartFile; import java.io.IOException; import java.util.*; import java.util.function.Function; +import java.util.function.Predicate; @Slf4j @Component @@ -41,25 +46,32 @@ public class VersioningService implements ServiceContainerBean { @Transactional public DataVersioningResult createData(String nameOrId, String dataName, MultipartFile file, String params) throws IOException { Application application = serviceContainer.applicationService().getApplication(nameOrId); + String fileName = file == null ? null : file.getOriginalFilename(); + Optional<FileOrUUID> fileOrUUIDOpt = Optional.ofNullable(params) + .filter(Objects::nonNull) + .filter(Predicate.not("undefined"::equals)) + .map(json -> { + try { + return new ObjectMapper().readValue(params, FileOrUUID.class); + } catch (JsonProcessingException e) { + throw new BadFileOrUUIDQuery(e.getMessage()); + } + }); + Boolean toPublish = fileOrUUIDOpt + .map(FileOrUUID::topublish) + .orElse(false); + ApplicationDataWriter applicationDataWriter = serviceContainer.authorizationService().getPrivilegeAssessorForApplication(PrivilegeApplicationDomain.DATA_WRITE, application) + .forDataWrite(dataName, toPublish); Set<BinaryFile> filesToStore = new HashSet<>(); - State state = getStoreFile(application, dataName, params, file == null ? null : file.getOriginalFilename()) + DataRepositoryForBuffer dataRepositoryWithBuffer = serviceContainer.dataService().getDataRepositoryWithBuffer(application); + State state = getStoreFile(application, dataName, fileOrUUIDOpt.orElse(null), fileName, applicationDataWriter) .loadOrCreateFile(file, binaryFileRepository(application), serviceContainer.binaryFileService()); if (state instanceof UnPublishedVersions unPublishedVersions) { FileOrUUID fileOrUUID = unPublishedVersions .unPublishVersions(filesToStore, dataRepository(application), binaryFileRepository(application), serviceContainer.synthesisService()) - .checkPublicationRights(filesToStore, dataRepository(application), serviceContainer.binaryFileService(), binaryFileRepository(application)); + .checkAndStoreFile(filesToStore, serviceContainer.binaryFileService(), binaryFileRepository(application)); - UUID dataId; - if (fileOrUUID.topublish()) { - dataId = serviceContainer.dataService().addData(application, dataName, new DataFile(fileOrUUID, state.binaryFile().getFileData())); - } else { - dataId = state.binaryFile().getId(); - } - if (dataId != null && state.isRepository()) { - BinaryFile binaryFile = state.binaryFile(); - binaryFile.markAsPublished(fileOrUUID.topublish()); - dataId = binaryFileRepository(application).store(binaryFile); - } + UUID dataId = publishData(dataName, fileOrUUID, application, state); final List<ApplicationResult.DataSynthesis> dataSynthesis = Optional.ofNullable(serviceContainer.dataService().getReferenceSynthesis(application)).orElseGet(List::of); return DataVersioningResult.of(nameOrId, dataName, dataId, dataSynthesis); } @@ -68,21 +80,41 @@ public class VersioningService implements ServiceContainerBean { } + private UUID publishData(String dataName, FileOrUUID fileOrUUID, Application application, State state) throws IOException { + UUID dataId; + if (fileOrUUID.topublish()) { + dataId = serviceContainer.dataService().addData(application, dataName, new DataFile(fileOrUUID, state.binaryFile().getFileData())); + } else { + dataId = state.binaryFile().getId(); + } + if (dataId != null && state.isRepository()) { + BinaryFile binaryFile = state.binaryFile(); + binaryFile.markAsPublished(fileOrUUID.topublish()); + dataId = binaryFileRepository(application).store(binaryFile); + } + return dataId; + } + - public StoreFile getStoreFile(Application application, String dataName, String params, String fileName) { + public StoreFile getStoreFile( + Application application, + String dataName, + FileOrUUID fileOrUUID, + String fileName, + ApplicationDataWriter applicationDataWriter) { + DataRepositoryForBuffer dataRepositoryWithBuffer = serviceContainer.dataService().getDataRepositoryWithBuffer(application); ReportErrors errors = new ReportErrors(jsonRowMapper); - Function<Map<String, List<Ltree>>, Map<String, List<Ltree>>> requiredAuthorizationResolver = ra -> dataRepository(application).resolveRequiredAuthorizations(ra); Function<UUID, Optional<BinaryFile>> resolveFileById = uuid -> binaryFileRepository(application).tryFindById(uuid); return AuthorizationPublicationServiceBuilder.BUILDER( errors, application, dataName, fileName, - params, - requiredAuthorizationResolver, + fileOrUUID, + applicationDataWriter, resolveFileById ) - .buildAuthorizationForUserService(userRepository, serviceContainer.authorizationService()); + .testAndBuild(dataRepositoryWithBuffer); } @Transactional diff --git a/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvBuilder.java b/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvBuilder.java index 04f5b27..20ced96 100644 --- a/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvBuilder.java +++ b/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvBuilder.java @@ -11,8 +11,8 @@ import fr.inra.oresing.domain.checker.type.*; import fr.inra.oresing.domain.data.UUIDsfromData; import fr.inra.oresing.domain.data.deposit.context.DataImporterContext; import fr.inra.oresing.domain.data.read.query.*; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.*; -import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import fr.inra.oresing.rest.data.DataService; import org.apache.commons.csv.CSVFormat; import org.slf4j.Logger; @@ -36,7 +36,7 @@ public class DataCsvBuilder { private static final Logger log = LoggerFactory.getLogger(DataCsvBuilder.class); private DownloadDatasetQuery downloadDatasetQuery; - private DataRepositoryWithBuffer dataRepositoryWithBuffer; + private DataRepositoryForBuffer dataRepositoryForBuffer; private Flux<DataRow> datas; private OutputStream outputStream; @@ -86,8 +86,8 @@ public class DataCsvBuilder { return this; } - public DataCsvBuilder onRepositories(DataRepositoryWithBuffer DataRepositoryWithBuffer, AdditionalFileRepository additionalFileRepository) { - this.dataRepositoryWithBuffer = DataRepositoryWithBuffer; + public DataCsvBuilder onRepositories(DataRepositoryForBuffer DataRepositoryWithBuffer, AdditionalFileRepository additionalFileRepository) { + this.dataRepositoryForBuffer = DataRepositoryWithBuffer; return this; } @@ -183,12 +183,12 @@ public class DataCsvBuilder { writer, comparator, getInternationalizedHeader, - dataRepositoryWithBuffer, + dataRepositoryForBuffer, dataDescription, internationalizedSortedColumns, horizontalDisplay ); - DataCsvRowBuilder dataCsvRowBuilder = new DataCsvRowBuilder(language, dataRepositoryWithBuffer, dataDescription, horizontalDisplay); + DataCsvRowBuilder dataCsvRowBuilder = new DataCsvRowBuilder(language, dataRepositoryForBuffer, dataDescription, horizontalDisplay); datas .map(dataCsvHeaderWriter::writeHeader) .map(dataRow -> addRefsLinkedTo(dataRow, uuiDsfromData)) diff --git a/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvHeaderWriter.java b/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvHeaderWriter.java index eae09b3..58672f5 100644 --- a/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvHeaderWriter.java +++ b/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvHeaderWriter.java @@ -5,6 +5,7 @@ import fr.inra.oresing.domain.application.configuration.*; import fr.inra.oresing.domain.data.DataColumn; import fr.inra.oresing.domain.data.deposit.context.column.Column; import fr.inra.oresing.domain.data.read.query.*; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.DataRepository; import fr.inra.oresing.persistence.DataRow; import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; @@ -19,7 +20,7 @@ public record DataCsvHeaderWriter( CSVWriter writer, Comparator<ComponentOrderByForExport> comparator, Function<String, String> getInternationalizedHeader, - DataRepositoryWithBuffer dataRepositoryWithBuffer, + DataRepositoryForBuffer dataRepositoryWithBuffer, List<ComponentOrderByForExport> orderedColumns, StandardDataDescription dataDescription, Map<String, Configuration.InternationalizedSortedColumn> internationalizedSortedColumns, @@ -28,7 +29,7 @@ public record DataCsvHeaderWriter( CSVWriter writer, Comparator<ComponentOrderByForExport> comparator, Function<String, String> getInternationalizedHeader, - DataRepositoryWithBuffer dataRepositoryWithBuffer, + DataRepositoryForBuffer dataRepositoryWithBuffer, StandardDataDescription dataDescription, Map<String, Configuration.InternationalizedSortedColumn> internationalizedSortedColumns, boolean horizontalDisplay) { @@ -188,7 +189,8 @@ public record DataCsvHeaderWriter( String referenceName = dynamicComponent.reference(); String referenceColumnToLookForHeader = dynamicComponent.referenceColumnToLookForHeader(); ComponentType typeForComponentKey = dataDescription().getTypeForComponentKey(componentKey); - Map<String, ComponentOrderBy> dynamicColumns = dataRepositoryWithBuffer().repository().findAllByReferenceTypeStream(referenceName) + Map<String, ComponentOrderBy> dynamicColumns = dataRepositoryWithBuffer() + .findAllByReferenceTypeStream(referenceName) .sorted(Comparator.comparing(dataValue -> dataValue.getNaturalKey().getSql())) .collect(Collectors.toMap( dataValue -> dataValue.getNaturalKey().getSql(), diff --git a/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvRowBuilder.java b/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvRowBuilder.java index f32ec78..e37f542 100644 --- a/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvRowBuilder.java +++ b/src/main/java/fr/inra/oresing/rest/data/extraction/DataCsvRowBuilder.java @@ -3,6 +3,7 @@ package fr.inra.oresing.rest.data.extraction; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.checker.type.FieldType; import fr.inra.oresing.domain.data.read.query.*; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import java.util.List; @@ -12,7 +13,7 @@ import java.util.stream.Stream; public record DataCsvRowBuilder( String language, - DataRepositoryWithBuffer dataRepositoryWithBuffer, + DataRepositoryForBuffer dataRepositoryWithBuffer, StandardDataDescription dataDescription, boolean horizontalDisplay) { public List<String> getCsvRow(Map<String, FieldType> dataRowValues, diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUser.java b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUser.java index 0f1d91c..1f26fb5 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUser.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUser.java @@ -25,7 +25,7 @@ public record AuthorizationForUser( AuthorizationsResult authorizationsForUserOrPublic, AuthorizationPublicationService builder) implements State { - protected static Boolean hasRight( + /*protected static Boolean hasRight( final Authorization authorization, final List<AuthorizationParsed> auths) { return auths.stream() @@ -100,7 +100,7 @@ public record AuthorizationForUser( protected boolean requiredAuthorizationMatchForFile( final Map<String, Set<String>> requiredAuthorizationInDataBase) { - Optional<Map<String, List<Ltree>>> requiredAuthorizationForFile = Optional.ofNullable(params()) + Optional<Map<String, List<Ltree>>> requiredAuthorizationForFile = Optional.ofNullable(fileOrUuid()) .map(FileOrUUID::binaryfiledataset) .map(BinaryFileDataset::getRequiredAuthorizations); if (requiredAuthorizationForFile.isPresent()) { @@ -140,5 +140,5 @@ public record AuthorizationForUser( public boolean isApplicationCreator() { return isApplicationCreator; - } + }*/ } \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUserBuilder.java b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUserBuilder.java deleted file mode 100644 index 020d805..0000000 --- a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationForUserBuilder.java +++ /dev/null @@ -1,166 +0,0 @@ -package fr.inra.oresing.rest.data.publication; - -import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException; -import fr.inra.oresing.domain.repository.authorization.OperationType; -import fr.inra.oresing.domain.repository.authorization.role.CurrentUserRoles; -import fr.inra.oresing.domain.repository.user.file.UserRepository; -import fr.inra.oresing.rest.services.AuthorizationService; -import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; -import fr.inra.oresing.rest.model.authorization.AuthorizationsResult; - -import java.util.Map; -import java.util.Set; - -public record AuthorizationForUserBuilder( - AuthorizationPublicationService builder -) implements State { - - public StoreFile buildAuthorizationForUserService( - UserRepository userRepository, - AuthorizationService authorizationService) { - CurrentUserRoles currentUserRoles = userRepository.getRolesForCurrentUser(); - boolean isUserManager = currentUserRoles.userManagerOf(application()); - builder().authorizationsForUser = authorizationService - .getAuthorizationsForUserAndPublic( - application().getName(), - currentUserRoles.userLogin() - ); - boolean isRepository = builder.isRepository(builder.application, builder.dataName); - builder().authorizations = - new AuthorizationForUser( - isUserManager, - isRepository, - canDeposit(isRepository, isUserManager), - canPublishOrUnPublish(isRepository, isUserManager), - canDelete(isRepository, isUserManager), - builder().authorizationsForUser, - builder() - ); - return new StoreFile(builder()); - - } - - private boolean canDeposit(boolean isRepository, boolean isApplicationCreator) { - try { - return hasRightForDeposit( - isRepository, - isApplicationCreator, - builder().authorizationsForUser - ); - } catch (SiOreIllegalArgumentException e) { - return false; - } - } - - private boolean canDelete(boolean isRepository, boolean isApplicationCreator) { - try { - return hasRightForDelete( - isRepository, - isApplicationCreator, - builder().authorizationsForUser - ); - } catch (SiOreIllegalArgumentException e) { - return false; - } - } - - private boolean canPublishOrUnPublish(boolean isRepository, boolean isApplicationCreator) { - try { - return hasRightForPublishOrUnPublish( - isRepository, - isApplicationCreator, - builder().authorizationsForUser, - builder().authorizationsForPublic - ); - } catch (SiOreIllegalArgumentException e) { - return false; - } - } - - private boolean canDoOperation( - boolean isRepository, - boolean isApplicationCreator, - AuthorizationsResult authorizationsForUserOrPublic, - OperationType operationType, - final String errorMessage) { - OperationType operationType1 = operationType; - SiOreIllegalArgumentException siOreIllegalArgumentException = new SiOreIllegalArgumentException(errorMessage, Map.of("dataName", dataName(), "application", application().getName())); - if (!isRepository && OperationType.depot == operationType1) { - operationType1 = OperationType.publication; - } - boolean hasRightForOperationType = hasRightForOperationType( - isApplicationCreator, - authorizationsForUserOrPublic, - operationType1 - ); - if (isRepository) { - if (hasRightForOperationType) { - return true; - } - throw siOreIllegalArgumentException; - } - final OperationType finalOperationType = operationType1; - if ( - isApplicationCreator - || (hasRightForOperationType && - testPredicateForOperationType(finalOperationType, this::testRequiredAuthorization))) { - return true; - } - throw siOreIllegalArgumentException; - } - - private boolean testRequiredAuthorization(AuthorizationParsed parsedAuhorization) { - Map<String, Set<String>> requiredAuthorizationsInDatabase = parsedAuhorization.requiredAuthorizations(); - if (requiredAuthorizationsInDatabase.isEmpty()) { - return true; - } else { - return params().requiredAuthorizationMatchForFile(requiredAuthorizationsInDatabase); - } - } - - private boolean hasRightForOperationType( - boolean isApplicationCreator, - AuthorizationsResult authorization, - final OperationType operationType) { - return isApplicationCreator - || testPredicateForOperationType(operationType, auth -> true); - } - - private boolean hasRightForDelete( - boolean isRepository, - boolean isApplicationCreator, - AuthorizationsResult authorizationsForUser) { - return canDoOperation( - isRepository, - isApplicationCreator, - authorizationsForUser, - OperationType.delete, - SiOreIllegalArgumentException.NO_RIGHT_ON_TABLE_FOR_DELETE); - } - - private boolean hasRightForPublishOrUnPublish( - boolean isRepository, - boolean isApplicationCreator, - AuthorizationsResult authorizationsForUser, - AuthorizationsResult authorizationsForPublic) { - return canDoOperation( - isRepository, - isApplicationCreator, - authorizationsForUser, - OperationType.publication, - SiOreIllegalArgumentException.NO_RIGHT_ON_TABLE_FOR_PUBLISH_OR_UNPUBLISH); - } - - private boolean hasRightForDeposit( - boolean isRepository, - boolean isApplicationCreator, - AuthorizationsResult authorizationsForUser) { - return canDoOperation( - isRepository, - isApplicationCreator, - authorizationsForUser, - OperationType.depot, - SiOreIllegalArgumentException.NO_RIGHT_ON_TABLE_FOR_DEPOSIT - ); - } -} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationService.java b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationService.java index 5cec505..aed43f7 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationService.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationService.java @@ -3,9 +3,11 @@ package fr.inra.oresing.rest.data.publication; import fr.inra.oresing.domain.BinaryFile; import fr.inra.oresing.domain.BinaryFileDataset; import fr.inra.oresing.domain.application.Application; +import fr.inra.oresing.domain.application.configuration.Ltree; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.application.configuration.Submission; import fr.inra.oresing.domain.application.configuration.SubmissionType; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationDataWriter; import fr.inra.oresing.domain.exceptions.ReportErrors; import fr.inra.oresing.domain.file.FileOrUUID; import fr.inra.oresing.domain.repository.data.DataRepository; @@ -14,6 +16,7 @@ import fr.inra.oresing.domain.services.synthesis.SynthesisService; import fr.inra.oresing.persistence.BinaryFileInfos; import fr.inra.oresing.rest.model.authorization.AuthorizationsResult; +import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; @@ -26,30 +29,33 @@ public class AuthorizationPublicationService { protected final StandardDataDescription dataDescription; protected final Application application; + protected final String dataName; + protected FileOrUUID fileOrUUID; + protected ApplicationDataWriter applicationDataWriter; + public String getDataName() { return this.dataName; } - - protected final String dataName; - protected AuthorizationsResult authorizationsForPublic; - protected AuthorizationsResult authorizationsForUser; - protected FileOrUUID params; - - public AuthorizationForUser getAuthorizations() { - return this.authorizations; + public ApplicationDataWriter applicationDataWriter() { + return this.applicationDataWriter; } - protected AuthorizationForUser authorizations; - protected AuthorizationPublicationService(ReportErrors errors, final Application application, final String dataName, FileOrUUID params) { + protected AuthorizationPublicationService( + ReportErrors errors, + final Application application, + final String dataName, + FileOrUUID fileOrUUID, + ApplicationDataWriter applicationDataWriter) { this.errors = errors; this.application = application; - this.dataName = dataName!=null?dataName:Optional.ofNullable(params).map(FileOrUUID::binaryfiledataset).map(BinaryFileDataset::getDatatype).orElse(null); - this.params = buildParams(params); + this.dataName = dataName != null ? dataName : Optional.ofNullable(fileOrUUID).map(FileOrUUID::binaryfiledataset).map(BinaryFileDataset::getDatatype).orElse(null); + this.fileOrUUID = setFileOrUUID(fileOrUUID); this.dataDescription = buildDataDescription(application); + this.applicationDataWriter = applicationDataWriter; } - public FileOrUUID getParams() { - return this.params; + public FileOrUUID getFileOrUUID() { + return this.fileOrUUID; } protected StandardDataDescription buildDataDescription(Application application) { @@ -57,14 +63,14 @@ public class AuthorizationPublicationService { .orElseThrow(() -> new IllegalArgumentException("dataName Can't be null")); } - protected FileOrUUID buildParams(FileOrUUID params) { - Optional.ofNullable(params) + protected FileOrUUID setFileOrUUID(FileOrUUID fileOrUUIDLocal) { + Optional.ofNullable(fileOrUUIDLocal) .map(par -> par.binaryfiledataset() != null ? - params.binaryfiledataset() : + fileOrUUIDLocal.binaryfiledataset() : BinaryFileDataset.EMPTY_INSTANCE() ) .ifPresent(binaryFileDataset -> binaryFileDataset.setDatatype(dataName)); - return params; + return fileOrUUIDLocal; } @@ -79,8 +85,8 @@ public class AuthorizationPublicationService { } protected BinaryFile getPublishedVersion(BinaryFileRepository binaryFileRepository) { - assert params.binaryfiledataset() != null; - return binaryFileRepository.findPublishedVersions(params.binaryfiledataset()).orElse(null); + assert fileOrUUID.binaryfiledataset() != null; + return binaryFileRepository.findPublishedVersions(fileOrUUID.binaryfiledataset()).orElse(null); } protected void unPublishVersions( @@ -101,33 +107,9 @@ public class AuthorizationPublicationService { } } - boolean hasRightForPublishOrUnPublish() { - return authorizations.hasRightForPublishOrUnPublish(); - } - - boolean hasRightForDeposit() { - return authorizations.hasRightForDeposit(); - } - - boolean isApplicationCreator() { - return authorizations.isApplicationCreator(); - } - - boolean isRepository() { - return authorizations.isRepository(); - } - - boolean canDeposit() { - return authorizations.canDeposit(); - } - - AuthorizationsResult authorizationsForUser() { - return authorizations == null ? authorizationsForUser : authorizations.authorizationsForUserOrPublic(); - } - boolean fileMustBeJustStored() { boolean existsFileToPublish = Optional.ofNullable(binaryFile).map(BinaryFile::getId).isPresent(); - Boolean publishIsAsked = Optional.ofNullable(params).map(FileOrUUID::topublish).orElse(false); + Boolean publishIsAsked = Optional.ofNullable(fileOrUUID).map(FileOrUUID::topublish).orElse(false); Boolean unPublishIsAsked = !publishIsAsked && Optional.ofNullable(binaryFile).map(BinaryFile::getParams).map(BinaryFileInfos::published).orElse(false); return isRepository() && @@ -137,7 +119,13 @@ public class AuthorizationPublicationService { ); } + protected boolean isRepository() { + return application.findSubmission(dataName) + .map(Submission::strategy) + .stream().anyMatch(SubmissionType.OA_VERSIONING::equals); + } + boolean fileMustBePublished() { - return !isRepository() || Optional.ofNullable(params).map(FileOrUUID::topublish).orElse(false); + return !isRepository() || Optional.ofNullable(fileOrUUID).map(FileOrUUID::topublish).orElse(false); } } \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationServiceBuilder.java b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationServiceBuilder.java index 6774e5b..45840b0 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationServiceBuilder.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/AuthorizationPublicationServiceBuilder.java @@ -1,36 +1,33 @@ package fr.inra.oresing.rest.data.publication; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.google.common.base.Strings; import fr.inra.oresing.domain.BinaryFile; import fr.inra.oresing.domain.BinaryFileDataset; import fr.inra.oresing.domain.application.Application; -import fr.inra.oresing.domain.application.configuration.Ltree; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.application.configuration.Submission; +import fr.inra.oresing.domain.authorization.privilegeassessor.role.ApplicationDataWriter; import fr.inra.oresing.domain.exceptions.ReportErrors; -import fr.inra.oresing.domain.exceptions.binaryfile.binaryfile.BadFileOrUUIDQuery; import fr.inra.oresing.domain.file.FileOrUUID; -import java.io.IOException; import java.util.*; import java.util.function.Function; import java.util.function.Predicate; public class AuthorizationPublicationServiceBuilder { - public static AuthorizationForUserBuilder BUILDER(ReportErrors errors, - final Application application, - final String dataName, - String fileName, - String params, - Function<Map<String, List<Ltree>>, Map<String, List<Ltree>>> requiredAuthorizationResolver, - Function<UUID, Optional<BinaryFile>> resolveFileById) { + public static StoredFileBuilder BUILDER(ReportErrors errors, + final Application application, + final String dataName, + String fileName, + FileOrUUID fileOrUUID, + ApplicationDataWriter applicationDataWriter, + Function<UUID, Optional<BinaryFile>> resolveFileById) { AuthorizationPublicationService builder = new AuthorizationPublicationService( errors, application, dataName, - deserialiseFileOrUUIDQuery(dataName, params, resolveFileById)); + deserialiseFileOrUUIDQuery(dataName, fileOrUUID, resolveFileById), + applicationDataWriter); boolean hasSubmissionScope = application.findData(dataName) .map(StandardDataDescription::submission) .map(Submission::submissionScope) @@ -38,53 +35,49 @@ public class AuthorizationPublicationServiceBuilder { .map(List::size) .orElse(-1) > 0; boolean hasNoFileId = Optional.of(builder) - .map(AuthorizationPublicationService::getParams) - .map(fileOrUUID -> true) + .map(AuthorizationPublicationService::getFileOrUUID) .isEmpty(); if (hasNoFileId && hasSubmissionScope) { return new FileNameResolver(builder) - .resolveFileName(fileName) - .resolveParams(requiredAuthorizationResolver); + .resolveFileName(fileName); } - return new AuthorizationForUserBuilder(builder); + return new StoredFileBuilder(builder); } - private static FileOrUUID deserialiseFileOrUUIDQuery(final String datatype, final String params, Function<UUID, Optional<BinaryFile>> resolveFileById) { - if (Strings.isNullOrEmpty(params) || "undefined".equals(params)) { + private static FileOrUUID deserialiseFileOrUUIDQuery( + final String datatype, + final FileOrUUID fileOrUUID, + Function<UUID, Optional<BinaryFile>> resolveFileById) { + if (fileOrUUID==null) { return null; } - try { - final FileOrUUID fileOrUUID = new ObjectMapper().readValue(params, FileOrUUID.class); - Optional.ofNullable(fileOrUUID) - .map(FileOrUUID::binaryfiledataset) - .ifPresent(binaryFileDataset -> { - String resolvedDatatype = Optional.of(binaryFileDataset) - .map(BinaryFileDataset::getDatatype) - .filter(Predicate.not(String::isBlank)) - .orElse(datatype); - binaryFileDataset.setDatatype(resolvedDatatype); - }); - boolean isNotDefinedDatatype = Optional.ofNullable(fileOrUUID) - .map(FileOrUUID::binaryfiledataset) - .map(BinaryFileDataset::getDatatype).isEmpty(); - if(isNotDefinedDatatype) { - Optional<UUID> uuid = Optional.ofNullable(fileOrUUID) - .map(FileOrUUID::fileid); - if(uuid.isEmpty()) { - return fileOrUUID; - } - return uuid - .map(resolveFileById) - .filter(Optional::isPresent) - .map(Optional::get) - .map(BinaryFile::getParams) - .map(fileOrUUID::withParams) - .orElseThrow(IllegalArgumentException::new); + Optional.ofNullable(fileOrUUID) + .map(FileOrUUID::binaryfiledataset) + .ifPresent(binaryFileDataset -> { + String resolvedDatatype = Optional.of(binaryFileDataset) + .map(BinaryFileDataset::getDatatype) + .filter(Predicate.not(String::isBlank)) + .orElse(datatype); + binaryFileDataset.setDatatype(resolvedDatatype); + }); + boolean isNotDefinedDatatype = Optional.ofNullable(fileOrUUID) + .map(FileOrUUID::binaryfiledataset) + .map(BinaryFileDataset::getDatatype).isEmpty(); + if(isNotDefinedDatatype) { + Optional<UUID> uuid = Optional.ofNullable(fileOrUUID) + .map(FileOrUUID::fileid); + if(uuid.isEmpty()) { + return fileOrUUID; } - return fileOrUUID; - } catch (final IOException e) { - throw new BadFileOrUUIDQuery(e.getMessage()); + return uuid + .map(resolveFileById) + .filter(Optional::isPresent) + .map(Optional::get) + .map(BinaryFile::getParams) + .map(fileOrUUID::withParams) + .orElseThrow(IllegalArgumentException::new); } + return fileOrUUID; } } diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/CheckRights.java b/src/main/java/fr/inra/oresing/rest/data/publication/CheckAndStoreFile.java similarity index 58% rename from src/main/java/fr/inra/oresing/rest/data/publication/CheckRights.java rename to src/main/java/fr/inra/oresing/rest/data/publication/CheckAndStoreFile.java index 5c8688c..b7a5de3 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/CheckRights.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/CheckAndStoreFile.java @@ -2,43 +2,33 @@ package fr.inra.oresing.rest.data.publication; import com.google.common.base.Preconditions; import fr.inra.oresing.domain.BinaryFile; -import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.checker.InvalidDatasetContentException; import fr.inra.oresing.domain.file.FileOrUUID; -import fr.inra.oresing.domain.repository.data.DataRepository; import fr.inra.oresing.domain.repository.file.BinaryFileRepository; import fr.inra.oresing.domain.services.file.BinaryFileService; import java.util.Set; import java.util.UUID; -public record CheckRights( +public record CheckAndStoreFile( AuthorizationPublicationService builder) implements State { - public FileOrUUID checkPublicationRights( + public FileOrUUID checkAndStoreFile( Set<BinaryFile> filesToStore, - DataRepository dataRepository, BinaryFileService binaryFileService, BinaryFileRepository binaryFileRepository) { - if (!builder().isRepository() || params().topublish()) { - - StandardDataDescription dataDescription = application().findData(builder().dataName) - .orElseThrow(() -> new IllegalArgumentException( - "no dataDescription for %s".formatted(builder().dataName))); + if (!builder().isRepository() || fileOrUuid().topublish()) { InvalidDatasetContentException.checkErrorsIsEmpty(binaryFileService.findPublishedVersion( application().getName(), dataName(), - params(), + fileOrUuid(), filesToStore, true)); - assert builder().hasRightForPublishOrUnPublish(); - - - Preconditions.checkArgument(binaryFile() != null || (params() != null && params().fileid() != null), "le fichier ou params.fileid est requis"); + Preconditions.checkArgument(binaryFile() != null || (fileOrUuid() != null && fileOrUuid().fileid() != null), "le fichier ou params.fileid est requis"); Preconditions.checkArgument(!(binaryFile().getFileData().length == 0), "le CSV téléversé pour le référentiel " + dataName() + " est vide"); UUID fileId = binaryFileRepository.store(binaryFile()); - return FileOrUUID.from(params(), fileId); + return FileOrUUID.from(fileOrUuid(), fileId); } else { - return FileOrUUID.from(params(), null); + return FileOrUUID.from(fileOrUuid(), null); } } diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/FileNameResolver.java b/src/main/java/fr/inra/oresing/rest/data/publication/FileNameResolver.java index a7ab777..be8af90 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/FileNameResolver.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/FileNameResolver.java @@ -9,21 +9,20 @@ import java.util.Optional; public record FileNameResolver( AuthorizationPublicationService builder) implements State { - public ParamsResolver resolveFileName(String fileName){ - BinaryFileDataset binaryFileDataset = params() == null ? new BinaryFileDataset() : params().binaryfiledataset(); + public StoredFileBuilder resolveFileName(String fileName){ + BinaryFileDataset binaryFileDataset = fileOrUuid() == null ? new BinaryFileDataset() : fileOrUuid().binaryfiledataset(); BinaryFileDataset resolvedBinaryFileDataset = Optional.ofNullable(dataDescription()) .map(StandardDataDescription::submission) .map(submission -> submission.parseFileName( fileName, binaryFileDataset)) .orElse(binaryFileDataset); - FileOrUUID params = builder.params; + FileOrUUID params = builder.fileOrUUID; if(params != null){ - builder.params = params.withParams(new BinaryFileInfos(resolvedBinaryFileDataset)); + builder.fileOrUUID = params.withParams(new BinaryFileInfos(resolvedBinaryFileDataset)); }else{ - builder.params = new FileOrUUID(null, resolvedBinaryFileDataset, true); + builder.fileOrUUID = new FileOrUUID(null, resolvedBinaryFileDataset, true); } - return new ParamsResolver - (builder()); + return new StoredFileBuilder(builder()); } } diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/ParamsResolver.java b/src/main/java/fr/inra/oresing/rest/data/publication/ParamsResolver.java deleted file mode 100644 index aeccc7d..0000000 --- a/src/main/java/fr/inra/oresing/rest/data/publication/ParamsResolver.java +++ /dev/null @@ -1,42 +0,0 @@ -package fr.inra.oresing.rest.data.publication; - -import fr.inra.oresing.domain.BinaryFileDataset; -import fr.inra.oresing.domain.application.configuration.Ltree; -import fr.inra.oresing.domain.exceptions.authorization.AuthorizationRequestException; -import fr.inra.oresing.domain.exceptions.authorization.SiOreAuthorizationRequestException; -import fr.inra.oresing.domain.file.FileOrUUID; -import org.apache.commons.collections4.MapUtils; - -import java.util.*; -import java.util.function.Function; -import java.util.stream.Collectors; - -public record ParamsResolver(AuthorizationPublicationService builder) implements State { - - public AuthorizationForUserBuilder resolveParams( - Function<Map<String, List<Ltree>>, Map<String, List<Ltree>>> requiredAuthorizationResolver - ) { - Map<String, List<Ltree>> resolvedRequiredAuthorizations = Optional.ofNullable(params()) - .map(FileOrUUID::binaryfiledataset) - .map(BinaryFileDataset::getRequiredAuthorizations) - .map(requiredAuthorizationResolver) - .orElse(null); - Map<String, List<Ltree>> requiredAuthorizations = params() - .binaryfiledataset() - .getRequiredAuthorizations(); - Map<String, List<Ltree>> missingRequiredAuthorizations = requiredAuthorizations.keySet().stream() - .filter(ref -> Objects.requireNonNull(resolvedRequiredAuthorizations).get(ref) == null) - .map(ref-> new AbstractMap.SimpleEntry<>(ref, requiredAuthorizations.get(ref))) - .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); - if(MapUtils.isNotEmpty(missingRequiredAuthorizations)){ - throw new SiOreAuthorizationRequestException( - AuthorizationRequestException.MISSING_REQUIRED_AUTHORIZATION, - Map.of( - "missingRequiredAuthorizations", missingRequiredAuthorizations - ) - ); - } - //builder().getParams().binaryfiledataset().setRequiredAuthorizations(resolvedRequiredAuthorizations); - return new AuthorizationForUserBuilder(builder()); - } -} diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/State.java b/src/main/java/fr/inra/oresing/rest/data/publication/State.java index 6d0f708..f241eca 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/State.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/State.java @@ -4,14 +4,11 @@ import fr.inra.oresing.domain.BinaryFile; import fr.inra.oresing.domain.application.Application; import fr.inra.oresing.domain.application.configuration.StandardDataDescription; import fr.inra.oresing.domain.file.FileOrUUID; -import fr.inra.oresing.domain.repository.authorization.OperationType; import fr.inra.oresing.rest.model.authorization.AuthorizationParsed; -import fr.inra.oresing.rest.model.authorization.AuthorizationsResult; -import java.util.Optional; import java.util.function.Predicate; -sealed public interface State permits AuthorizationForUser, AuthorizationForUserBuilder, CheckRights, FileNameResolver, JustStoredFile, ParamsResolver, StoreFile, UnPublishedVersions { +sealed public interface State permits AuthorizationForUser, StoredFileBuilder, CheckAndStoreFile, FileNameResolver, JustStoredFile, StoreFile, UnPublishedVersions { Predicate<AuthorizationParsed> TRUE_PREDICATE = auth -> true; @@ -21,26 +18,14 @@ sealed public interface State permits AuthorizationForUser, AuthorizationForUser return builder().binaryFile; } - default boolean isApplicationCreator() { - return builder().isApplicationCreator(); - } - default boolean isRepository() { return builder().isRepository(); } - default Boolean canDeposit() { - return builder().canDeposit(); - } - default StandardDataDescription dataDescription() { return builder().dataDescription; } - default AuthorizationsResult authorizationsForUserAndPublic() { - return builder().authorizationsForUser(); - } - default Application application() { return builder().application; } @@ -49,22 +34,7 @@ sealed public interface State permits AuthorizationForUser, AuthorizationForUser return builder().dataName; } - default FileOrUUID params() { - return builder().params; - }default boolean testPredicateForOperationType(OperationType operationType, Predicate<AuthorizationParsed> predicate) { - // Check user authorizations - boolean userAuth = Optional.ofNullable(authorizationsForUserAndPublic().userAuthorization().get(dataName())) - .map(authList -> authList.stream() - .filter(auth -> auth.operationTypes().contains(operationType)) - .anyMatch(predicate)) - .orElse(false); - - // Check public authorization - boolean publicAuth = Optional.ofNullable(authorizationsForUserAndPublic().publicAuthorization().get(dataName())) - .filter(auth -> auth.operationTypes().contains(operationType)) - .map(predicate::test) - .orElse(false); - - return userAuth || publicAuth; + default FileOrUUID fileOrUuid() { + return builder().fileOrUUID; } } diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/StoreFile.java b/src/main/java/fr/inra/oresing/rest/data/publication/StoreFile.java index e34df85..606512d 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/StoreFile.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/StoreFile.java @@ -1,10 +1,13 @@ package fr.inra.oresing.rest.data.publication; import fr.inra.oresing.domain.BinaryFile; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterForDepositException; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterForPublishException; import fr.inra.oresing.domain.file.FileBomResolver; import fr.inra.oresing.domain.file.FileOrUUID; import fr.inra.oresing.domain.repository.file.BinaryFileRepository; import fr.inra.oresing.domain.services.file.BinaryFileService; +import fr.inra.oresing.rest.exceptions.OreSiIOException; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; @@ -17,38 +20,59 @@ public record StoreFile(AuthorizationPublicationService builder) implements Stat MultipartFile file, BinaryFileRepository binaryFileRepository, BinaryFileService binaryFileService - ) throws IOException { - byte[] bytes = file==null?null : FileBomResolver.of(file.getInputStream()).readAllBytes(); - assert builder().hasRightForDeposit(); + ) { - builder().binaryFile = Optional.ofNullable(params()).map(FileOrUUID::fileid) - .flatMap(binaryFileRepository::tryFindByIdWithData) - .orElseGet(() -> { - UUID fileId; - try { - fileId = binaryFileService - .storeFile( - application(), - file, - "", - Optional.ofNullable(params()).map(FileOrUUID::binaryfiledataset).orElse(null)); - } catch (IOException e) { - throw null; - } - BinaryFile binaryFile = binaryFileRepository.tryFindByIdWithData(fileId).orElse(null); - if (binaryFile == null) { - return null; - } - if (params() != null) { - binaryFile.withBinaryFileDataset(params().binaryfiledataset()); - } - binaryFile.setFileData(bytes); - binaryFileRepository.store(binaryFile); - return binaryFile; - }); - if(builder().fileMustBeJustStored()){ + try { + byte[] bytes = null; + bytes = file == null ? null : FileBomResolver.of(file.getInputStream()).readAllBytes(); + + byte[] finalBytes = bytes; + builder().binaryFile = Optional.ofNullable(fileOrUuid()).map(FileOrUUID::fileid) + .flatMap(binaryFileRepository::tryFindByIdWithData) + .orElseGet(() -> { + UUID fileId; + try { + fileId = binaryFileService + .storeFile( + application(), + file, + "", + Optional.ofNullable(fileOrUuid()).map(FileOrUUID::binaryfiledataset).orElse(null)); + } catch (IOException e) { + throw OreSiIOException.ORE_SI_IOEXCEPTION_CANT_LOAD_FILE(); + } + BinaryFile binaryFile = binaryFileRepository.tryFindByIdWithData(fileId).orElse(null); + if (binaryFile == null) { + return null; + } + if (fileOrUuid() != null) { + binaryFile.withBinaryFileDataset(fileOrUuid().binaryfiledataset()); + } + binaryFile.setFileData(finalBytes); + binaryFileRepository.store(binaryFile); + return binaryFile; + }); + if (builder().fileMustBeJustStored()) { return new JustStoredFile(builder()); } - return new UnPublishedVersions(builder()); + return new UnPublishedVersions(builder()); + } catch (IOException e) { + throw OreSiIOException.ORE_SI_IOEXCEPTION_CANT_LOAD_FILE(); + } + } + + public StoreFile testRights() { + boolean newFileOrUUID = Optional.ofNullable(fileOrUuid()).map(FileOrUUID::fileid).isEmpty(); + boolean publishing = Optional.ofNullable(fileOrUuid()).map(FileOrUUID::topublish).orElse(false) || + newFileOrUUID && !builder().isRepository(); + publishing = !application().isData(dataName()) || publishing ; + if (newFileOrUUID && !builder().applicationDataWriter().hasRightForDeposit(fileOrUuid())) { + throw new NotApplicationDataWriterForDepositException(application().getName(), dataName()); + } else { + if (publishing && !builder().applicationDataWriter().hasRightForPublishOrUnPublish(fileOrUuid())) { + throw new NotApplicationDataWriterForPublishException(application().getName(), dataName()); + } + } + return this; } } diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/StoredFileBuilder.java b/src/main/java/fr/inra/oresing/rest/data/publication/StoredFileBuilder.java new file mode 100644 index 0000000..d823840 --- /dev/null +++ b/src/main/java/fr/inra/oresing/rest/data/publication/StoredFileBuilder.java @@ -0,0 +1,28 @@ +package fr.inra.oresing.rest.data.publication; + +import fr.inra.oresing.domain.BinaryFileDataset; +import fr.inra.oresing.domain.application.configuration.Ltree; +import fr.inra.oresing.domain.file.FileOrUUID; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public record StoredFileBuilder( + AuthorizationPublicationService builder +) implements State { + + public StoreFile testAndBuild(DataRepositoryForBuffer dataRepositoryWithBuffer) { + Map<String, List<Ltree>> requiredAuthorization = Optional.ofNullable(builder()) + .map(AuthorizationPublicationService::getFileOrUUID) + .map(FileOrUUID::binaryfiledataset) + .map(binaryFileDataset -> binaryFileDataset.testrequiredAuthorizationsAndReturnHierarchicalKeys(dataRepositoryWithBuffer)) + .map(BinaryFileDataset::getRequiredAuthorizations) + .orElse(null); + if (requiredAuthorization != null) { + builder().fileOrUUID.binaryfiledataset().setRequiredAuthorizations(requiredAuthorization); + } + return new StoreFile(builder()).testRights(); + } +} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/rest/data/publication/UnPublishedVersions.java b/src/main/java/fr/inra/oresing/rest/data/publication/UnPublishedVersions.java index b46f803..324fa8d 100644 --- a/src/main/java/fr/inra/oresing/rest/data/publication/UnPublishedVersions.java +++ b/src/main/java/fr/inra/oresing/rest/data/publication/UnPublishedVersions.java @@ -9,29 +9,27 @@ import java.util.Set; public record UnPublishedVersions(AuthorizationPublicationService builder) implements State { - public CheckRights unPublishVersions( + public CheckAndStoreFile unPublishVersions( Set<BinaryFile> filesToStore, DataRepository dataRepository, BinaryFileRepository binaryFileRepository, SynthesisService synthesisService) { if (builder().isRepository()) { - if (params() != null && !params().topublish()) { + if (fileOrUuid() != null && !fileOrUuid().topublish()) { if (binaryFile().getParams() != null && binaryFile().getParams().published()) { binaryFile().markAsPublished(false); filesToStore.add(binaryFile()); - assert builder().hasRightForPublishOrUnPublish(); builder().unPublishVersions(filesToStore, dataRepository, binaryFileRepository, synthesisService); } - } else if (params() != null && params().binaryfiledataset() != null) { + } else if (fileOrUuid() != null && fileOrUuid().binaryfiledataset() != null) { BinaryFile publishedVersion = builder().getPublishedVersion(binaryFileRepository); if (publishedVersion != null && publishedVersion.getParams().published()) { filesToStore.add(publishedVersion); - assert builder().hasRightForPublishOrUnPublish(); builder().unPublishVersions(filesToStore, dataRepository, binaryFileRepository, synthesisService); } } } - return new CheckRights(builder()); + return new CheckAndStoreFile(builder()); } } diff --git a/src/main/java/fr/inra/oresing/rest/exceptions/OreSiIOException.java b/src/main/java/fr/inra/oresing/rest/exceptions/OreSiIOException.java new file mode 100644 index 0000000..23c25a0 --- /dev/null +++ b/src/main/java/fr/inra/oresing/rest/exceptions/OreSiIOException.java @@ -0,0 +1,14 @@ +package fr.inra.oresing.rest.exceptions; + +import fr.inra.oresing.OreSiException; +import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; + +public class OreSiIOException extends OreSiTechnicalException { + private static final String CANT_LOAD_FILE = "CANT_LOAD_FILE"; + public static OreSiIOException ORE_SI_IOEXCEPTION_CANT_LOAD_FILE() { + return new OreSiIOException(CANT_LOAD_FILE); + } + public OreSiIOException(String message) { + super(message); + } +} diff --git a/src/main/java/fr/inra/oresing/rest/model/authorization/GetGrantableResult.java b/src/main/java/fr/inra/oresing/rest/model/authorization/GetGrantableResult.java index ae159bb..1798c72 100644 --- a/src/main/java/fr/inra/oresing/rest/model/authorization/GetGrantableResult.java +++ b/src/main/java/fr/inra/oresing/rest/model/authorization/GetGrantableResult.java @@ -1,5 +1,6 @@ package fr.inra.oresing.rest.model.authorization; +import com.google.common.collect.ImmutableSortedSet; import fr.inra.oresing.domain.authorization.request.AuthorizationForScope; import fr.inra.oresing.domain.internationalization.Internationalization; import fr.inra.oresing.domain.data.AuthorizationColumnsDescription; @@ -11,7 +12,7 @@ import java.util.stream.Collectors; public record GetGrantableResult( - com.google.common.collect.ImmutableSortedSet<ApplicationUserResult> users, + ImmutableSortedSet<ApplicationUserResult> users, Map<String, List<ReferenceScope>> referenceScopes, Map<String, SortedMap<String, ColumnDescription>> columnsDescription, AuthorizationsResult authorizationsForUser, diff --git a/src/main/java/fr/inra/oresing/rest/model/data/DataRowResult.java b/src/main/java/fr/inra/oresing/rest/model/data/DataRowResult.java index 5b19a4b..60f8b8d 100644 --- a/src/main/java/fr/inra/oresing/rest/model/data/DataRowResult.java +++ b/src/main/java/fr/inra/oresing/rest/model/data/DataRowResult.java @@ -5,6 +5,7 @@ import fr.inra.oresing.domain.checker.type.FieldType; import fr.inra.oresing.domain.checker.type.NullType; import fr.inra.oresing.domain.data.DataColumn; import fr.inra.oresing.domain.data.RefsLinkedToValue; +import fr.inra.oresing.domain.repository.data.DataRepositoryForBuffer; import fr.inra.oresing.persistence.DataRow; import fr.inra.oresing.persistence.data.read.DataRepositoryWithBuffer; import org.apache.commons.collections.keyvalue.DefaultMapEntry; @@ -30,7 +31,7 @@ public record DataRowResult( public static DataRowResult of(DataRow dataRow, ImmutableSet<String> variables, String locale, - DataRepositoryWithBuffer dataRepositoryWithBuffer) { + DataRepositoryForBuffer dataRepositoryWithBuffer) { final Map<String, Object> rows = new HashMap<>(); for (final Map.Entry<String, FieldType> componentEntry : dataRow.values().entrySet()) { final String component = componentEntry.getKey(); diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java index 9e61175..14e24e1 100644 --- a/src/test/java/fr/inra/oresing/rest/Fixtures.java +++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java @@ -345,8 +345,8 @@ public class Fixtures { "fileid":"%1$s", "binaryfiledataset":{ "requiredAuthorizations":{ - "projet":["projet_%2$s"], - "sites":["%3$s.%4$s.%4$s__p1"] + "projet":["projetKprojet_%2$s"], + "sites":["type_de_sitesK%3$s.sitesK%4$s.sitesK%4$s__p1"] }, "from":"1984-01-01 00:00:00", "to":"1984-01-05 00:00:00" diff --git a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java index 2926022..e7a9462 100644 --- a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java +++ b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java @@ -8,21 +8,22 @@ import fr.inra.oresing.TestDatabaseConfig; import fr.inra.oresing.ValidationLevel; import fr.inra.oresing.domain.OreSiUser; import fr.inra.oresing.domain.application.configuration.Ltree; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterException; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationDataWriterForDepositException; +import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotApplicationCanDeleteRightsException; import fr.inra.oresing.domain.authorization.privilegeassessor.exception.NotOpenAdomAdministratorForSystemException; import fr.inra.oresing.domain.checker.InvalidDatasetContentException; import fr.inra.oresing.domain.data.deposit.validation.CsvRowValidationCheckResult; import fr.inra.oresing.domain.data.deposit.validation.ValidationCheckResult; import fr.inra.oresing.domain.exceptions.OreSiTechnicalException; import fr.inra.oresing.domain.exceptions.SiOreIllegalArgumentException; -import fr.inra.oresing.domain.exceptions.authentication.authentication.NotApplicationCanDeleteRightsException; import fr.inra.oresing.domain.exceptions.authorization.AuthorizationRequestException; import fr.inra.oresing.domain.exceptions.authorization.SiOreAuthorizationRequestException; -import fr.inra.oresing.domain.exceptions.data.data.DeleteOnrepositoryApplicationNotAllowedException; +import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException; import fr.inra.oresing.domain.repository.authorization.OperationType; import fr.inra.oresing.persistence.AuthenticationService; import fr.inra.oresing.persistence.JsonRowMapper; import fr.inra.oresing.persistence.UserRepository; -import fr.inra.oresing.domain.exceptions.configuration.BadApplicationConfigurationException; import fr.inra.oresing.rest.model.application.ApplicationResult; import fr.inra.oresing.rest.reactive.ReactiveTypeResult; import fr.inra.oresing.rest.services.RelationalService; @@ -1478,7 +1479,7 @@ public class OreSiResourcesTest { System.out.println(Objects.requireNonNull(result.getResolvedException()).getMessage()); } }) - .andExpect(jsonPath("$.message", Is.is(SiOreIllegalArgumentException.NO_RIGHT_ON_TABLE_FOR_DEPOSIT))) + .andExpect(jsonPath("$.message", Is.is(NotApplicationDataWriterException.NO_RIGHT_FOR_USER_DATA_WRITER))) .andReturn().getResponse().getContentAsString(); log.debug(response); } catch (ServletException servletException) { @@ -1543,10 +1544,10 @@ public class OreSiResourcesTest { .andExpect(status().is4xxClientError()) .andReturn().getResolvedException(); - Assertions.assertInstanceOf(SiOreIllegalArgumentException.class, exception); - Assertions.assertEquals("noRightForPublish", exception.getMessage()); - Assertions.assertEquals("pem", ((SiOreIllegalArgumentException) exception).getParams().get("dataName")); - Assertions.assertEquals("monsore", ((SiOreIllegalArgumentException) exception).getParams().get("application")); + Assertions.assertInstanceOf(NotApplicationDataWriterException.class, exception); + Assertions.assertEquals(NotApplicationDataWriterException.NO_RIGHT_FOR_USER_DATA_WRITER, exception.getMessage()); + Assertions.assertEquals("pem", ((NotApplicationDataWriterException) exception).dataName); + Assertions.assertEquals("monsore", ((NotApplicationDataWriterException) exception).applicationName); // on donne les droits publication @@ -1632,9 +1633,9 @@ public class OreSiResourcesTest { try { publishOrDepublish(withRigthsCookie, "manche", "plateforme", "nivelle", 34, true, 1, true); - } catch (final SiOreIllegalArgumentException e) { - Assertions.assertEquals(SiOreIllegalArgumentException.NO_RIGHT_ON_TABLE_FOR_DEPOSIT, e.getMessage()); - Assertions.assertEquals("referencevalue", e.getParams().get("table")); + } catch (final NotApplicationDataWriterForDepositException e) { + Assertions.assertEquals(NotApplicationDataWriterForDepositException.NO_RIGHT_FOR_USER_DATA_WRITER_FOR_DEPOSIT, e.getMessage()); + Assertions.assertEquals("pem", e.dataName); } getJsonRightsforRestrictions(withRigthsUserId, List.of(OperationType.publication.name()), "pem", "type_de_sitesKplateforme.sitesKnivelle.sitesKnivelle__p1", "1984,1,1", "1984,1,6", authCookie); @@ -1713,25 +1714,22 @@ public class OreSiResourcesTest { Assertions.assertEquals("NO_RIGHT_FOR_DELETE_RIGHTS_APPLICATION", resolvedException.getMessage()); Assertions.assertEquals("pem", resolvedException.getDataType()); Assertions.assertEquals("monsore", resolvedException.getApplicationName()); - Exception resolvedException1 = mockMvc.perform(delete("/api/v1/applications/monsore/data/pem") + /*Exception resolvedException1 = mockMvc.perform(delete("/api/v1/applications/monsore/data/pem") .cookie(authCookie)) .andExpect(status().is4xxClientError()) .andReturn() .getResolvedException(); - Assertions.assertInstanceOf(DeleteOnrepositoryApplicationNotAllowedException.class, resolvedException1); + Assertions.assertInstanceOf(NotApplicationCanDeleteRightsException.class, resolvedException1);*/ //on donne les droits de suppression - String deleteRights = getJsonRightsforRestrictions(withRigthsUserId, List.of(OperationType.delete.name()), + + getJsonRightsforRestrictions(withRigthsUserId, List.of(OperationType.delete.name()), "pem", "type_de_sitesKplateforme.sitesKnivelle.sitesKnivelle__p1", "1984,1,1", "1984,1,6", authCookie); // on supprime le fichier a les droits car à les droits de publication mockMvc.perform(delete("/api/v1/applications/monsore/file/" + fileUUID2) .cookie(withRigthsCookie)) - .andExpect(status().is2xxSuccessful()) - .andExpect(content().string(fileUUID2)); - // on supprime le fichier additionnel - return; - + .andExpect(status().is2xxSuccessful()); } @Test diff --git a/ui/cypress/fixtures/applications/errors/errors.json b/ui/cypress/fixtures/applications/errors/errors.json index f16891f..0b6f8b4 100644 --- a/ui/cypress/fixtures/applications/errors/errors.json +++ b/ui/cypress/fixtures/applications/errors/errors.json @@ -1 +1 @@ -{"testUnknownReferenceNameForChecker":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > sites > OA_basicComponents > tze_type_nom > OA_checker > OA_params > OA_reference > OA_name","referenceName":"tr_type_de_sites"}},"time":"2025-01-06T09:14:02.261883167","type":"REACTIVE_ERROR"}],"testUnexpectedNameTagInComputedComponents":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > pem > OA_computedComponents > site_bassin > OA_tags","notExpectedDomainTags":["contextt"]}},"time":"2025-01-06T09:15:42.880492507","type":"REACTIVE_ERROR"}],"testUnknownReferenceNameForDynamicColumns":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_reference","referenceName":"type_de_site"}},"time":"2025-01-06T09:14:44.201088731","type":"REACTIVE_ERROR"}],"testmissingComponentNameForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_component"}},"time":"2025-01-06T09:13:49.28823719","type":"REACTIVE_ERROR"}],"testMissingOrBadTypeVersionApplication":[{"errortype":"ValidationError","result":{"message":"badVersionPattern","params":{"givenVersion":"deux","path":"OA_application"}},"time":"2025-01-06T09:13:51.486930922","type":"REACTIVE_ERROR"}],"testUnexpectedReferencesForComputation":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-06T09:13:40.014681033","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-06T09:13:40.015906516","type":"REACTIVE_ERROR"}],"testmissingRequiredValueInTimeScopeInSubmission":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_timeScope > OA_component"}},"time":"2025-01-06T09:15:21.315695932","type":"REACTIVE_ERROR"}],"testMissingNameApplication":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_application > OA_name"}},"time":"2025-01-06T09:15:53.359364155","type":"REACTIVE_ERROR"}],"testUnexpectedReferencesForDefaultValue":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-06T09:13:46.938967833","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-06T09:13:46.939665484","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"invalidComponentReferenceForSubmissionScopeReference","params":{"submissionReference":"projet","componentReference":"proj","path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 2"}},"time":"2025-01-06T09:16:19.728423195","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataI18ndisplay":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > especes > OA_i18nDisplayPattern > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:16:28.838466494","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataI18n":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > especes > OA_i18n > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:14:58.482865695","type":"REACTIVE_ERROR"}],"testUnexpectedSections":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["OA_application","OA_version","OA_data","OA_additionalFiles","OA_rightsRequest","OA_tags"],"path":"OA_version > OA_application > OA_data > OA_unexpectedTag > OA_rightsRequest > OA_tags","unexpectedSections":["OA_unexpectedTag"]}},"time":"2025-01-06T09:14:48.8332807","type":"REACTIVE_ERROR"}],"testBadEnumSectionTypeInSubmission":[{"errortype":"ValidationError","result":{"message":"badEnumSectionType","params":{"givenValue":"OA_VERSIONINGY","path":"OA_data > pem > OA_submission > OA_strategy","acceptedValues":["OA_INSERTION","OA_VERSIONING"]}},"time":"2025-01-06T09:13:57.991227207","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInRightsRequestDescription":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_rightsRequest > OA_i18n > OA_description > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:16:00.336800692","type":"REACTIVE_ERROR"}],"testUnknownNameAuthorizationScopeInFileNameSubmission":[{"errortype":"ValidationError","result":{"message":"unknownNameReferenceScope","params":{"path":"OA_submission > OA_fileName > OA_referenceScopes > site_bassine","knownAuthorizationScope":["site_bassin","projet"],"unknownAuthorizationScope":"site_bassine"}},"time":"2025-01-06T09:15:58.091838247","type":"REACTIVE_ERROR"}],"testMissingMandatorySectionsInConstantComponents":[{"errortype":"ValidationError","result":{"message":"missingMandatoriesSections","params":{"missingMandatoriesSections":["OA_rowNumber"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-06T09:14:53.720957464","type":"REACTIVE_ERROR"}],"testInvalidMinMaxForCheckerDate":[{"errortype":"ValidationError","result":{"message":"invalidMinMaxForCheckerDate","params":{"declaredPattern":"dd/MM/yyyy","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params","declaredMinValue":"12/31/1980","declaredMaxValue":"31/12/2024"}},"time":"2025-01-06T09:13:42.396017861","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"invalidMinMaxForCheckerDate","params":{"declaredPattern":"dd/MM/yyyy","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params","declaredMinValue":"31/12/1980","declaredMaxValue":"12/31/2024"}},"time":"2025-01-06T09:15:07.613574919","type":"REACTIVE_ERROR"}],"testBadNameApplication":[{"errortype":"ValidationError","result":{"message":"unsupportedNameApplication","params":{"path":"OA_application","nameApplication":"F4KE app!cat°"}},"time":"2025-01-06T09:14:41.966910128","type":"REACTIVE_ERROR"}],"testBadVersionApplication":[{"errortype":"ValidationError","result":{"message":"badVersionPattern","params":{"givenVersion":"-2","path":"OA_application"}},"time":"2025-01-06T09:14:23.976980644","type":"REACTIVE_ERROR"}],"testUnknownColumnNumberToFirstRowLineInConstantComponents":[{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderColumnNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-06T09:15:09.876981737","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderColumnNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-06T09:16:31.355765465","type":"REACTIVE_ERROR"}],"testBadBuilderVersion":[{"errortype":"ValidationError","result":{"message":"unsupportedOpenadomVersion","params":{"path":"OA_version","actualVersion":"2","expectedVersion":"2.0.1"}},"time":"2025-01-06T09:14:26.716822439","type":"REACTIVE_ERROR"}],"testMissingReferenceNameForChecker":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > sites > OA_basicComponents > tze_type_nom > OA_checker > OA_params > OA_reference > OA_name","referenceName":"toto"}},"time":"2025-01-06T09:13:53.581630565","type":"REACTIVE_ERROR"}],"testBadNameTag":[{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > especes","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-06T09:14:46.542328534","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > type_de_sites","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-06T09:14:46.544352792","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > sites","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-06T09:14:46.544927019","type":"REACTIVE_ERROR"}],"testReturnMultiplesErrors":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > site > OA_basicComponents > zet_chemin_parent > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-06T09:16:12.450635573","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-06T09:16:12.451138638","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_defaultValue > OA_references","referenceName":"sites"}},"time":"2025-01-06T09:16:12.451241732","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_computedComponents > site_bassin > OA_checker > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-06T09:16:12.451470718","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_computedComponents > site_bassin > OA_defaultValue > OA_references","referenceName":"sites"}},"time":"2025-01-06T09:16:12.451526701","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-06T09:16:12.45176012","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"sites"}},"time":"2025-01-06T09:16:12.451792467","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_validations > reference > OA_validations > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-06T09:16:12.452194363","type":"REACTIVE_ERROR"}],"testEmptyFile":[{"errortype":"ValidationError","result":{"message":"emptyFile","params":{}},"time":"2025-01-06T09:14:39.692394459","type":"REACTIVE_ERROR"}],"testunknownComponentNameForAuthorization":[{"errortype":"ValidationError","result":{"message":"unknownComponentForComponentName","params":{"unknownComponent":"proj","knownComponents":["site_bassin","site","tel_experimental_site","projet","espece","chemin"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 2 > OA_component"}},"time":"2025-01-06T09:14:35.081689411","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownNameReferenceScope","params":{"path":"OA_submission > OA_fileName > OA_referenceScopes > projet","knownAuthorizationScope":["site_bassin","proj"],"unknownAuthorizationScope":"projet"}},"time":"2025-01-06T09:14:35.081922401","type":"REACTIVE_ERROR"}],"testMissingNameChecker":[{"errortype":"ValidationError","result":{"message":"missingCheckerName","params":{"path":"OA_data > sites > OA_basicComponents > tze_type_nom","acceptedCheckerNames":["OA_reference","OA_float","OA_date","OA_groovyExpression","OA_boolean","OA_integer","OA_string"]}},"time":"2025-01-06T09:15:05.135797431","type":"REACTIVE_ERROR"}],"testduplicatedComponentInPatternComponent":[{"errortype":"ValidationError","result":{"message":"duplicatedComponentHeaderInPatternComponent","params":{"duplicatedPathes":["OA_data > pem > OA_patternComponents > tel_value > OA_componentQualifiers > tel_date","OA_data > pem > OA_patternComponents > tel_value > OA_componentAdjacents > tel_date"],"path":"OA_data > pem > OA_patternComponents > tel_value > OA_componentAdjacents > tel_date","qualifierName":"tel_date","data":"pem","patternComponent":"tel_value"}},"time":"2025-01-06T09:15:26.326043477","type":"REACTIVE_ERROR"}],"testMissingComponentNameValidation":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_validations > reference > OA_components"}},"time":"2025-01-06T09:15:00.729000637","type":"REACTIVE_ERROR"}],"testInvalidPatternForCheckerDate":[{"errortype":"ValidationError","result":{"message":"invalidPatternForCheckerDate","params":{"badPattern":"bb/MM/yyyy","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params > OA_pattern"}},"time":"2025-01-06T09:14:08.935081293","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInAuthorizationScopes":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_i18n > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:15:36.870193757","type":"REACTIVE_ERROR"}],"testunknownComponentInTimeScopeInSubmission":[{"errortype":"ValidationError","result":{"message":"unknownComponentForComponentName","params":{"unknownComponent":"dates","knownComponents":["date"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_timeScope > OA_component"}},"time":"2025-01-06T09:14:18.631224944","type":"REACTIVE_ERROR"}],"testMissingPatternForCheckerDate":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params > OA_pattern"}},"time":"2025-01-06T09:14:04.447473945","type":"REACTIVE_ERROR"}],"testUnexpectedReferencesForDefaultValueInConstantComponents":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-06T09:15:39.473455","type":"REACTIVE_ERROR"}],"testSuperieurImportHeaderRowNumberToFirstRowLineInConstantComponents":[{"errortype":"ValidationError","result":{"message":"badConstantImportHeaderRowNumber","params":{"givenRowNumber":8,"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_rowNumber","firstRowLine":7}},"time":"2025-01-06T09:14:21.432963692","type":"REACTIVE_ERROR"}],"testNegativeImportHeaderRowNumberInConstantComponents":[{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderRowNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_rowNumber"}},"time":"2025-01-06T09:13:55.798464021","type":"REACTIVE_ERROR"}],"testUnexpectedNameTagInData":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > especes","notExpectedDomainTags":["contxet"]}},"time":"2025-01-06T09:16:24.082763063","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > type_de_sites","notExpectedDomainTags":["contxet"]}},"time":"2025-01-06T09:16:24.083745149","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > sites","notExpectedDomainTags":["contxet"]}},"time":"2025-01-06T09:16:24.084044042","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataDynamicComponents":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_exportHeader > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:16:07.61053218","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInTags":[{"errortype":"ValidationError","result":{"message":"unsuportedI18nKeyLanguage","params":{"path":"OA_tags > test"}},"time":"2025-01-06T09:14:13.397625735","type":"REACTIVE_ERROR"}],"testNegativeColumnNumberToFirstRowLineInConstantComponents":[{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderColumnNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-06T09:16:15.122299169","type":"REACTIVE_ERROR"}],"testUnExpectedReservedTagPatternForDomainTag":[{"errortype":"ValidationError","result":{"message":"illegalDomainTagPattern","params":{"reservedTagNames":["HiddenTag[tagDefinition=HIDDEN_TAG]"],"path":"OA_tags","expectedPattern":"^[a-z][a-z_0-9]*[a-z0-9]$"}},"time":"2025-01-06T09:15:51.052397521","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > especes","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:15:51.052603393","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > projet","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:15:51.053514979","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > type_de_sites","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:15:51.05374477","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > sites","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:15:51.054037291","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_tags","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:15:51.054453652","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > pem","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:15:51.054575254","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataInConstantComponentsExportheaderI18n":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_exportHeader > OA_description > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:15:30.608192797","type":"REACTIVE_ERROR"}],"testMissingRequiredSections":[{"errortype":"ValidationError","result":{"message":"missingVersionApplication","params":{"path":"","actualVersion":"2.0.1"}},"time":"2025-01-06T09:15:33.207781811","type":"REACTIVE_ERROR"}],"testMissingReferencesForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingMandatoriesSections","params":{"missingMandatoriesSections":["OA_reference"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_exportHeader > OA_component > OA_i18n"}},"time":"2025-01-06T09:14:32.449446426","type":"REACTIVE_ERROR"}],"testMissingRequiredValueForChecker":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > sites > OA_basicComponents > tze_type_nom > OA_checker > OA_params > OA_reference > OA_name"}},"time":"2025-01-06T09:14:11.168883959","type":"REACTIVE_ERROR"}],"testMissingAnyMandatorySectionsInConstantComponents":[{"errortype":"ValidationError","result":{"message":"missingAnyMandatoriesSections","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_importHeaderTarget > OA_rowNumber","anyMandatorySections":["OA_columnName","OA_columnNumber"]}},"time":"2025-01-06T09:15:55.707200266","type":"REACTIVE_ERROR"}],"testMissingBuilderVersion":[{"errortype":"ValidationError","result":{"message":"missingVersionApplication","params":{"path":"OA_version","expectedVersion":"2.0.1"}},"time":"2025-01-06T09:15:28.445077899","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInAuthorizationScopesExportheader":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 1 > OA_exportHeader > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:14:56.223343007","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataExportheaderI18n":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > especes > OA_computedComponents > my_computed_column > OA_exportHeader > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:13:44.614753864","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInApplication":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_application > OA_i18n > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:15:16.575928072","type":"REACTIVE_ERROR"}],"testUnknownCheckerName":[{"errortype":"ValidationError","result":{"message":"unknownCheckerName","params":{"path":"OA_data > sites > OA_basicComponents > tze_type_nom","checkerName":"reference","acceptedCheckerNames":["OA_reference","OA_float","OA_date","OA_groovyExpression","OA_boolean","OA_integer","OA_string"]}},"time":"2025-01-06T09:14:29.869565236","type":"REACTIVE_ERROR"}],"testUnknownReferenceColumnToLookForHeaderInDataDynamicComponents":[{"errortype":"ValidationError","result":{"message":"unknownReferenceColumnToLookForHeader","params":{"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_referenceComponentToLookForHeader","listColumnsNameReference":["tze_definition_en","tze_definition_fr","tze_nom_en","tze_nom_fr","tze_nom_key"],"columnNameReference":"nom_key","referenceName":"type_de_sites"}},"time":"2025-01-06T09:14:00.156155327","type":"REACTIVE_ERROR"}],"testBadNameTagInDynamicComponents":[{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_tags","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-06T09:15:23.61577797","type":"REACTIVE_ERROR"}],"testMissingRequiredValueForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_reference"}},"time":"2025-01-06T09:14:37.572440248","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInValidation":[{"errortype":"ValidationError","result":{"message":"duplicateKey","params":{"columnNumber":8,"lineNumber":248,"duplicateKeys":"sites"}},"time":"2025-01-06T09:14:51.081723662","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"duplicatedComponentHeader","params":{"duplicatedImportHeader":["zet_nom_key","zet_chemin_parent"],"path":"OA_data > sites","duplicatedHeader":"zet_chemin_parent","data":"sites"}},"time":"2025-01-06T09:15:45.564781178","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","luy","ccp","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","be","ru","rw","bg","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","dyo","to","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","agq","hr","gsw","kkj","hu","yi","hy","yo","ia","id","ig","vai","naq","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","fur","ln","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","pa","dua","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_validations > reference > OA_i18n > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-06T09:15:48.541778865","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"duplicatedComponentName","params":{"duplicatedPathes":["OA_data > pem > OA_constantComponents > tel_experimental_site","OA_data > pem > OA_patternComponents > tel_experimental_site"],"path":"OA_data > pem > OA_patternComponents > tel_experimental_site","componentName":"tel_experimental_site"}},"time":"2025-01-06T09:16:05.13040238","type":"REACTIVE_ERROR"}],"testMissingAnyMandatoriesSectionsForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingMandatoriesSections","params":{"missingMandatoriesSections":["OA_reference","OA_component"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_exportHeader > OA_i18n"}},"time":"2025-01-06T09:16:02.87860239","type":"REACTIVE_ERROR"}],"testInvalidNaturalKey":[{"errortype":"ValidationError","result":{"message":"invalidNaturalKey","params":{"path":"OA_data > especes","invalidNaturalKeyElements":["espNom"],"expectedComponentLabel":["colonne_homonyme_entre_referentiels","esp_definition_en","my_computed_column","esp_nom","esp_definition_fr"]}},"time":"2025-01-06T09:15:19.034831171","type":"REACTIVE_ERROR"}],"testInvalidDurationForCheckerDate":[{"errortype":"ValidationError","result":{"message":"invalidDurationCheckerDate","params":{"declaredDuration":"1 Yearss","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params"}},"time":"2025-01-06T09:16:17.600108785","type":"REACTIVE_ERROR"}],"testMissingRequiredValueForDynamicColumns":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_reference"}},"time":"2025-01-06T09:16:26.294263224","type":"REACTIVE_ERROR"}],"testUnexpectedNameTagInBasicComponent":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > pem > OA_basicComponents > projet > OA_tags","notExpectedDomainTags":["testz"]}},"time":"2025-01-06T09:15:14.381718926","type":"REACTIVE_ERROR"}],"testunknownComponentNameValidation":[{"errortype":"ValidationError","result":{"message":"unknownComponentForComponentName","params":{"unknownComponent":"sites","knownComponents":["site_bassin","date","tel_experimental_site","site","bassin","projet","espece","ordre_affichage","chemin","tel_experimental_network","plateforme","is_float_value","tel_value"],"path":"OA_data > pem > OA_validations > reference > OA_components"}},"time":"2025-01-06T09:15:12.202127846","type":"REACTIVE_ERROR"}],"testNotExpectedTagsInConstantComponents":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_tags","notExpectedDomainTags":["testz"]}},"time":"2025-01-06T09:15:02.963171876","type":"REACTIVE_ERROR"}],"testMissingComponentNameInColumnsForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingComponentForComponentName","params":{"knownComponents":["site_bassin","date","tel_experimental_site","site","bassin","projet","espece","ordre_affichage","chemin","tel_experimental_network","plateforme","is_float_value","tel_value"],"path":"OA_data > pem > OA_validations > reference > OA_components"}},"time":"2025-01-06T09:16:21.847011692","type":"REACTIVE_ERROR"}],"testBadDomaineTagPattern":[{"errortype":"ValidationError","result":{"message":"badDomainTagPattern","params":{"path":"OA_tags","domainTagPattern":"^[a-z][a-z_0-9]*[a-z0-9]$"}},"time":"2025-01-06T09:16:10.0040929","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"illegalDomainTagPattern","params":{"reservedTagNames":["NoTag[tagDefinition=NO_TAG, tagName=no_tag]"],"path":"OA_tags","expectedPattern":"^[a-z][a-z_0-9]*[a-z0-9]$"}},"time":"2025-01-06T09:16:10.004370456","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > especes","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:16:10.004487148","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > especes > OA_basicComponents > esp_nom > OA_tags","notExpectedDomainTags":["test"]}},"time":"2025-01-06T09:16:10.004901521","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > projet","notExpectedDomainTags":["test","context"]}},"time":"2025-01-06T09:16:10.005257495","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > type_de_sites","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:16:10.00549363","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > sites","notExpectedDomainTags":["context"]}},"time":"2025-01-06T09:16:10.00577613","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_tags","notExpectedDomainTags":["test","context"]}},"time":"2025-01-06T09:16:10.006407967","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > pem","notExpectedDomainTags":["test","context"]}},"time":"2025-01-06T09:16:10.006597877","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > pem > OA_basicComponents > projet > OA_tags","notExpectedDomainTags":["test"]}},"time":"2025-01-06T09:16:10.007043116","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_tags","notExpectedDomainTags":["test"]}},"time":"2025-01-06T09:16:10.007923352","type":"REACTIVE_ERROR"}]} \ No newline at end of file +{"testUnknownReferenceNameForChecker":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > sites > OA_basicComponents > tze_type_nom > OA_checker > OA_params > OA_reference > OA_name","referenceName":"tr_type_de_sites"}},"time":"2025-01-24T17:37:28.702163034","type":"REACTIVE_ERROR"}],"testUnexpectedNameTagInComputedComponents":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > pem > OA_computedComponents > site_bassin > OA_tags","notExpectedDomainTags":["contextt"]}},"time":"2025-01-24T17:39:05.860372067","type":"REACTIVE_ERROR"}],"testUnknownReferenceNameForDynamicColumns":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_reference","referenceName":"type_de_site"}},"time":"2025-01-24T17:38:08.454892685","type":"REACTIVE_ERROR"}],"testmissingComponentNameForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_component"}},"time":"2025-01-24T17:37:15.32848605","type":"REACTIVE_ERROR"}],"testMissingOrBadTypeVersionApplication":[{"errortype":"ValidationError","result":{"message":"badVersionPattern","params":{"givenVersion":"deux","path":"OA_application"}},"time":"2025-01-24T17:37:17.54751352","type":"REACTIVE_ERROR"}],"testUnexpectedReferencesForComputation":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-24T17:37:05.744998333","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-24T17:37:05.746032832","type":"REACTIVE_ERROR"}],"testmissingRequiredValueInTimeScopeInSubmission":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_timeScope > OA_component"}},"time":"2025-01-24T17:38:44.669771013","type":"REACTIVE_ERROR"}],"testMissingNameApplication":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_application > OA_name"}},"time":"2025-01-24T17:39:18.790011654","type":"REACTIVE_ERROR"}],"testUnexpectedReferencesForDefaultValue":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-24T17:37:12.991994698","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-24T17:37:12.992621666","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"invalidComponentReferenceForSubmissionScopeReference","params":{"submissionReference":"projet","componentReference":"proj","path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 2"}},"time":"2025-01-24T17:39:51.516424094","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataI18ndisplay":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > especes > OA_i18nDisplayPattern > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:40:01.636497236","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataI18n":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > especes > OA_i18n > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:38:22.029359804","type":"REACTIVE_ERROR"}],"testUnexpectedSections":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["OA_application","OA_version","OA_data","OA_additionalFiles","OA_rightsRequest","OA_tags"],"path":"OA_version > OA_application > OA_data > OA_unexpectedTag > OA_rightsRequest > OA_tags","unexpectedSections":["OA_unexpectedTag"]}},"time":"2025-01-24T17:38:12.859469485","type":"REACTIVE_ERROR"}],"testBadEnumSectionTypeInSubmission":[{"errortype":"ValidationError","result":{"message":"badEnumSectionType","params":{"givenValue":"OA_VERSIONINGY","path":"OA_data > pem > OA_submission > OA_strategy","acceptedValues":["OA_INSERTION","OA_VERSIONING"]}},"time":"2025-01-24T17:37:24.161963506","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInRightsRequestDescription":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_rightsRequest > OA_i18n > OA_description > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:39:28.781925036","type":"REACTIVE_ERROR"}],"testUnknownNameAuthorizationScopeInFileNameSubmission":[{"errortype":"ValidationError","result":{"message":"unknownNameReferenceScope","params":{"path":"OA_submission > OA_fileName > OA_referenceScopes > site_bassine","unknownAuthorizationScope":"site_bassine","knownAuthorizationScope":["site_bassin","projet"]}},"time":"2025-01-24T17:39:25.081346451","type":"REACTIVE_ERROR"}],"testMissingMandatorySectionsInConstantComponents":[{"errortype":"ValidationError","result":{"message":"missingMandatoriesSections","params":{"missingMandatoriesSections":["OA_rowNumber"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-24T17:38:17.182456851","type":"REACTIVE_ERROR"}],"testInvalidMinMaxForCheckerDate":[{"errortype":"ValidationError","result":{"message":"invalidMinMaxForCheckerDate","params":{"declaredPattern":"dd/MM/yyyy","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params","declaredMinValue":"12/31/1980","declaredMaxValue":"31/12/2024"}},"time":"2025-01-24T17:37:08.059722906","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"invalidMinMaxForCheckerDate","params":{"declaredPattern":"dd/MM/yyyy","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params","declaredMinValue":"31/12/1980","declaredMaxValue":"12/31/2024"}},"time":"2025-01-24T17:38:31.492135817","type":"REACTIVE_ERROR"}],"testBadNameApplication":[{"errortype":"ValidationError","result":{"message":"unsupportedNameApplication","params":{"path":"OA_application","nameApplication":"F4KE app!cat°"}},"time":"2025-01-24T17:38:06.342625501","type":"REACTIVE_ERROR"}],"testBadVersionApplication":[{"errortype":"ValidationError","result":{"message":"badVersionPattern","params":{"givenVersion":"-2","path":"OA_application"}},"time":"2025-01-24T17:37:49.764952482","type":"REACTIVE_ERROR"}],"testUnknownColumnNumberToFirstRowLineInConstantComponents":[{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderColumnNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-24T17:38:33.606118512","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderColumnNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-24T17:40:04.011524172","type":"REACTIVE_ERROR"}],"testBadBuilderVersion":[{"errortype":"ValidationError","result":{"message":"unsupportedOpenadomVersion","params":{"path":"OA_version","actualVersion":"2","expectedVersion":"2.0.1"}},"time":"2025-01-24T17:37:51.948444866","type":"REACTIVE_ERROR"}],"testMissingReferenceNameForChecker":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > sites > OA_basicComponents > tze_type_nom > OA_checker > OA_params > OA_reference > OA_name","referenceName":"toto"}},"time":"2025-01-24T17:37:19.835435388","type":"REACTIVE_ERROR"}],"testBadNameTag":[{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > especes","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-24T17:38:10.714136076","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > type_de_sites","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-24T17:38:10.715686622","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > sites","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-24T17:38:10.716031371","type":"REACTIVE_ERROR"}],"testReturnMultiplesErrors":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > site > OA_basicComponents > zet_chemin_parent > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-24T17:39:43.180077561","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-24T17:39:43.180437648","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_basicComponents > chemin > OA_defaultValue > OA_references","referenceName":"sites"}},"time":"2025-01-24T17:39:43.180523534","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_computedComponents > site_bassin > OA_checker > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-24T17:39:43.180695065","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_computedComponents > site_bassin > OA_defaultValue > OA_references","referenceName":"sites"}},"time":"2025-01-24T17:39:43.180755789","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-24T17:39:43.181031274","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"sites"}},"time":"2025-01-24T17:39:43.181060662","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["site","especes","type_de_sites","projet","pem"],"path":"OA_data > pem > OA_validations > reference > OA_validations > OA_checker > OA_params > OA_reference > OA_name","referenceName":"sites"}},"time":"2025-01-24T17:39:43.181376875","type":"REACTIVE_ERROR"}],"testEmptyFile":[{"errortype":"ValidationError","result":{"message":"emptyFile","params":{}},"time":"2025-01-24T17:38:04.165888141","type":"REACTIVE_ERROR"}],"testunknownComponentNameForAuthorization":[{"errortype":"ValidationError","result":{"message":"unknownComponentForComponentName","params":{"unknownComponent":"proj","knownComponents":["site_bassin","site","tel_experimental_site","projet","espece","chemin"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 2 > OA_component"}},"time":"2025-01-24T17:37:58.992562876","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unknownNameReferenceScope","params":{"path":"OA_submission > OA_fileName > OA_referenceScopes > projet","unknownAuthorizationScope":"projet","knownAuthorizationScope":["site_bassin","proj"]}},"time":"2025-01-24T17:37:58.992785443","type":"REACTIVE_ERROR"}],"testMissingNameChecker":[{"errortype":"ValidationError","result":{"message":"missingCheckerName","params":{"path":"OA_data > sites > OA_basicComponents > tze_type_nom","acceptedCheckerNames":["OA_reference","OA_float","OA_date","OA_groovyExpression","OA_boolean","OA_integer","OA_string"]}},"time":"2025-01-24T17:38:29.162562195","type":"REACTIVE_ERROR"}],"testduplicatedComponentInPatternComponent":[{"errortype":"ValidationError","result":{"message":"duplicatedComponentHeaderInPatternComponent","params":{"duplicatedPathes":["OA_data > pem > OA_patternComponents > tel_value > OA_componentQualifiers > tel_date","OA_data > pem > OA_patternComponents > tel_value > OA_componentAdjacents > tel_date"],"path":"OA_data > pem > OA_patternComponents > tel_value > OA_componentAdjacents > tel_date","qualifierName":"tel_date","data":"pem","patternComponent":"tel_value"}},"time":"2025-01-24T17:38:49.002642876","type":"REACTIVE_ERROR"}],"testMissingComponentNameValidation":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_validations > reference > OA_components"}},"time":"2025-01-24T17:38:24.273685496","type":"REACTIVE_ERROR"}],"testInvalidPatternForCheckerDate":[{"errortype":"ValidationError","result":{"message":"invalidPatternForCheckerDate","params":{"badPattern":"bb/MM/yyyy","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params > OA_pattern"}},"time":"2025-01-24T17:37:35.718466121","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInAuthorizationScopes":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_i18n > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:38:57.8438773","type":"REACTIVE_ERROR"}],"testunknownComponentInTimeScopeInSubmission":[{"errortype":"ValidationError","result":{"message":"unknownComponentForComponentName","params":{"unknownComponent":"dates","knownComponents":["date"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_timeScope > OA_component"}},"time":"2025-01-24T17:37:45.172489408","type":"REACTIVE_ERROR"}],"testMissingPatternForCheckerDate":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params > OA_pattern"}},"time":"2025-01-24T17:37:30.902756258","type":"REACTIVE_ERROR"}],"testUnexpectedReferencesForDefaultValueInConstantComponents":[{"errortype":"ValidationError","result":{"message":"unknownReferenceName","params":{"allDataNames":["especes","type_de_sites","projet","pem","sites"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_defaultValue > OA_references","referenceName":"site"}},"time":"2025-01-24T17:39:01.369382802","type":"REACTIVE_ERROR"}],"testSuperieurImportHeaderRowNumberToFirstRowLineInConstantComponents":[{"errortype":"ValidationError","result":{"message":"badConstantImportHeaderRowNumber","params":{"givenRowNumber":8,"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_rowNumber","firstRowLine":7}},"time":"2025-01-24T17:37:47.631654457","type":"REACTIVE_ERROR"}],"testNegativeImportHeaderRowNumberInConstantComponents":[{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderRowNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_rowNumber"}},"time":"2025-01-24T17:37:21.979214229","type":"REACTIVE_ERROR"}],"testUnexpectedNameTagInData":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > especes","notExpectedDomainTags":["contxet"]}},"time":"2025-01-24T17:39:57.007609274","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > type_de_sites","notExpectedDomainTags":["contxet"]}},"time":"2025-01-24T17:39:57.008529372","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > sites","notExpectedDomainTags":["contxet"]}},"time":"2025-01-24T17:39:57.008834509","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataDynamicComponents":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_exportHeader > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:39:37.308899987","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInTags":[{"errortype":"ValidationError","result":{"message":"unsuportedI18nKeyLanguage","params":{"path":"OA_tags > test"}},"time":"2025-01-24T17:37:40.230953173","type":"REACTIVE_ERROR"}],"testNegativeColumnNumberToFirstRowLineInConstantComponents":[{"errortype":"ValidationError","result":{"message":"negativeConstantImportHeaderColumnNumber","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_importHeaderTarget > OA_columnNumber"}},"time":"2025-01-24T17:39:45.775459505","type":"REACTIVE_ERROR"}],"testUnExpectedReservedTagPatternForDomainTag":[{"errortype":"ValidationError","result":{"message":"illegalDomainTagPattern","params":{"reservedTagNames":["HiddenTag[tagDefinition=HIDDEN_TAG]"],"path":"OA_tags","expectedPattern":"^[a-z][a-z_0-9]*[a-z0-9]$"}},"time":"2025-01-24T17:39:15.456531441","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > especes","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:15.456843553","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > projet","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:15.458182103","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > type_de_sites","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:15.458870712","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > sites","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:15.460145474","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_tags","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:15.46208478","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test"],"path":"OA_data > pem","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:15.462487433","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataInConstantComponentsExportheaderI18n":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_exportHeader > OA_description > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:38:53.256486729","type":"REACTIVE_ERROR"}],"testMissingRequiredSections":[{"errortype":"ValidationError","result":{"message":"missingVersionApplication","params":{"path":"","actualVersion":"2.0.1"}},"time":"2025-01-24T17:38:55.492018498","type":"REACTIVE_ERROR"}],"testMissingReferencesForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingMandatoriesSections","params":{"missingMandatoriesSections":["OA_reference"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_exportHeader > OA_component > OA_i18n"}},"time":"2025-01-24T17:37:56.732929531","type":"REACTIVE_ERROR"}],"testMissingRequiredValueForChecker":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > sites > OA_basicComponents > tze_type_nom > OA_checker > OA_params > OA_reference > OA_name"}},"time":"2025-01-24T17:37:37.940372306","type":"REACTIVE_ERROR"}],"testMissingAnyMandatorySectionsInConstantComponents":[{"errortype":"ValidationError","result":{"message":"missingAnyMandatoriesSections","params":{"path":"OA_data > pem > OA_constantComponents > tel_experimental_site > OA_importHeaderTarget > OA_rowNumber","anyMandatorySections":["OA_columnName","OA_columnNumber"]}},"time":"2025-01-24T17:39:21.629441491","type":"REACTIVE_ERROR"}],"testMissingBuilderVersion":[{"errortype":"ValidationError","result":{"message":"missingVersionApplication","params":{"path":"OA_version","expectedVersion":"2.0.1"}},"time":"2025-01-24T17:38:51.127358032","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInAuthorizationScopesExportheader":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 1 > OA_exportHeader > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:38:19.645194776","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInDataExportheaderI18n":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > especes > OA_computedComponents > my_computed_column > OA_exportHeader > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:37:10.644029892","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInApplication":[{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_application > OA_i18n > OA_title > en > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:38:40.155189043","type":"REACTIVE_ERROR"}],"testUnknownCheckerName":[{"errortype":"ValidationError","result":{"message":"unknownCheckerName","params":{"path":"OA_data > sites > OA_basicComponents > tze_type_nom","checkerName":"reference","acceptedCheckerNames":["OA_reference","OA_float","OA_date","OA_groovyExpression","OA_boolean","OA_integer","OA_string"]}},"time":"2025-01-24T17:37:54.307249036","type":"REACTIVE_ERROR"}],"testUnknownReferenceColumnToLookForHeaderInDataDynamicComponents":[{"errortype":"ValidationError","result":{"message":"unknownReferenceColumnToLookForHeader","params":{"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_referenceComponentToLookForHeader","listColumnsNameReference":["tze_definition_en","tze_definition_fr","tze_nom_en","tze_nom_fr","tze_nom_key"],"columnNameReference":"nom_key","referenceName":"type_de_sites"}},"time":"2025-01-24T17:37:26.403976354","type":"REACTIVE_ERROR"}],"testBadNameTagInDynamicComponents":[{"errortype":"ValidationError","result":{"message":"badTagsPatterns","params":{"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_tags","acceptedTagPatterns":["__HIDDEN__","__REFERENCE__","test","context","no-tag","__ORDER_(\\d*)__","__DATA__"]}},"time":"2025-01-24T17:38:46.891735061","type":"REACTIVE_ERROR"}],"testMissingRequiredValueForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_reference"}},"time":"2025-01-24T17:38:01.689185428","type":"REACTIVE_ERROR"}],"testUnsuportedI18nKeyLanguageInValidation":[{"errortype":"ValidationError","result":{"message":"duplicateKey","params":{"columnNumber":8,"lineNumber":248,"duplicateKeys":"sites"}},"time":"2025-01-24T17:38:14.987497805","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"duplicatedComponentHeader","params":{"duplicatedImportHeader":["zet_nom_key","zet_chemin_parent"],"path":"OA_data > sites","duplicatedHeader":"zet_chemin_parent","data":"sites"}},"time":"2025-01-24T17:39:09.875948166","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"unexpectedSections","params":{"expectedSections":["sbp","ksh","nyn","ps","pt","luo","fil","mgh","ccp","luy","mgo","bas","raj","teo","qu","af","brx","ak","am","kde","ar","as","az","rm","rn","ro","ceb","ru","be","bg","rw","kea","bm","bn","bo","sa","twq","br","sc","bs","sd","xog","se","sg","si","seh","sk","sl","sn","so","sq","ca","sr","ses","mzn","ce","su","sv","sw","ta","asa","yav","cs","te","yrl","tg","cv","th","ti","cy","tk","to","dyo","da","tr","tt","de","cgg","ast","nmg","bem","ug","kgp","dz","uk","bez","ur","dje","haw","ee","uz","tzm","el","nnh","en","eo","chr","es","et","eu","vi","khq","shi","hsb","fa","bgc","ff","fi","rwk","yue","fo","fr","fy","jgo","lkt","wo","wae","zgh","ga","pcm","gd","gl","bho","mni","gu","gv","xh","ha","ckb","he","hi","gsw","hr","agq","kkj","hu","yi","hy","yo","ia","id","ig","naq","vai","ii","frr","is","it","kln","zh","ja","zu","doi","jv","guz","tok","mai","smn","ka","sms","mas","ki","kk","kl","km","kn","ko","ks","ku","kw","ky","lb","ebu","lg","nds","jmc","ln","fur","lo","kok","lt","lu","lv","nus","vun","lag","dav","mg","pis","lrc","mi","mk","ml","mn","mr","ms","mt","my","mdf","dsb","nb","nd","ne","mua","nl","nn","no","rof","kab","oc","kam","mer","sah","om","ann","saq","or","os","sat","mfe","dua","pa","ksb","pl","ewo","ksf"],"path":"OA_data > pem > OA_validations > reference > OA_i18n > frrr","unexpectedSections":["frrr"]}},"time":"2025-01-24T17:39:12.634941038","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"duplicatedComponentName","params":{"duplicatedPathes":["OA_data > pem > OA_constantComponents > tel_experimental_site","OA_data > pem > OA_patternComponents > tel_experimental_site"],"path":"OA_data > pem > OA_patternComponents > tel_experimental_site","componentName":"tel_experimental_site"}},"time":"2025-01-24T17:39:34.314921366","type":"REACTIVE_ERROR"}],"testMissingAnyMandatoriesSectionsForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingMandatoriesSections","params":{"missingMandatoriesSections":["OA_reference","OA_component"],"path":"OA_data > pem > OA_submission > OA_submissionScope > OA_referenceScopes > 0 > OA_exportHeader > OA_i18n"}},"time":"2025-01-24T17:39:31.733687866","type":"REACTIVE_ERROR"}],"testInvalidNaturalKey":[{"errortype":"ValidationError","result":{"message":"invalidNaturalKey","params":{"path":"OA_data > especes","invalidNaturalKeyElements":["espNom"],"expectedComponentLabel":["colonne_homonyme_entre_referentiels","esp_definition_en","my_computed_column","esp_nom","esp_definition_fr"]}},"time":"2025-01-24T17:38:42.346340784","type":"REACTIVE_ERROR"}],"testInvalidDurationForCheckerDate":[{"errortype":"ValidationError","result":{"message":"invalidDurationCheckerDate","params":{"declaredDuration":"1 Yearss","path":"OA_data > pem > OA_basicComponents > date > OA_checker > OA_params"}},"time":"2025-01-24T17:39:48.646323477","type":"REACTIVE_ERROR"}],"testMissingRequiredValueForDynamicColumns":[{"errortype":"ValidationError","result":{"message":"missingRequiredValue","params":{"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_reference"}},"time":"2025-01-24T17:39:59.337002375","type":"REACTIVE_ERROR"}],"testUnexpectedNameTagInBasicComponent":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > pem > OA_basicComponents > projet > OA_tags","notExpectedDomainTags":["testz"]}},"time":"2025-01-24T17:38:37.986231043","type":"REACTIVE_ERROR"}],"testunknownComponentNameValidation":[{"errortype":"ValidationError","result":{"message":"unknownComponentForComponentName","params":{"unknownComponent":"sites","knownComponents":["site_bassin","date","tel_experimental_site","site","bassin","projet","espece","ordre_affichage","chemin","tel_experimental_network","plateforme","is_float_value","tel_value"],"path":"OA_data > pem > OA_validations > reference > OA_components"}},"time":"2025-01-24T17:38:35.722885901","type":"REACTIVE_ERROR"}],"testNotExpectedTagsInConstantComponents":[{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":["test","context"],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_tags","notExpectedDomainTags":["testz"]}},"time":"2025-01-24T17:38:26.769197066","type":"REACTIVE_ERROR"}],"testMissingComponentNameInColumnsForAuthorization":[{"errortype":"ValidationError","result":{"message":"missingComponentForComponentName","params":{"knownComponents":["site_bassin","date","tel_experimental_site","site","bassin","projet","espece","ordre_affichage","chemin","tel_experimental_network","plateforme","is_float_value","tel_value"],"path":"OA_data > pem > OA_validations > reference > OA_components"}},"time":"2025-01-24T17:39:54.463304666","type":"REACTIVE_ERROR"}],"testBadDomaineTagPattern":[{"errortype":"ValidationError","result":{"message":"badDomainTagPattern","params":{"path":"OA_tags","domainTagPattern":"^[a-z][a-z_0-9]*[a-z0-9]$"}},"time":"2025-01-24T17:39:40.350177911","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"illegalDomainTagPattern","params":{"reservedTagNames":["NoTag[tagDefinition=NO_TAG, tagName=no_tag]"],"path":"OA_tags","expectedPattern":"^[a-z][a-z_0-9]*[a-z0-9]$"}},"time":"2025-01-24T17:39:40.350525524","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > especes","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:40.350675715","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > especes > OA_basicComponents > esp_nom > OA_tags","notExpectedDomainTags":["test"]}},"time":"2025-01-24T17:39:40.351301788","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > projet","notExpectedDomainTags":["test","context"]}},"time":"2025-01-24T17:39:40.351726685","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > type_de_sites","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:40.352136716","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > sites","notExpectedDomainTags":["context"]}},"time":"2025-01-24T17:39:40.352452213","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > sites > OA_dynamicComponents > proprieteDeTaxon > OA_tags","notExpectedDomainTags":["test","context"]}},"time":"2025-01-24T17:39:40.353156439","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > pem","notExpectedDomainTags":["test","context"]}},"time":"2025-01-24T17:39:40.353320537","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > pem > OA_basicComponents > projet > OA_tags","notExpectedDomainTags":["test"]}},"time":"2025-01-24T17:39:40.353668012","type":"REACTIVE_ERROR"},{"errortype":"ValidationError","result":{"message":"notExpectedDomainTags","params":{"expectedDomainTags":[],"path":"OA_data > pem > OA_constantComponents > tel_experimental_network > OA_tags","notExpectedDomainTags":["test"]}},"time":"2025-01-24T17:39:40.354345239","type":"REACTIVE_ERROR"}]} \ No newline at end of file diff --git a/ui/cypress/fixtures/applications/ore/monsore/changeMonsore.txt b/ui/cypress/fixtures/applications/ore/monsore/changeMonsore.txt index 98c28ba..d461fe9 100644 --- a/ui/cypress/fixtures/applications/ore/monsore/changeMonsore.txt +++ b/ui/cypress/fixtures/applications/ore/monsore/changeMonsore.txt @@ -1,17 +1,17 @@ -{"result":0.0,"time":[2025,1,16,16,39,20,165904848],"type":"REACTIVE_PROGRESS"} -{"result":"application.ChangeConfiguration.configuration.rights.checking","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,20,167825436],"type":"REACTIVE_INFO"} -{"result":0.02,"time":[2025,1,16,16,39,20,167886535],"type":"REACTIVE_PROGRESS"} -{"result":"application.ChangeConfiguration.configuration.parsingConfiguration.forSingle","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,20,167944891],"type":"REACTIVE_INFO"} -{"result":"application.ChangeConfiguration.configuration.testYamlIsvalid","params":null,"time":[2025,1,16,16,39,20,168026249],"type":"REACTIVE_INFO"} -{"result":"application.ChangeConfiguration.configuration.yamlIsvalid","params":null,"time":[2025,1,16,16,39,20,169866589],"type":"REACTIVE_INFO"} -{"result":"application.ChangeConfiguration.configuration.versionIsValid","params":null,"time":[2025,1,16,16,39,20,169935373],"type":"REACTIVE_INFO"} -{"result":0.03,"time":[2025,1,16,16,39,20,169949912],"type":"REACTIVE_PROGRESS"} -{"result":"application.ChangeConfiguration.configuration.Starting parsing of configuration","params":{},"time":[2025,1,16,16,39,20,268058097],"type":"REACTIVE_INFO"} -{"result":0.0,"time":[2025,1,16,16,39,20,268125437],"type":"REACTIVE_PROGRESS"} -{"result":0.0,"time":[2025,1,16,16,39,20,268141567],"type":"REACTIVE_PROGRESS"} -{"result":"application.ChangeConfiguration.configuration.CheckSyntax.startValidation.start","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,20,290502408],"type":"REACTIVE_INFO"} -{"result":"application.configuration.create.register.start","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,20,290563407],"type":"REACTIVE_INFO"} -{"result":"application.ChangeConfiguration.configuration.parsingConfiguration.endparsing","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,20,290585311],"type":"REACTIVE_INFO"} -{"result":"application.register","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,20,335411864],"type":"REACTIVE_INFO"} -{"result":"0f2d5d4b-0425-49a0-8a22-6ad1a29b0425","time":[2025,1,16,16,39,20,347824825],"type":"REACTIVE_RESULT"} -{"result":1.0,"time":[2025,1,16,16,39,20,347930012],"type":"REACTIVE_PROGRESS"} +{"result":0.0,"time":[2025,1,27,14,35,21,318697431],"type":"REACTIVE_PROGRESS"} +{"result":"application.ChangeConfiguration.configuration.rights.checking","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,320733650],"type":"REACTIVE_INFO"} +{"result":0.02,"time":[2025,1,27,14,35,21,320793310],"type":"REACTIVE_PROGRESS"} +{"result":"application.ChangeConfiguration.configuration.parsingConfiguration.forSingle","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,320844150],"type":"REACTIVE_INFO"} +{"result":"application.ChangeConfiguration.configuration.testYamlIsvalid","params":null,"time":[2025,1,27,14,35,21,320870175],"type":"REACTIVE_INFO"} +{"result":"application.ChangeConfiguration.configuration.yamlIsvalid","params":null,"time":[2025,1,27,14,35,21,322106561],"type":"REACTIVE_INFO"} +{"result":"application.ChangeConfiguration.configuration.versionIsValid","params":null,"time":[2025,1,27,14,35,21,322143014],"type":"REACTIVE_INFO"} +{"result":0.03,"time":[2025,1,27,14,35,21,322173348],"type":"REACTIVE_PROGRESS"} +{"result":"application.ChangeConfiguration.configuration.Starting parsing of configuration","params":{},"time":[2025,1,27,14,35,21,425169416],"type":"REACTIVE_INFO"} +{"result":0.0,"time":[2025,1,27,14,35,21,425245308],"type":"REACTIVE_PROGRESS"} +{"result":0.0,"time":[2025,1,27,14,35,21,425264322],"type":"REACTIVE_PROGRESS"} +{"result":"application.ChangeConfiguration.configuration.CheckSyntax.startValidation.start","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,450253761],"type":"REACTIVE_INFO"} +{"result":"application.configuration.create.register.start","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,450321163],"type":"REACTIVE_INFO"} +{"result":"application.ChangeConfiguration.configuration.parsingConfiguration.endparsing","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,450347926],"type":"REACTIVE_INFO"} +{"result":"application.register","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,489379780],"type":"REACTIVE_INFO"} +{"result":"acb7a301-204b-41d8-9698-f778a4d78c70","time":[2025,1,27,14,35,21,503369889],"type":"REACTIVE_RESULT"} +{"result":1.0,"time":[2025,1,27,14,35,21,503464537],"type":"REACTIVE_PROGRESS"} diff --git a/ui/cypress/fixtures/applications/ore/monsore/createMonsore.txt b/ui/cypress/fixtures/applications/ore/monsore/createMonsore.txt index d13012f..d120844 100644 --- a/ui/cypress/fixtures/applications/ore/monsore/createMonsore.txt +++ b/ui/cypress/fixtures/applications/ore/monsore/createMonsore.txt @@ -1,21 +1,21 @@ -{"result":0.0,"time":[2025,1,16,16,39,19,414636223],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.configuration.rights.checking","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,417340150],"type":"REACTIVE_INFO"} -{"result":0.02,"time":[2025,1,16,16,39,19,417580124],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.configuration.parsingConfiguration.forSingle","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,417738521],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.configuration.testYamlIsvalid","params":null,"time":[2025,1,16,16,39,19,417797997],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.configuration.yamlIsvalid","params":null,"time":[2025,1,16,16,39,19,422199516],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.configuration.versionIsValid","params":null,"time":[2025,1,16,16,39,19,422279508],"type":"REACTIVE_INFO"} -{"result":0.03,"time":[2025,1,16,16,39,19,422293798],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.configuration.Starting parsing of configuration","params":{},"time":[2025,1,16,16,39,19,539989215],"type":"REACTIVE_INFO"} -{"result":0.0,"time":[2025,1,16,16,39,19,540057591],"type":"REACTIVE_PROGRESS"} -{"result":0.0,"time":[2025,1,16,16,39,19,540087563],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.configuration.CheckSyntax.startValidation.start","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,571822186],"type":"REACTIVE_INFO"} -{"result":"application.configuration.create.register.start","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,571928459],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.configuration.parsingConfiguration.endparsing","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,572446151],"type":"REACTIVE_INFO"} -{"result":"application.register","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,905155824],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.viewCreation.start","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,905269164],"type":"REACTIVE_INFO"} -{"result":0.5,"time":[2025,1,16,16,39,19,905572537],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.viewCreation.end","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,905627391],"type":"REACTIVE_INFO"} -{"result":"0f2d5d4b-0425-49a0-8a22-6ad1a29b0425","time":[2025,1,16,16,39,19,905645413],"type":"REACTIVE_RESULT"} -{"result":1.0,"time":[2025,1,16,16,39,19,905773189],"type":"REACTIVE_PROGRESS"} -{"result":1.0,"time":[2025,1,16,16,39,19,905813899],"type":"REACTIVE_PROGRESS"} +{"result":0.0,"time":[2025,1,27,14,35,20,579272115],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.configuration.rights.checking","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,20,581661919],"type":"REACTIVE_INFO"} +{"result":0.02,"time":[2025,1,27,14,35,20,581909348],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.configuration.parsingConfiguration.forSingle","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,20,582017261],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.configuration.testYamlIsvalid","params":null,"time":[2025,1,27,14,35,20,582082163],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.configuration.yamlIsvalid","params":null,"time":[2025,1,27,14,35,20,584378355],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.configuration.versionIsValid","params":null,"time":[2025,1,27,14,35,20,584424688],"type":"REACTIVE_INFO"} +{"result":0.03,"time":[2025,1,27,14,35,20,584454014],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.configuration.Starting parsing of configuration","params":{},"time":[2025,1,27,14,35,20,709881076],"type":"REACTIVE_INFO"} +{"result":0.0,"time":[2025,1,27,14,35,20,709977778],"type":"REACTIVE_PROGRESS"} +{"result":0.0,"time":[2025,1,27,14,35,20,709998360],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.configuration.CheckSyntax.startValidation.start","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,20,759528855],"type":"REACTIVE_INFO"} +{"result":"application.configuration.create.register.start","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,20,759618013],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.configuration.parsingConfiguration.endparsing","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,20,760071420],"type":"REACTIVE_INFO"} +{"result":"application.register","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,71353506],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.viewCreation.start","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,71442241],"type":"REACTIVE_INFO"} +{"result":0.5,"time":[2025,1,27,14,35,21,71872955],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.viewCreation.end","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,21,71955208],"type":"REACTIVE_INFO"} +{"result":"acb7a301-204b-41d8-9698-f778a4d78c70","time":[2025,1,27,14,35,21,71990669],"type":"REACTIVE_RESULT"} +{"result":1.0,"time":[2025,1,27,14,35,21,72226249],"type":"REACTIVE_PROGRESS"} +{"result":1.0,"time":[2025,1,27,14,35,21,72288725],"type":"REACTIVE_PROGRESS"} diff --git a/ui/cypress/fixtures/applications/ore/monsore/validateMonsore.txt b/ui/cypress/fixtures/applications/ore/monsore/validateMonsore.txt index 17b10fd..2bee573 100644 --- a/ui/cypress/fixtures/applications/ore/monsore/validateMonsore.txt +++ b/ui/cypress/fixtures/applications/ore/monsore/validateMonsore.txt @@ -1,10 +1,10 @@ -{"result":"application.createConfiguration.testYamlIsvalid","params":null,"time":[2025,1,16,16,39,18,900168044],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.yamlIsvalid","params":null,"time":[2025,1,16,16,39,18,906603802],"type":"REACTIVE_INFO"} -{"result":"application.createConfiguration.versionIsValid","params":null,"time":[2025,1,16,16,39,18,907036888],"type":"REACTIVE_INFO"} -{"result":0.01,"time":[2025,1,16,16,39,18,907460341],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.Starting parsing of configuration","params":{},"time":[2025,1,16,16,39,19,228021189],"type":"REACTIVE_INFO"} -{"result":0.0,"time":[2025,1,16,16,39,19,228522853],"type":"REACTIVE_PROGRESS"} -{"result":0.0,"time":[2025,1,16,16,39,19,228545993],"type":"REACTIVE_PROGRESS"} -{"result":"application.createConfiguration.CheckSyntax.startValidation.start","params":{"applicationName":"monsore"},"time":[2025,1,16,16,39,19,273517981],"type":"REACTIVE_INFO"} -{"result":{"id":"79984f88-2b9d-4ace-85f4-927d4d9bbffb","creationDate":null,"updateDate":null,"lastChartes":5336473980199903000,"name":"monsore","version":null,"data":["themes","especes","variables","type_de_sites","site_theme_datatype","unites","projet","valeurs_qualitatives","type_de_fichiers","variables_et_unites_par_types_de_donnees","pem","sites"],"additionalFiles":["fichiers","utilisateurs"],"configuration":{"version":{"version":"2.0.1","runTimeVersion":{}},"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"},{"tagDefinition":"DOMAIN_TAG","tagName":"data"},{"tagDefinition":"DOMAIN_TAG","tagName":"test"},{"tagDefinition":"DOMAIN_TAG","tagName":"unit"},{"tagDefinition":"DOMAIN_TAG","tagName":"temporal"}],"i18n":{"tags":{"unit":{"en":"Unit","fr":"Unité"},"data":{"en":"Data","fr":"Donnée"},"test":{"en":"Test","fr":"Test"},"context":{"en":"Context","fr":"Contexte"},"temporal":{"en":"Temporality","fr":"Temporalité"}},"application":{"title":{"en":"SOERE my SOERE","fr":"SOERE mon SOERE"},"description":{"en":"SOERE my SOERE","fr":"SOERE mon SOERE"}},"data":{"themes":{"validations":{},"exceptions":{},"components":{"description_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La definition du thème"}}},"description_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Thematic definition"}}},"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Site name"}}},"nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"Le nom du thème"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{description_en}","fr":"{description_fr}"}},"i18n":{"title":{"en":"Thematic","fr":"Thème"},"description":{"en":"Thematic list","fr":"Liste des thèmes"}}},"variables":{"validations":{},"exceptions":{},"components":{"definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Variable definition"}}},"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Variable name"}}},"nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"Le nom de la variable"}}},"definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La définition de la variable"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{definition_en}","fr":"{definition_fr}"}},"i18n":{"title":{"en":"Variables","fr":"Variables"},"description":{"en":"Variables list","fr":"Liste des variables"}}},"especes":{"validations":{},"exceptions":{},"components":{"my_computed_column":{"exportHeader":{"title":{"en":"computed column","fr":"colonne calculée"},"description":{"en":"a calculated column returning 'my value'","fr":"une colonne calculée retournant 'my value'"}}},"esp_definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"species definition"}}},"esp_definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"définition de l'espèce"}}},"esp_nom":{"exportHeader":{"title":{"en":"code","fr":"code"},"description":{"en":"code name of the species","fr":"nom codique de l'espèce"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{esp_nom}","fr":"{esp_nom}"},"description":{"en":"{esp_definition_en}","fr":"{esp_definition_fr}"}},"i18n":{"title":{"en":"Species","fr":"Espèces"},"description":{"en":"Description of species fished in the watershed","fr":"Description des espèces pêchées sur le bassin versant"}}},"site_theme_datatype":{"validations":{"checkDatatype":{"fr":"test"},"projetRef":{"fr":"référence au projet"},"sitesRef":{"fr":"référence au site"},"themesRef":{"fr":"référence au theme"}},"exceptions":{},"components":{},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"projet name: {projet}, site name : {site}, theme name : {theme}, data type name : {datatype}","fr":"nom du projet: {projet}, nom du site : {site}, nom du thème : {theme}, nom du type de données : {datatype}"},"description":{"en":"Join on projet name: {projet}, site name : {site}, theme name : {theme}, data type name : {datatype}","fr":"Jointure nom du projet: {projet}, nom du site : {site}, nom du thème : {theme}, nom du type de données : {datatype}"}},"i18n":{"title":{"en":"Data types by site and project","fr":"Types de données par site et projet"},"description":{"en":"Join table of theme sites and datatypes","fr":"Table de jointure des sites theme et datatypes"}}},"type_de_sites":{"validations":{},"exceptions":{},"components":{"tze_nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"La nom du type de sites"}}},"tze_nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Site type name"}}},"tze_definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Site type definition"}}},"tze_definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La definition du type de site"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{tze_nom_en}","fr":"{tze_nom_fr}"},"description":{"en":"{tze_definition_en}","fr":"{tze_definition_fr}"}},"i18n":{"title":{"en":"Sites types","fr":"Types de sites"},"description":{"en":"Sites types list","fr":"Liste des types de sites"}}},"unites":{"validations":{},"exceptions":{},"components":{"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Unit name"}}},"code_en":{"exportHeader":{"title":{"en":"code"},"description":{"en":"Unit code"}}},"nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"La nom de l'unité"}}},"code_fr":{"exportHeader":{"title":{"fr":"code"},"description":{"fr":"Le code du unité"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en} ({code_key})","fr":"{nom_fr} ({code_key})"},"description":{}},"i18n":{"title":{"en":"Units","fr":"Unités"},"description":{"en":"Units list","fr":"Liste des unités"}}},"projet":{"validations":{},"exceptions":{},"components":{"definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"project definition"}}},"nom_en":{"exportHeader":{"title":{"en":"Name"},"description":{"en":"Project name"}}},"nom_fr":{"exportHeader":{"title":{"fr":"Nom"},"description":{"fr":"Nom du projet"}}},"definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"définition du projet"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{definition_en}","fr":"{definition_fr}"}},"i18n":{"title":{"en":"Project","fr":"Projet"},"description":{"en":"List of information system projects","fr":"Liste des projets du système d'information"}}},"valeurs_qualitatives":{"validations":{},"exceptions":{},"components":{"valeur_fr":{"exportHeader":{"title":{"fr":"valeur"},"description":{"fr":"La valeur dans la liste"}}},"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"The name list"}}},"valeur_en":{"exportHeader":{"title":{"en":"value"},"description":{"en":"The value in list"}}},"nom_fr":{"exportHeader":{"title":{"fr":"Nom"},"description":{"fr":"Le nom de la liste"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{valeur_en}","fr":"{valeur_fr}"},"description":{"en":"{valeur_en} of {nom_en}","fr":"{valeur_fr} de {nom_fr}"}},"i18n":{"title":{"en":"Qualitative values","fr":"Valeurs qualitatives"},"description":{"en":"List of qualitative values list","fr":"Liste de liste de valeurs qualitatives"}}},"variables_et_unites_par_types_de_donnees":{"validations":{"checkDatatype":{"fr":"test"},"uniteRef":{"fr":"référence à l'unité'"},"variableRef":{"fr":"référence à la variable"}},"exceptions":{},"components":{},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"datatype name : {datatype}, variable name : {variable}, : unit name {unite}","fr":"nom du type de données : {datatype}, nom de la variable : {variable}, : nom de l'unité {unite}"},"description":{"en":"Join ondatatype name : {datatype}, variable name : {variable}, : unit name {unite}","fr":"Jointure des nom du type de données : {datatype}, nom de la variable : {variable}, : nom de l'unité {unite}"}},"i18n":{"title":{"en":"Variables and units by data type","fr":"Variables et unités par type de données"},"description":{"en":"Variables and units by data type join list","fr":"Liste de jointure des variables et unités par type de données"}}},"type_de_fichiers":{"validations":{},"exceptions":{},"components":{"description_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Thematic definition"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{description_en}","fr":"{description_fr}"}},"i18n":{"title":{"en":"Files types","fr":"Types de fichiers"},"description":{"en":"The files types","fr":"Les types de fichiers"}}},"pem":{"validations":{"unitOfIndividus":{"fr":"vérifie l'unité du nombre d'individus"},"unitOfColor":{"fr":"vérifie l'unité de la couleur des individus"}},"exceptions":{},"components":{"chemin":{"exportHeader":{"title":{"en":"Path","fr":"Chemin"},"description":{"en":"Data calculating the full path of the site","fr":"Données calculant le chemin complet du site"}}},"color_value":{"exportHeader":{"title":{"en":"United colors","fr":"Couleur des individus"},"description":{}}},"individusNumbervalue":{"exportHeader":{"title":{"en":"Number of individuals","fr":"Nombre d'individus"},"description":{}}}},"submissions":{"referenceScopes":{"projet":{"title":{"en":"project","fr":"projet"},"description":{"en":"Choose the project","fr":"Choisissez le projet"}},"sites":{"title":{"en":"site","fr":"site"},"description":{"en":"The site","fr":"Le site"}}}},"i18nDisplayPattern":null,"i18n":{"title":{"en":"Trap in ascent","fr":"Piégeage en Montée"},"description":{"en":"Upstream trapping fishing data","fr":"Données de pêche par piégeage en Montée"}}},"sites":{"validations":{},"exceptions":{},"components":{"zet_description_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"site definition"}}},"zet_nom_fr":{"exportHeader":{"title":{"fr":"Nom du site"},"description":{"fr":"Le nom du site"}}},"zet_nom_en":{"exportHeader":{"title":{"en":"Site name"},"description":{"en":"The site name"}}},"zet_description_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La definition du site"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{zet_chemin_parent} - {zet_nom_fr}","fr":"{zet_chemin_parent} - {zet_nom_fr} "},"description":{"en":"{zet_description_en}","fr":"{zet_description_fr}"}},"i18n":{"title":{"en":"Site","fr":"Site"},"description":{"en":"Sites list","fr":"Liste des sites du système d'information"}}}},"rightsrequest":{"fields":{"endDate":{"title":{"en":"Give the project end date","fr":"Date de fin du projet"},"description":{"en":"Project end date","fr":"Donnez la date de fin du projet"}},"organization":{"title":{"en":"Name of research organization","fr":"Nom de l'organisme de recherche"},"description":{"en":"Usual ame of research organization","fr":"Nom usuel de l'organisme de recherche"}},"project":{"title":{"en":"Description of the research project","fr":"Description du projet de recherche"},"description":{"en":"Describe your the research project","fr":"Donnez une description du projet de recherche"}},"startDate":{"title":{"en":"Project start date","fr":"Date de début du projet"},"description":{"en":"Give the project start date","fr":"Donnez la date de début du projet"}}},"i18n":{"title":{"en":"You can request rights to the monsore application by filling out this form","fr":"Vous pouvez demander des droits à l'application monsore en remplissant ce formulaire"},"description":{"en":"Monsoere Data Access Right Request Form","fr":"Formulaire de demande de droit d'accès aux données de Monsoere"}}},"additionalFiles":{"utilisateurs":{"i18n":{"title":{"en":"Users","fr":"Utilsateurs"},"description":{"en":"System User Description Files","fr":"Fichiers de dexcription des utilisateurs du système"}},"fields":{"prenom":{"title":{"en":"Surname","fr":"Prénom"},"description":{"en":"User surname","fr":"Prénom de l'utilisateur"}},"nom":{"title":{"en":"Name","fr":"Nom"},"description":{"en":"User name","fr":"Nom de l'utilisateur"}}}},"fichiers":{"i18n":{"title":{"en":"Files","fr":"Fichiers"},"description":{"en":"Various files relating to the Information System","fr":"Différents fichiers afférents au Système d'Information"}},"fields":{"date":{"title":{"en":"Date","fr":"Date"},"description":{"en":"The date the file was updated","fr":"La date de mise à jour du fichier"}},"site":{"title":{"en":"Place","fr":"Site"},"description":{"en":"Site described by the file","fr":"Site décrit par le fichier"}},"poids":{"title":{"en":"Weight","fr":"Poids"},"description":{"en":"File size in kb","fr":"Poids du fichier en ko"}},"nom":{"title":{"en":"Name","fr":"Nom"},"description":{"en":"The name of the file for download","fr":"Le nom du fichier pour téléchargement"}},"age":{"title":{"en":"Age","fr":"Age"},"description":{"en":"Minimum age for file access","fr":"Age minumum d'accès au fichier"}}}}}},"applicationDescription":{"name":"monsore","version":{"version":"3.0.1","runTimeVersion":{}},"defaultLanguage":"fr","comment":"Fichier de test de l'application brokenADOM version initiale"},"dataDescription":{"themes":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"description_fr":{"type":"BasicComponent","componentKey":"description_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_fr","exportHeaderName":"description_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"description_en":{"type":"BasicComponent","componentKey":"description_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_en","exportHeaderName":"description_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"especes":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["esp_nom"],"componentDescriptions":{"colonne_homonyme_entre_referentiels":{"type":"BasicComponent","componentKey":"colonne_homonyme_entre_referentiels","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"colonne_homonyme_entre_referentiels","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"esp_definition_en":{"type":"BasicComponent","componentKey":"esp_definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"esp_definition_en","exportHeaderName":"esp_definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"my_computed_column":{"type":"ComputedComponent","componentKey":"my_computed_column","tags":[{"tagDefinition":"HIDDEN_TAG"}],"exportHeaderName":"my_computed_column","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"return \"my value\";\n","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"hidden":true,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"esp_nom":{"type":"BasicComponent","componentKey":"esp_nom","defaultValue":null,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"test"}],"importHeader":"esp_nom","exportHeaderName":"esp_nom","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"esp_definition_fr":{"type":"BasicComponent","componentKey":"esp_definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"esp_definition_fr","exportHeaderName":"esp_definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"variables":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"definition_en":{"type":"BasicComponent","componentKey":"definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_en","exportHeaderName":"definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"is_qualitative":{"type":"BasicComponent","componentKey":"is_qualitative","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"isQualitative","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"definition_fr":{"type":"BasicComponent","componentKey":"definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_fr","exportHeaderName":"definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"type_de_sites":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["tze_nom_key"],"componentDescriptions":{"tze_nom_key":{"type":"BasicComponent","componentKey":"tze_nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"tze_nom_fr":{"type":"BasicComponent","componentKey":"tze_nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_nom_fr","exportHeaderName":"tze_nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"tze_definition_fr":{"type":"BasicComponent","componentKey":"tze_definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_definition_fr","exportHeaderName":"tze_definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"tze_nom_en":{"type":"BasicComponent","componentKey":"tze_nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_nom_en","exportHeaderName":"tze_nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"tze_definition_en":{"type":"BasicComponent","componentKey":"tze_definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_definition_en","exportHeaderName":"tze_definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"site_theme_datatype":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["projet","site","theme","datatype"],"componentDescriptions":{"site":{"type":"BasicComponent","componentKey":"site","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du site","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"theme":{"type":"BasicComponent","componentKey":"theme","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du thème","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"projet":{"type":"BasicComponent","componentKey":"projet","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du projet","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"datatype":{"type":"BasicComponent","componentKey":"datatype","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du type de données","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{"projetRef":{"checkers":{"projet":{"type":"ReferenceChecker","componentKey":"projet","multiplicity":"ONE","required":false,"refType":"projet","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["projet"],"required":false,"mandatory":"OPTIONAL"},"sitesRef":{"checkers":{"site":{"type":"ReferenceChecker","componentKey":"site","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["site"],"required":false,"mandatory":"OPTIONAL"},"themesRef":{"checkers":{"theme":{"type":"ReferenceChecker","componentKey":"theme","multiplicity":"ONE","required":false,"refType":"themes","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["theme"],"required":false,"mandatory":"OPTIONAL"},"checkDatatype":{"checkers":{"datatype":{"type":"GroovyExpressionChecker","multiplicity":"ONE","required":false,"expression":"String datatype = datum.datatype; def data = application.getConfiguration().i18n().data ; if(data==null){\n return false;\n}; def i18n = data\n .collect{ it->it.value.i18n};\nif(i18n==null){\n return false;\n}; def title = i18n \n .collect{ it->it.title};\nif(title==null){\n return false;\n}; def french = title\n .collect { it->it.get(java.util.Locale.FRENCH)};\nreturn french \n .find{it->datatype.equals(fr.inra.oresing.domain.application.configuration.Ltree.fromUnescapedString(it.toString()).sql)}!=null;\n","references":null,"exceptionMessages":[],"codify":true,"data":null}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["datatype"],"required":false,"mandatory":"OPTIONAL"}},"depends":[],"migrations":null,"hidden":false,"order":9999},"unites":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["nom_key"],"componentDescriptions":{"code_en":{"type":"BasicComponent","componentKey":"code_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"code_en","exportHeaderName":"code_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"code_key":{"type":"BasicComponent","componentKey":"code_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"code_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"code_fr":{"type":"BasicComponent","componentKey":"code_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"code_fr","exportHeaderName":"code_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"projet":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"},{"tagDefinition":"DOMAIN_TAG","tagName":"test"},{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"definition_en":{"type":"BasicComponent","componentKey":"definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_en","exportHeaderName":"definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"colonne_homonyme_entre_referentiels":{"type":"BasicComponent","componentKey":"colonne_homonyme_entre_referentiels","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"colonne_homonyme_entre_referentiels","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"definition_fr":{"type":"BasicComponent","componentKey":"definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_fr","exportHeaderName":"definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"valeurs_qualitatives":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["nom_key","valeur_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"valeur_en":{"type":"BasicComponent","componentKey":"valeur_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"valeur_en","exportHeaderName":"valeur_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"valeur_key":{"type":"BasicComponent","componentKey":"valeur_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"valeur_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"valeur_fr":{"type":"BasicComponent","componentKey":"valeur_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"valeur_fr","exportHeaderName":"valeur_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"type_de_fichiers":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"HIDDEN_TAG"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"description_fr":{"type":"BasicComponent","componentKey":"description_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_fr","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"description_en":{"type":"BasicComponent","componentKey":"description_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_en","exportHeaderName":"description_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":true,"order":9999},"variables_et_unites_par_types_de_donnees":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["datatype","variable"],"componentDescriptions":{"variable":{"type":"BasicComponent","componentKey":"variable","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom de la variable","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"datatype":{"type":"BasicComponent","componentKey":"datatype","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du type de données","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"unite":{"type":"BasicComponent","componentKey":"unite","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom de l'unité","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false}},"submission":null,"authorization":null,"validations":{"variableRef":{"checkers":{"variable":{"type":"ReferenceChecker","componentKey":"variable","multiplicity":"ONE","required":false,"refType":"variables","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["variable"],"required":false,"mandatory":"OPTIONAL"},"uniteRef":{"checkers":{"unite":{"type":"ReferenceChecker","componentKey":"unite","multiplicity":"ONE","required":false,"refType":"unites","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["unite"],"required":false,"mandatory":"OPTIONAL"},"checkDatatype":{"checkers":{"datatype":{"type":"GroovyExpressionChecker","multiplicity":"ONE","required":false,"expression":"String datatype = datum.datatype; def data = application.getConfiguration().i18n().data ; if(data==null){\n return false;\n}; def i18n = data\n .collect{ it->it.value.i18n};\nif(i18n==null){\n return false;\n}; def title = i18n \n .collect{ it->it.title};\nif(title==null){\n return false;\n}; def french = title\n .collect { it->it.get(java.util.Locale.FRENCH)};\nreturn french \n .find{it->datatype.equals(fr.inra.oresing.domain.application.configuration.Ltree.fromUnescapedString(it.toString()).sql)}!=null;\n","references":null,"exceptionMessages":[],"codify":true,"data":null}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["datatype"],"required":false,"mandatory":"OPTIONAL"}},"depends":[],"migrations":null,"hidden":false,"order":9999},"pem":{"separator":";","headerLine":4,"firstRowLine":5,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"ORDER_TAG","tagOrder":2},{"tagDefinition":"DOMAIN_TAG","tagName":"data"},{"tagDefinition":"DOMAIN_TAG","tagName":"test"},{"tagDefinition":"DOMAIN_TAG","tagName":"context"},{"tagDefinition":"DATA_TAG"}],"naturalKey":["projet","site","plateforme","date","espece"],"componentDescriptions":{"date":{"type":"BasicComponent","componentKey":"date","defaultValue":null,"tags":[{"tagDefinition":"ORDER_TAG","tagOrder":1},{"tagDefinition":"DOMAIN_TAG","tagName":"temporal"}],"importHeader":"date","exportHeaderName":null,"langRestrictions":[],"required":true,"mandatory":"OPTIONAL","checker":{"type":"DateChecker","multiplicity":"ONE","required":true,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"site":{"type":"BasicComponent","componentKey":"site","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"site","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"site","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"sites","chartDescription":null,"reference":true},"individusNumber_unit":{"type":"ComputedComponent","componentKey":"individusNumber_unit","tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"exportHeaderName":null,"langRestrictions":[],"required":true,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"individusNumber_unit","multiplicity":"ONE","required":true,"refType":"unites","isRecursive":false,"isParent":false},"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":true,"expression":"'sans_unite'","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"unites","chartDescription":null,"reference":true},"projet":{"type":"BasicComponent","componentKey":"projet","defaultValue":null,"tags":[{"tagDefinition":"ORDER_TAG","tagOrder":2},{"tagDefinition":"DOMAIN_TAG","tagName":"test"}],"importHeader":"projet","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"projet","multiplicity":"ONE","required":false,"refType":"projet","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"projet","chartDescription":null,"reference":true},"espece":{"type":"BasicComponent","componentKey":"espece","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"espece","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"espece","multiplicity":"ONE","required":false,"refType":"especes","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"especes","chartDescription":null,"reference":true},"chemin":{"type":"ComputedComponent","componentKey":"chemin","tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"exportHeaderName":"chemin","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"chemin","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":false,"isParent":false},"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"return OA_buildCompositeKey(['site','plateforme']);\n","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"sites","chartDescription":null,"reference":true},"plateforme":{"type":"BasicComponent","componentKey":"plateforme","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"plateforme","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"color_value":{"type":"BasicComponent","componentKey":"color_value","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"Couleur des individus","exportHeaderName":"color_value","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"color_value","multiplicity":"ONE","required":false,"refType":"valeurs_qualitatives","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"valeurs_qualitatives","chartDescription":null,"reference":true},"individusNumbervalue":{"type":"BasicComponent","componentKey":"individusNumbervalue","defaultValue":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"return 0","references":null,"exceptionMessages":[],"codify":false,"data":null},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"Nombre d'individus","exportHeaderName":"individusNumbervalue","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"color_unit":{"type":"ComputedComponent","componentKey":"color_unit","tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"color_unit","multiplicity":"ONE","required":false,"refType":"unites","isRecursive":false,"isParent":false},"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"'sans_unite'","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"unites","chartDescription":null,"reference":true}},"submission":{"strategy":"OA_VERSIONING","fileNameParsing":{"pattern":"(.*)!(.*)!(.*)!(.*).csv","authorizationScopes":["projet","chemin"],"startDate":3,"endDate":4},"submissionScope":{"referenceScopes":[{"reference":"projet","component":"projet"},{"reference":"sites","component":"chemin"}],"timescope":{"component":"date"}}},"authorization":{"authorizationScope":[{"component":"projet","data":"projet"},{"component":"chemin","data":"sites"}],"timeScope":"date"},"validations":{"unitOfColor":{"checkers":{},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":null,"required":false,"mandatory":"OPTIONAL"},"unitOfIndividus":{"checkers":{},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":null,"required":true,"mandatory":"OPTIONAL"}},"depends":[{"type":"DependsReferences","references":"sites","component":"site"},{"type":"DependsReferences","references":"unites","component":"individusNumber_unit"},{"type":"DependsReferences","references":"projet","component":"projet"},{"type":"DependsReferences","references":"especes","component":"espece"},{"type":"DependsReferences","references":"sites","component":"chemin"},{"type":"DependsReferences","references":"valeurs_qualitatives","component":"color_value"},{"type":"DependsReferences","references":"unites","component":"color_unit"}],"migrations":null,"hidden":false,"order":2},"sites":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["zet_chemin_parent","zet_nom_key"],"componentDescriptions":{"tze_type_nom":{"type":"BasicComponent","componentKey":"tze_type_nom","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_type_nom","exportHeaderName":null,"langRestrictions":[],"required":true,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"tze_type_nom","multiplicity":"ONE","required":true,"refType":"type_de_sites","isRecursive":false,"isParent":true},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"type_de_sites","chartDescription":null,"reference":true},"zet_description_en":{"type":"BasicComponent","componentKey":"zet_description_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_description_en","exportHeaderName":"zet_description_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"zet_nom_fr":{"type":"BasicComponent","componentKey":"zet_nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_nom_fr","exportHeaderName":"zet_nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"zet_nom_key":{"type":"BasicComponent","componentKey":"zet_nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"zet_nom_en":{"type":"BasicComponent","componentKey":"zet_nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_nom_en","exportHeaderName":"zet_nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"zet_description_fr":{"type":"BasicComponent","componentKey":"zet_description_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_description_fr","exportHeaderName":"zet_description_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"StringChecker","chartDescription":null,"reference":false},"zet_chemin_parent":{"type":"BasicComponent","componentKey":"zet_chemin_parent","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_chemin_parent","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"zet_chemin_parent","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":true,"isParent":true},"submissionAuthorizationScope":null,"hidden":false,"referenceCheckerType":"sites","chartDescription":null,"reference":true}},"submission":null,"authorization":null,"validations":{},"depends":[{"type":"DependsParent","references":"type_de_sites","component":"tze_type_nom"},{"type":"DependsParent","references":"sites","component":"zet_chemin_parent"}],"migrations":null,"hidden":false,"order":9999}},"rightsRequest":{"formFields":{"organization":{"order":0,"type":"RightsRequestField","required":true,"checker":{"type":"StringChecker","multiplicity":"ONE","required":true,"pattern":".*"}},"project":{"order":1,"type":"RightsRequestField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":".*"}},"startDate":{"order":2,"type":"RightsRequestField","required":false,"checker":{"type":"DateChecker","multiplicity":"ONE","required":false,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null}},"endDate":{"order":3,"type":"RightsRequestField","required":false,"checker":{"type":"DateChecker","multiplicity":"ONE","required":false,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null}}}},"additionalFiles":{"fichiers":{"formFields":{"nom":{"order":0,"type":"AdditionalFileField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":"[a-z]*"}},"date":{"order":1,"type":"AdditionalFileField","required":false,"checker":{"type":"DateChecker","multiplicity":"ONE","required":false,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null}},"age":{"order":2,"type":"AdditionalFileField","required":false,"checker":{"type":"IntegerChecker","multiplicity":"ONE","required":false,"min":-2147483648,"max":2147483647}},"poids":{"order":3,"type":"AdditionalFileField","required":false,"checker":{"type":"FloatChecker","multiplicity":"ONE","required":false,"min":10.0,"max":100.0}},"site":{"order":4,"type":"AdditionalFileField","required":true,"checker":{"type":"ReferenceChecker","componentKey":"site","multiplicity":"ONE","required":true,"refType":"sites","isRecursive":false,"isParent":false}}}},"utilisateurs":{"formFields":{"nom":{"order":0,"type":"AdditionalFileField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":"[a-z]*"}},"prenom":{"order":1,"type":"AdditionalFileField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":"[a-z]*"}}}}},"hierarchicalNodes":[{"nodeName":"especes","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"projet","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"pem","componentKey":"color_unit","columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":["sites","unites","projet","especes","valeurs_qualitatives","type_de_sites"],"order":2,"isRecursive":false},{"nodeName":"themes","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"site_theme_datatype","componentKey":"theme","columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":["sites","projet","themes","type_de_sites"],"order":9999,"isRecursive":false},{"nodeName":"type_de_fichiers","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"type_de_sites","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[{"nodeName":"sites","componentKey":"zet_chemin_parent","columnToLookUpForRecursive":"zet_chemin_parent","parent":"type_de_sites","children":[],"depends":["type_de_sites"],"order":9999,"isRecursive":true}],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"unites","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"valeurs_qualitatives","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"variables","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"variables_et_unites_par_types_de_donnees","componentKey":"variable","columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":["unites","variables"],"order":9999,"isRecursive":false}],"requiredAuthorizationsAttributes":["themes","variables","especes","site_theme_datatype","type_de_sites","unites","projet","valeurs_qualitatives","variables_et_unites_par_types_de_donnees","type_de_fichiers","pem","sites"],"hiddenData":["type_de_fichiers"]},"configFile":null,"allDataNames":["especes","projet","sites","themes","type_de_sites","site_theme_datatype","type_de_fichiers","unites","valeurs_qualitatives","variables","variables_et_unites_par_types_de_donnees","pem"]},"time":[2025,1,16,16,39,19,274393517],"type":"REACTIVE_RESULT"} -{"result":1.0,"time":[2025,1,16,16,39,19,274813887],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.testYamlIsvalid","params":null,"time":[2025,1,27,14,35,19,56584458],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.yamlIsvalid","params":null,"time":[2025,1,27,14,35,19,62010906],"type":"REACTIVE_INFO"} +{"result":"application.createConfiguration.versionIsValid","params":null,"time":[2025,1,27,14,35,19,62400757],"type":"REACTIVE_INFO"} +{"result":0.01,"time":[2025,1,27,14,35,19,63177446],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.Starting parsing of configuration","params":{},"time":[2025,1,27,14,35,19,503641913],"type":"REACTIVE_INFO"} +{"result":0.0,"time":[2025,1,27,14,35,19,504272532],"type":"REACTIVE_PROGRESS"} +{"result":0.0,"time":[2025,1,27,14,35,19,504836962],"type":"REACTIVE_PROGRESS"} +{"result":"application.createConfiguration.CheckSyntax.startValidation.start","params":{"applicationName":"monsore"},"time":[2025,1,27,14,35,20,403496272],"type":"REACTIVE_INFO"} +{"result":{"id":"4aa54dc2-084f-4bed-b270-29b4b621c8c8","creationDate":null,"updateDate":null,"lastChartes":5336473980199903000,"name":"monsore","version":null,"data":["themes","especes","variables","type_de_sites","site_theme_datatype","unites","projet","valeurs_qualitatives","type_de_fichiers","variables_et_unites_par_types_de_donnees","pem","sites"],"additionalFiles":["fichiers","utilisateurs"],"configuration":{"version":{"version":"2.0.1","runTimeVersion":{}},"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"},{"tagDefinition":"DOMAIN_TAG","tagName":"data"},{"tagDefinition":"DOMAIN_TAG","tagName":"test"},{"tagDefinition":"DOMAIN_TAG","tagName":"unit"},{"tagDefinition":"DOMAIN_TAG","tagName":"temporal"}],"i18n":{"tags":{"unit":{"en":"Unit","fr":"Unité"},"data":{"en":"Data","fr":"Donnée"},"test":{"en":"Test","fr":"Test"},"context":{"en":"Context","fr":"Contexte"},"temporal":{"en":"Temporality","fr":"Temporalité"}},"application":{"title":{"en":"SOERE my SOERE","fr":"SOERE mon SOERE"},"description":{"en":"SOERE my SOERE","fr":"SOERE mon SOERE"}},"data":{"themes":{"validations":{},"exceptions":{},"components":{"description_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La definition du thème"}}},"description_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Thematic definition"}}},"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Site name"}}},"nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"Le nom du thème"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{description_en}","fr":"{description_fr}"}},"i18n":{"title":{"en":"Thematic","fr":"Thème"},"description":{"en":"Thematic list","fr":"Liste des thèmes"}}},"variables":{"validations":{},"exceptions":{},"components":{"definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Variable definition"}}},"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Variable name"}}},"nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"Le nom de la variable"}}},"definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La définition de la variable"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{definition_en}","fr":"{definition_fr}"}},"i18n":{"title":{"en":"Variables","fr":"Variables"},"description":{"en":"Variables list","fr":"Liste des variables"}}},"especes":{"validations":{},"exceptions":{},"components":{"my_computed_column":{"exportHeader":{"title":{"en":"computed column","fr":"colonne calculée"},"description":{"en":"a calculated column returning 'my value'","fr":"une colonne calculée retournant 'my value'"}}},"esp_definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"species definition"}}},"esp_definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"définition de l'espèce"}}},"esp_nom":{"exportHeader":{"title":{"en":"code","fr":"code"},"description":{"en":"code name of the species","fr":"nom codique de l'espèce"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{esp_nom}","fr":"{esp_nom}"},"description":{"en":"{esp_definition_en}","fr":"{esp_definition_fr}"}},"i18n":{"title":{"en":"Species","fr":"Espèces"},"description":{"en":"Description of species fished in the watershed","fr":"Description des espèces pêchées sur le bassin versant"}}},"site_theme_datatype":{"validations":{"checkDatatype":{"fr":"test"},"projetRef":{"fr":"référence au projet"},"sitesRef":{"fr":"référence au site"},"themesRef":{"fr":"référence au theme"}},"exceptions":{},"components":{},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"projet name: {projet}, site name : {site}, theme name : {theme}, data type name : {datatype}","fr":"nom du projet: {projet}, nom du site : {site}, nom du thème : {theme}, nom du type de données : {datatype}"},"description":{"en":"Join on projet name: {projet}, site name : {site}, theme name : {theme}, data type name : {datatype}","fr":"Jointure nom du projet: {projet}, nom du site : {site}, nom du thème : {theme}, nom du type de données : {datatype}"}},"i18n":{"title":{"en":"Data types by site and project","fr":"Types de données par site et projet"},"description":{"en":"Join table of theme sites and datatypes","fr":"Table de jointure des sites theme et datatypes"}}},"type_de_sites":{"validations":{},"exceptions":{},"components":{"tze_nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"La nom du type de sites"}}},"tze_nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Site type name"}}},"tze_definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Site type definition"}}},"tze_definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La definition du type de site"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{tze_nom_en}","fr":"{tze_nom_fr}"},"description":{"en":"{tze_definition_en}","fr":"{tze_definition_fr}"}},"i18n":{"title":{"en":"Sites types","fr":"Types de sites"},"description":{"en":"Sites types list","fr":"Liste des types de sites"}}},"unites":{"validations":{},"exceptions":{},"components":{"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"Unit name"}}},"code_en":{"exportHeader":{"title":{"en":"code"},"description":{"en":"Unit code"}}},"nom_fr":{"exportHeader":{"title":{"fr":"nom"},"description":{"fr":"La nom de l'unité"}}},"code_fr":{"exportHeader":{"title":{"fr":"code"},"description":{"fr":"Le code du unité"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en} ({code_key})","fr":"{nom_fr} ({code_key})"},"description":{}},"i18n":{"title":{"en":"Units","fr":"Unités"},"description":{"en":"Units list","fr":"Liste des unités"}}},"projet":{"validations":{},"exceptions":{},"components":{"definition_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"project definition"}}},"nom_en":{"exportHeader":{"title":{"en":"Name"},"description":{"en":"Project name"}}},"nom_fr":{"exportHeader":{"title":{"fr":"Nom"},"description":{"fr":"Nom du projet"}}},"definition_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"définition du projet"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{definition_en}","fr":"{definition_fr}"}},"i18n":{"title":{"en":"Project","fr":"Projet"},"description":{"en":"List of information system projects","fr":"Liste des projets du système d'information"}}},"valeurs_qualitatives":{"validations":{},"exceptions":{},"components":{"valeur_fr":{"exportHeader":{"title":{"fr":"valeur"},"description":{"fr":"La valeur dans la liste"}}},"nom_en":{"exportHeader":{"title":{"en":"name"},"description":{"en":"The name list"}}},"valeur_en":{"exportHeader":{"title":{"en":"value"},"description":{"en":"The value in list"}}},"nom_fr":{"exportHeader":{"title":{"fr":"Nom"},"description":{"fr":"Le nom de la liste"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{valeur_en}","fr":"{valeur_fr}"},"description":{"en":"{valeur_en} of {nom_en}","fr":"{valeur_fr} de {nom_fr}"}},"i18n":{"title":{"en":"Qualitative values","fr":"Valeurs qualitatives"},"description":{"en":"List of qualitative values list","fr":"Liste de liste de valeurs qualitatives"}}},"variables_et_unites_par_types_de_donnees":{"validations":{"checkDatatype":{"fr":"test"},"uniteRef":{"fr":"référence à l'unité'"},"variableRef":{"fr":"référence à la variable"}},"exceptions":{},"components":{},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"datatype name : {datatype}, variable name : {variable}, : unit name {unite}","fr":"nom du type de données : {datatype}, nom de la variable : {variable}, : nom de l'unité {unite}"},"description":{"en":"Join ondatatype name : {datatype}, variable name : {variable}, : unit name {unite}","fr":"Jointure des nom du type de données : {datatype}, nom de la variable : {variable}, : nom de l'unité {unite}"}},"i18n":{"title":{"en":"Variables and units by data type","fr":"Variables et unités par type de données"},"description":{"en":"Variables and units by data type join list","fr":"Liste de jointure des variables et unités par type de données"}}},"type_de_fichiers":{"validations":{},"exceptions":{},"components":{"description_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"Thematic definition"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{nom_en}","fr":"{nom_fr}"},"description":{"en":"{description_en}","fr":"{description_fr}"}},"i18n":{"title":{"en":"Files types","fr":"Types de fichiers"},"description":{"en":"The files types","fr":"Les types de fichiers"}}},"pem":{"validations":{"unitOfIndividus":{"fr":"vérifie l'unité du nombre d'individus"},"unitOfColor":{"fr":"vérifie l'unité de la couleur des individus"}},"exceptions":{},"components":{"chemin":{"exportHeader":{"title":{"en":"Path","fr":"Chemin"},"description":{"en":"Data calculating the full path of the site","fr":"Données calculant le chemin complet du site"}}},"color_value":{"exportHeader":{"title":{"en":"United colors","fr":"Couleur des individus"},"description":{}}},"individusNumbervalue":{"exportHeader":{"title":{"en":"Number of individuals","fr":"Nombre d'individus"},"description":{}}}},"submissions":{"referenceScopes":{"projet":{"title":{"en":"project","fr":"projet"},"description":{"en":"Choose the project","fr":"Choisissez le projet"}},"sites":{"title":{"en":"site","fr":"site"},"description":{"en":"The site","fr":"Le site"}}}},"i18nDisplayPattern":null,"i18n":{"title":{"en":"Trap in ascent","fr":"Piégeage en Montée"},"description":{"en":"Upstream trapping fishing data","fr":"Données de pêche par piégeage en Montée"}}},"sites":{"validations":{},"exceptions":{},"components":{"zet_description_en":{"exportHeader":{"title":{"en":"definition"},"description":{"en":"site definition"}}},"zet_nom_fr":{"exportHeader":{"title":{"fr":"Nom du site"},"description":{"fr":"Le nom du site"}}},"zet_nom_en":{"exportHeader":{"title":{"en":"Site name"},"description":{"en":"The site name"}}},"zet_description_fr":{"exportHeader":{"title":{"fr":"définition"},"description":{"fr":"La definition du site"}}}},"submissions":{"referenceScopes":{}},"i18nDisplayPattern":{"title":{"en":"{zet_chemin_parent} - {zet_nom_fr}","fr":"{zet_chemin_parent} - {zet_nom_fr} "},"description":{"en":"{zet_description_en}","fr":"{zet_description_fr}"}},"i18n":{"title":{"en":"Site","fr":"Site"},"description":{"en":"Sites list","fr":"Liste des sites du système d'information"}}}},"rightsrequest":{"fields":{"endDate":{"title":{"en":"Give the project end date","fr":"Date de fin du projet"},"description":{"en":"Project end date","fr":"Donnez la date de fin du projet"}},"organization":{"title":{"en":"Name of research organization","fr":"Nom de l'organisme de recherche"},"description":{"en":"Usual ame of research organization","fr":"Nom usuel de l'organisme de recherche"}},"project":{"title":{"en":"Description of the research project","fr":"Description du projet de recherche"},"description":{"en":"Describe your the research project","fr":"Donnez une description du projet de recherche"}},"startDate":{"title":{"en":"Project start date","fr":"Date de début du projet"},"description":{"en":"Give the project start date","fr":"Donnez la date de début du projet"}}},"i18n":{"title":{"en":"You can request rights to the monsore application by filling out this form","fr":"Vous pouvez demander des droits à l'application monsore en remplissant ce formulaire"},"description":{"en":"Monsoere Data Access Right Request Form","fr":"Formulaire de demande de droit d'accès aux données de Monsoere"}}},"additionalFiles":{"utilisateurs":{"i18n":{"title":{"en":"Users","fr":"Utilsateurs"},"description":{"en":"System User Description Files","fr":"Fichiers de dexcription des utilisateurs du système"}},"fields":{"prenom":{"title":{"en":"Surname","fr":"Prénom"},"description":{"en":"User surname","fr":"Prénom de l'utilisateur"}},"nom":{"title":{"en":"Name","fr":"Nom"},"description":{"en":"User name","fr":"Nom de l'utilisateur"}}}},"fichiers":{"i18n":{"title":{"en":"Files","fr":"Fichiers"},"description":{"en":"Various files relating to the Information System","fr":"Différents fichiers afférents au Système d'Information"}},"fields":{"date":{"title":{"en":"Date","fr":"Date"},"description":{"en":"The date the file was updated","fr":"La date de mise à jour du fichier"}},"site":{"title":{"en":"Place","fr":"Site"},"description":{"en":"Site described by the file","fr":"Site décrit par le fichier"}},"poids":{"title":{"en":"Weight","fr":"Poids"},"description":{"en":"File size in kb","fr":"Poids du fichier en ko"}},"nom":{"title":{"en":"Name","fr":"Nom"},"description":{"en":"The name of the file for download","fr":"Le nom du fichier pour téléchargement"}},"age":{"title":{"en":"Age","fr":"Age"},"description":{"en":"Minimum age for file access","fr":"Age minumum d'accès au fichier"}}}}}},"applicationDescription":{"name":"monsore","version":{"version":"3.0.1","runTimeVersion":{}},"defaultLanguage":"fr","comment":"Fichier de test de l'application brokenADOM version initiale"},"dataDescription":{"themes":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"description_fr":{"type":"BasicComponent","componentKey":"description_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_fr","exportHeaderName":"description_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"description_en":{"type":"BasicComponent","componentKey":"description_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_en","exportHeaderName":"description_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"especes":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["esp_nom"],"componentDescriptions":{"colonne_homonyme_entre_referentiels":{"type":"BasicComponent","componentKey":"colonne_homonyme_entre_referentiels","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"colonne_homonyme_entre_referentiels","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"esp_definition_en":{"type":"BasicComponent","componentKey":"esp_definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"esp_definition_en","exportHeaderName":"esp_definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"my_computed_column":{"type":"ComputedComponent","componentKey":"my_computed_column","tags":[{"tagDefinition":"HIDDEN_TAG"}],"exportHeaderName":"my_computed_column","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"return \"my value\";\n","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":true,"referenceCheckerType":"StringChecker"},"esp_nom":{"type":"BasicComponent","componentKey":"esp_nom","defaultValue":null,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"test"}],"importHeader":"esp_nom","exportHeaderName":"esp_nom","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"esp_definition_fr":{"type":"BasicComponent","componentKey":"esp_definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"esp_definition_fr","exportHeaderName":"esp_definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"variables":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"definition_en":{"type":"BasicComponent","componentKey":"definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_en","exportHeaderName":"definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"is_qualitative":{"type":"BasicComponent","componentKey":"is_qualitative","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"isQualitative","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"definition_fr":{"type":"BasicComponent","componentKey":"definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_fr","exportHeaderName":"definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"type_de_sites":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["tze_nom_key"],"componentDescriptions":{"tze_nom_key":{"type":"BasicComponent","componentKey":"tze_nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"tze_nom_fr":{"type":"BasicComponent","componentKey":"tze_nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_nom_fr","exportHeaderName":"tze_nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"tze_definition_fr":{"type":"BasicComponent","componentKey":"tze_definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_definition_fr","exportHeaderName":"tze_definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"tze_nom_en":{"type":"BasicComponent","componentKey":"tze_nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_nom_en","exportHeaderName":"tze_nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"tze_definition_en":{"type":"BasicComponent","componentKey":"tze_definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_definition_en","exportHeaderName":"tze_definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"site_theme_datatype":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["projet","site","theme","datatype"],"componentDescriptions":{"site":{"type":"BasicComponent","componentKey":"site","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du site","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"theme":{"type":"BasicComponent","componentKey":"theme","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du thème","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"projet":{"type":"BasicComponent","componentKey":"projet","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du projet","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"datatype":{"type":"BasicComponent","componentKey":"datatype","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du type de données","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{"projetRef":{"checkers":{"projet":{"type":"ReferenceChecker","componentKey":"projet","multiplicity":"ONE","required":false,"refType":"projet","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["projet"],"required":false,"mandatory":"OPTIONAL"},"sitesRef":{"checkers":{"site":{"type":"ReferenceChecker","componentKey":"site","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["site"],"required":false,"mandatory":"OPTIONAL"},"themesRef":{"checkers":{"theme":{"type":"ReferenceChecker","componentKey":"theme","multiplicity":"ONE","required":false,"refType":"themes","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["theme"],"required":false,"mandatory":"OPTIONAL"},"checkDatatype":{"checkers":{"datatype":{"type":"GroovyExpressionChecker","multiplicity":"ONE","required":false,"expression":"String datatype = datum.datatype; def data = application.getConfiguration().i18n().data ; if(data==null){\n return false;\n}; def i18n = data\n .collect{ it->it.value.i18n};\nif(i18n==null){\n return false;\n}; def title = i18n \n .collect{ it->it.title};\nif(title==null){\n return false;\n}; def french = title\n .collect { it->it.get(java.util.Locale.FRENCH)};\nreturn french \n .find{it->datatype.equals(fr.inra.oresing.domain.application.configuration.Ltree.fromUnescapedString(it.toString()).sql)}!=null;\n","references":null,"exceptionMessages":[],"codify":true,"data":null}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["datatype"],"required":false,"mandatory":"OPTIONAL"}},"depends":[],"migrations":null,"hidden":false,"order":9999},"unites":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["nom_key"],"componentDescriptions":{"code_en":{"type":"BasicComponent","componentKey":"code_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"code_en","exportHeaderName":"code_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"code_key":{"type":"BasicComponent","componentKey":"code_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"code_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"code_fr":{"type":"BasicComponent","componentKey":"code_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"code_fr","exportHeaderName":"code_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"projet":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"},{"tagDefinition":"DOMAIN_TAG","tagName":"test"},{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"definition_en":{"type":"BasicComponent","componentKey":"definition_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_en","exportHeaderName":"definition_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"colonne_homonyme_entre_referentiels":{"type":"BasicComponent","componentKey":"colonne_homonyme_entre_referentiels","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"colonne_homonyme_entre_referentiels","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"definition_fr":{"type":"BasicComponent","componentKey":"definition_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"definition_fr","exportHeaderName":"definition_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"valeurs_qualitatives":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["nom_key","valeur_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":"nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"valeur_en":{"type":"BasicComponent","componentKey":"valeur_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"valeur_en","exportHeaderName":"valeur_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":"nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"valeur_key":{"type":"BasicComponent","componentKey":"valeur_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"valeur_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"valeur_fr":{"type":"BasicComponent","componentKey":"valeur_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"valeur_fr","exportHeaderName":"valeur_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":false,"order":9999},"type_de_fichiers":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"HIDDEN_TAG"}],"naturalKey":["nom_key"],"componentDescriptions":{"nom_key":{"type":"BasicComponent","componentKey":"nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_en":{"type":"BasicComponent","componentKey":"nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_en","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"nom_fr":{"type":"BasicComponent","componentKey":"nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom_fr","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"description_fr":{"type":"BasicComponent","componentKey":"description_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_fr","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"description_en":{"type":"BasicComponent","componentKey":"description_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"description_en","exportHeaderName":"description_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{},"depends":[],"migrations":null,"hidden":true,"order":9999},"variables_et_unites_par_types_de_donnees":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"data"}],"naturalKey":["datatype","variable"],"componentDescriptions":{"variable":{"type":"BasicComponent","componentKey":"variable","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom de la variable","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"datatype":{"type":"BasicComponent","componentKey":"datatype","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom du type de données","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"unite":{"type":"BasicComponent","componentKey":"unite","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"nom de l'unité","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"}},"submission":null,"authorization":null,"validations":{"variableRef":{"checkers":{"variable":{"type":"ReferenceChecker","componentKey":"variable","multiplicity":"ONE","required":false,"refType":"variables","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["variable"],"required":false,"mandatory":"OPTIONAL"},"uniteRef":{"checkers":{"unite":{"type":"ReferenceChecker","componentKey":"unite","multiplicity":"ONE","required":false,"refType":"unites","isRecursive":false,"isParent":false}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["unite"],"required":false,"mandatory":"OPTIONAL"},"checkDatatype":{"checkers":{"datatype":{"type":"GroovyExpressionChecker","multiplicity":"ONE","required":false,"expression":"String datatype = datum.datatype; def data = application.getConfiguration().i18n().data ; if(data==null){\n return false;\n}; def i18n = data\n .collect{ it->it.value.i18n};\nif(i18n==null){\n return false;\n}; def title = i18n \n .collect{ it->it.title};\nif(title==null){\n return false;\n}; def french = title\n .collect { it->it.get(java.util.Locale.FRENCH)};\nreturn french \n .find{it->datatype.equals(fr.inra.oresing.domain.application.configuration.Ltree.fromUnescapedString(it.toString()).sql)}!=null;\n","references":null,"exceptionMessages":[],"codify":true,"data":null}},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":["datatype"],"required":false,"mandatory":"OPTIONAL"}},"depends":[],"migrations":null,"hidden":false,"order":9999},"pem":{"separator":";","headerLine":4,"firstRowLine":5,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"ORDER_TAG","tagOrder":2},{"tagDefinition":"DOMAIN_TAG","tagName":"data"},{"tagDefinition":"DOMAIN_TAG","tagName":"test"},{"tagDefinition":"DOMAIN_TAG","tagName":"context"},{"tagDefinition":"DATA_TAG"}],"naturalKey":["projet","site","plateforme","date","espece"],"componentDescriptions":{"date":{"type":"BasicComponent","componentKey":"date","defaultValue":null,"tags":[{"tagDefinition":"ORDER_TAG","tagOrder":1},{"tagDefinition":"DOMAIN_TAG","tagName":"temporal"}],"importHeader":"date","exportHeaderName":null,"langRestrictions":[],"required":true,"mandatory":"OPTIONAL","checker":{"type":"DateChecker","multiplicity":"ONE","required":true,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null},"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"site":{"type":"BasicComponent","componentKey":"site","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"site","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"site","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"sites"},"individusNumber_unit":{"type":"ComputedComponent","componentKey":"individusNumber_unit","tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"exportHeaderName":null,"langRestrictions":[],"required":true,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"individusNumber_unit","multiplicity":"ONE","required":true,"refType":"unites","isRecursive":false,"isParent":false},"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":true,"expression":"'sans_unite'","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"unites"},"projet":{"type":"BasicComponent","componentKey":"projet","defaultValue":null,"tags":[{"tagDefinition":"ORDER_TAG","tagOrder":2},{"tagDefinition":"DOMAIN_TAG","tagName":"test"}],"importHeader":"projet","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"projet","multiplicity":"ONE","required":false,"refType":"projet","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"projet"},"espece":{"type":"BasicComponent","componentKey":"espece","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"espece","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"espece","multiplicity":"ONE","required":false,"refType":"especes","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"especes"},"chemin":{"type":"ComputedComponent","componentKey":"chemin","tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"exportHeaderName":"chemin","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"chemin","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":false,"isParent":false},"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"return OA_buildCompositeKey(['site','plateforme']);\n","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"sites"},"plateforme":{"type":"BasicComponent","componentKey":"plateforme","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"plateforme","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"color_value":{"type":"BasicComponent","componentKey":"color_value","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"Couleur des individus","exportHeaderName":"color_value","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"color_value","multiplicity":"ONE","required":false,"refType":"valeurs_qualitatives","isRecursive":false,"isParent":false},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"valeurs_qualitatives"},"individusNumbervalue":{"type":"BasicComponent","componentKey":"individusNumbervalue","defaultValue":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"return 0","references":null,"exceptionMessages":[],"codify":false,"data":null},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"Nombre d'individus","exportHeaderName":"individusNumbervalue","langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"color_unit":{"type":"ComputedComponent","componentKey":"color_unit","tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"color_unit","multiplicity":"ONE","required":false,"refType":"unites","isRecursive":false,"isParent":false},"computationChecker":{"type":"ComputationChecker","multiplicity":"ONE","required":false,"expression":"'sans_unite'","references":null,"exceptionMessages":[],"codify":false,"data":null},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"unites"}},"submission":{"strategy":"OA_VERSIONING","fileNameParsing":{"pattern":"(.*)!(.*)!(.*)!(.*).csv","authorizationScopes":["projet","chemin"],"startDate":3,"endDate":4},"submissionScope":{"referenceScopes":[{"reference":"projet","component":"projet"},{"reference":"sites","component":"chemin"}],"timescope":{"component":"date"}}},"authorization":{"authorizationScope":[{"component":"projet","data":"projet"},{"component":"chemin","data":"sites"}],"timeScope":"date"},"validations":{"unitOfColor":{"checkers":{},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":null,"required":false,"mandatory":"OPTIONAL"},"unitOfIndividus":{"checkers":{},"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"columns":null,"required":true,"mandatory":"OPTIONAL"}},"depends":[{"type":"DependsReferences","references":"sites","component":"site"},{"type":"DependsReferences","references":"unites","component":"individusNumber_unit"},{"type":"DependsReferences","references":"projet","component":"projet"},{"type":"DependsReferences","references":"especes","component":"espece"},{"type":"DependsReferences","references":"sites","component":"chemin"},{"type":"DependsReferences","references":"valeurs_qualitatives","component":"color_value"},{"type":"DependsReferences","references":"unites","component":"color_unit"}],"migrations":null,"hidden":false,"order":2},"sites":{"separator":";","headerLine":1,"firstRowLine":2,"allowUnexpectedColumns":false,"tags":[{"tagDefinition":"DOMAIN_TAG","tagName":"context"}],"naturalKey":["zet_chemin_parent","zet_nom_key"],"componentDescriptions":{"tze_type_nom":{"type":"BasicComponent","componentKey":"tze_type_nom","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"tze_type_nom","exportHeaderName":null,"langRestrictions":[],"required":true,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"tze_type_nom","multiplicity":"ONE","required":true,"refType":"type_de_sites","isRecursive":false,"isParent":true},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"type_de_sites"},"zet_description_en":{"type":"BasicComponent","componentKey":"zet_description_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_description_en","exportHeaderName":"zet_description_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"zet_nom_fr":{"type":"BasicComponent","componentKey":"zet_nom_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_nom_fr","exportHeaderName":"zet_nom_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"zet_nom_key":{"type":"BasicComponent","componentKey":"zet_nom_key","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_nom_key","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"zet_nom_en":{"type":"BasicComponent","componentKey":"zet_nom_en","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_nom_en","exportHeaderName":"zet_nom_en","langRestrictions":["en"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"zet_description_fr":{"type":"BasicComponent","componentKey":"zet_description_fr","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_description_fr","exportHeaderName":"zet_description_fr","langRestrictions":["fr"],"required":false,"mandatory":"OPTIONAL","checker":null,"submissionAuthorizationScope":null,"chartDescription":null,"reference":false,"hidden":false,"referenceCheckerType":"StringChecker"},"zet_chemin_parent":{"type":"BasicComponent","componentKey":"zet_chemin_parent","defaultValue":null,"tags":[{"tagDefinition":"NO_TAG","tagName":"no_tag"}],"importHeader":"zet_chemin_parent","exportHeaderName":null,"langRestrictions":[],"required":false,"mandatory":"OPTIONAL","checker":{"type":"ReferenceChecker","componentKey":"zet_chemin_parent","multiplicity":"ONE","required":false,"refType":"sites","isRecursive":true,"isParent":true},"submissionAuthorizationScope":null,"chartDescription":null,"reference":true,"hidden":false,"referenceCheckerType":"sites"}},"submission":null,"authorization":null,"validations":{},"depends":[{"type":"DependsParent","references":"type_de_sites","component":"tze_type_nom"},{"type":"DependsParent","references":"sites","component":"zet_chemin_parent"}],"migrations":null,"hidden":false,"order":9999}},"rightsRequest":{"formFields":{"organization":{"order":0,"type":"RightsRequestField","required":true,"checker":{"type":"StringChecker","multiplicity":"ONE","required":true,"pattern":".*"}},"project":{"order":1,"type":"RightsRequestField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":".*"}},"startDate":{"order":2,"type":"RightsRequestField","required":false,"checker":{"type":"DateChecker","multiplicity":"ONE","required":false,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null}},"endDate":{"order":3,"type":"RightsRequestField","required":false,"checker":{"type":"DateChecker","multiplicity":"ONE","required":false,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null}}}},"additionalFiles":{"fichiers":{"formFields":{"nom":{"order":0,"type":"AdditionalFileField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":"[a-z]*"}},"date":{"order":1,"type":"AdditionalFileField","required":false,"checker":{"type":"DateChecker","multiplicity":"ONE","required":false,"pattern":"dd/MM/yyyy","min":[-999999999,1,1,0,0],"max":[999999999,12,31,23,59,59,999999999],"duration":null}},"age":{"order":2,"type":"AdditionalFileField","required":false,"checker":{"type":"IntegerChecker","multiplicity":"ONE","required":false,"min":-2147483648,"max":2147483647}},"poids":{"order":3,"type":"AdditionalFileField","required":false,"checker":{"type":"FloatChecker","multiplicity":"ONE","required":false,"min":10.0,"max":100.0}},"site":{"order":4,"type":"AdditionalFileField","required":true,"checker":{"type":"ReferenceChecker","componentKey":"site","multiplicity":"ONE","required":true,"refType":"sites","isRecursive":false,"isParent":false}}}},"utilisateurs":{"formFields":{"nom":{"order":0,"type":"AdditionalFileField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":"[a-z]*"}},"prenom":{"order":1,"type":"AdditionalFileField","required":false,"checker":{"type":"StringChecker","multiplicity":"ONE","required":false,"pattern":"[a-z]*"}}}}},"hierarchicalNodes":[{"nodeName":"especes","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"projet","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"pem","componentKey":"color_unit","columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":["sites","unites","projet","especes","valeurs_qualitatives","type_de_sites"],"order":2,"isRecursive":false},{"nodeName":"themes","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"site_theme_datatype","componentKey":"theme","columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":["sites","projet","themes","type_de_sites"],"order":9999,"isRecursive":false},{"nodeName":"type_de_fichiers","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"type_de_sites","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[{"nodeName":"sites","componentKey":"zet_chemin_parent","columnToLookUpForRecursive":"zet_chemin_parent","parent":"type_de_sites","children":[],"depends":["type_de_sites"],"order":9999,"isRecursive":true}],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"unites","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"valeurs_qualitatives","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"variables","componentKey":null,"columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":[],"order":9999,"isRecursive":false},{"nodeName":"variables_et_unites_par_types_de_donnees","componentKey":"variable","columnToLookUpForRecursive":null,"parent":null,"children":[],"depends":["unites","variables"],"order":9999,"isRecursive":false}],"requiredAuthorizationsAttributes":["themes","variables","especes","site_theme_datatype","type_de_sites","unites","projet","valeurs_qualitatives","variables_et_unites_par_types_de_donnees","type_de_fichiers","pem","sites"],"hiddenData":["type_de_fichiers"]},"configFile":null,"allDataNames":["especes","projet","sites","themes","type_de_sites","site_theme_datatype","type_de_fichiers","unites","valeurs_qualitatives","variables","variables_et_unites_par_types_de_donnees","pem"]},"time":[2025,1,27,14,35,20,404192189],"type":"REACTIVE_RESULT"} +{"result":1.0,"time":[2025,1,27,14,35,20,404545450],"type":"REACTIVE_PROGRESS"} -- GitLab