diff --git a/src/main/java/fr/inra/oresing/model/Configuration.java b/src/main/java/fr/inra/oresing/model/Configuration.java index 8678d23f2334f4bcc111419c88fd46b3c66b9c40..5b96601383d326a1730c0aecf15cd12d0775d7ea 100644 --- a/src/main/java/fr/inra/oresing/model/Configuration.java +++ b/src/main/java/fr/inra/oresing/model/Configuration.java @@ -383,6 +383,7 @@ public class Configuration { @Setter @ToString public static class AuthorizationDescription { + public static AuthorizationDescription DEFAULT_INSTANCE=new AuthorizationDescription(); @ApiModelProperty(notes = "The variable component that identifies the time scope of the line (must be a variable/component with a checker of type 'Date')", required = true) private VariableComponentKey timeScope; diff --git a/src/main/java/fr/inra/oresing/persistence/DataRepository.java b/src/main/java/fr/inra/oresing/persistence/DataRepository.java index 4bebb066e4da060ece8c95e0248a392de26fbfc9..07be867216e17f4568cdbfb36ce24f92f6fc6006 100644 --- a/src/main/java/fr/inra/oresing/persistence/DataRepository.java +++ b/src/main/java/fr/inra/oresing/persistence/DataRepository.java @@ -95,7 +95,7 @@ public class DataRepository extends JsonTableInApplicationSchemaRepositoryTempla return getNamedParameterJdbcTemplate().query(query, sqlParams, new JsonRowMapper<Uniqueness>()); } - public void updateConstraintForeigData(List<UUID> uuids) { + public void updateConstraintForeignData(List<UUID> uuids) { String deleteSql = "DELETE FROM " + getTable().getSchema().getSqlIdentifier() + ".Data_Reference WHERE dataId in (:ids)"; String insertSql = String.join(" " , "INSERT INTO " + getTable().getSchema().getSqlIdentifier() + ".Data_Reference(dataId, referencedBy)" diff --git a/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java b/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java index ffa806ed784ea1922e44a6c59186b858561f14a2..14623ad0260334ac0b9ac14b1363d5ac15197b3d 100644 --- a/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java +++ b/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java @@ -34,9 +34,9 @@ import java.util.stream.Collectors; @Slf4j public class ApplicationConfigurationService { + public static final String OTHERS_DATAGROUPS = "_others_"; private static final ImmutableSet<String> CHECKER_ON_TARGET_NAMES = ImmutableSet.of("Date", "Float", "Integer", "RegularExpression", "Reference"); - private static final ImmutableSet<String> ALL_CHECKER_NAMES = ImmutableSet.<String>builder() .addAll(CHECKER_ON_TARGET_NAMES) .add(GroovyLineChecker.NAME) @@ -120,7 +120,9 @@ public class ApplicationConfigurationService { Set<String> variables = dataTypeDescription.getData().keySet(); if (authorization == null) { - builder.missingAuthorizationForDatatype(dataType); + //builder.missingAuthorizationForDatatype(dataType); +// authorization = Configuration.AuthorizationDescription.DEFAULT_INSTANCE; +// dataTypeDescription.setAuthorization(authorization); } else { VariableComponentKey timeScopeVariableComponentKey = authorization.getTimeScope(); verifyDatatypeTimeScopeExistsAndIsValid(builder, dataType, dataTypeDescription, variables, timeScopeVariableComponentKey); @@ -128,14 +130,14 @@ public class ApplicationConfigurationService { LinkedHashMap<String, Configuration.AuthorizationScopeDescription> authorizationScopesVariableComponentKey = authorization.getAuthorizationScopes(); verifyDatatypeAuthorizationScopeExistsAndIsValid(builder, dataType, configuration, variables, authorizationScopesVariableComponentKey); requiredAuthorizationsAttributesBuilder.addAll(authorizationScopesVariableComponentKey.keySet()); - } - Multiset<String> variableOccurrencesInDataGroups = TreeMultiset.create(); - verifyDatatypeDataGroupsContainsExistingVariables(builder, dataTypeDescription, variables, variableOccurrencesInDataGroups); + Multiset<String> variableOccurrencesInDataGroups = TreeMultiset.create(); + verifyDatatypeDataGroupsContainsExistingVariables(builder, dataTypeDescription, variables, variableOccurrencesInDataGroups); - verifyDatatypeBindingToExistingVariableComponent(builder, variables, variableOccurrencesInDataGroups); - verifyDatatypeBindingToExistingVariableComponent(builder, dataTypeDescription, dataType, variables); - verifyChartDescription(builder, dataType, dataTypeDescription); + verifyDatatypeBindingToExistingVariableComponent(builder, variables, variableOccurrencesInDataGroups); + verifyDatatypeBindingToExistingVariableComponent(builder, dataTypeDescription, dataType, variables); + verifyChartDescription(builder, dataType, dataTypeDescription); + } } configuration.setRequiredAuthorizationsAttributes(List.copyOf(requiredAuthorizationsAttributesBuilder.build())); @@ -301,7 +303,17 @@ public class ApplicationConfigurationService { } private void verifyDatatypeDataGroupsContainsExistingVariables(ConfigurationParsingResult.Builder builder, Configuration.DataTypeDescription dataTypeDescription, Set<String> variables, Multiset<String> variableOccurrencesInDataGroups) { - for (Map.Entry<String, Configuration.DataGroupDescription> dataGroupEntry : dataTypeDescription.getAuthorization().getDataGroups().entrySet()) { + final LinkedHashMap<String, Configuration.DataGroupDescription> dataGroups = dataTypeDescription.getAuthorization().getDataGroups(); + if (dataGroups.isEmpty()) { + final Configuration.DataGroupDescription dataGroupDescription = new Configuration.DataGroupDescription(); + for (String variable : variables) { + dataGroupDescription.getData().add(variable); + } + dataGroups.put(OTHERS_DATAGROUPS, dataGroupDescription); + variableOccurrencesInDataGroups.addAll(variables); + return; + } + for (Map.Entry<String, Configuration.DataGroupDescription> dataGroupEntry : dataGroups.entrySet()) { String dataGroup = dataGroupEntry.getKey(); Configuration.DataGroupDescription dataGroupDescription = dataGroupEntry.getValue(); Set<String> dataGroupVariables = dataGroupDescription.getData(); @@ -372,7 +384,7 @@ public class ApplicationConfigurationService { final Configuration.CompositeReferenceComponentDescription compositeReferenceComponentDescription = new Configuration.CompositeReferenceComponentDescription(); compositeReferenceComponentDescription.setReference(refType); compositeReferenceDescription.setComponents(List.of(compositeReferenceComponentDescription)); - compositeReferences.put(key, compositeReferenceDescription ); + compositeReferences.put(key, compositeReferenceDescription); //builder.authorizationScopeVariableComponentReftypeUnknown(dataType, authorizationScopeName, refType, compositesReferences); } } diff --git a/src/main/java/fr/inra/oresing/rest/ApplicationResult.java b/src/main/java/fr/inra/oresing/rest/ApplicationResult.java index e63a155bcc973d6c22842441870077b2698c1269..fe08cfb77606dc01716923f067fbc096d8c0a9f7 100644 --- a/src/main/java/fr/inra/oresing/rest/ApplicationResult.java +++ b/src/main/java/fr/inra/oresing/rest/ApplicationResult.java @@ -51,6 +51,7 @@ public class ApplicationResult { String label; Map<String, Variable> variables; Map<String, String> repository; + boolean hasAuthorizations; @Value public static class Variable { diff --git a/src/main/java/fr/inra/oresing/rest/OreSiResources.java b/src/main/java/fr/inra/oresing/rest/OreSiResources.java index 45802b555b5738da40886811cd07cce9ac66711d..8eb2215a9224f9ed3971c5638b47edbf1ec6b831 100644 --- a/src/main/java/fr/inra/oresing/rest/OreSiResources.java +++ b/src/main/java/fr/inra/oresing/rest/OreSiResources.java @@ -143,8 +143,9 @@ public class OreSiResources { } return new ApplicationResult.DataType.Variable(variable, variable, components, chartDescriptionResult); }); - Map<String, String> repository = application.getConfiguration().getDataTypes().get(dataType).getRepository(); - return new ApplicationResult.DataType(dataType, dataType, variables, Optional.ofNullable(repository).filter(m -> !m.isEmpty()).orElse(null)); + Map<String, String> repository = dataTypeDescription.getRepository(); + final boolean hasAuthorizations = dataTypeDescription.getAuthorization() != null; + return new ApplicationResult.DataType(dataType, dataType, variables, Optional.ofNullable(repository).filter(m -> !m.isEmpty()).orElse(null), hasAuthorizations); }); ApplicationResult applicationResult = new ApplicationResult(application.getId().toString(), application.getName(), application.getConfiguration().getApplication().getName(), application.getComment(), application.getConfiguration().getInternationalization(), references, dataTypes, referenceSynthesis); return ResponseEntity.ok(applicationResult); @@ -468,4 +469,4 @@ public class OreSiResources { } -} +} \ No newline at end of file diff --git a/src/main/java/fr/inra/oresing/rest/OreSiService.java b/src/main/java/fr/inra/oresing/rest/OreSiService.java index 5e8a320a4125d71d5650447d2c6b4e06b4d89af2..3e228913f46df5587284298be393f99b91f62eb5 100644 --- a/src/main/java/fr/inra/oresing/rest/OreSiService.java +++ b/src/main/java/fr/inra/oresing/rest/OreSiService.java @@ -4,60 +4,16 @@ import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import com.google.common.base.Predicate; import com.google.common.base.Strings; -import com.google.common.collect.BiMap; -import com.google.common.collect.HashBiMap; -import com.google.common.collect.HashMultimap; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableMultiset; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.ImmutableSetMultimap; -import com.google.common.collect.ImmutableSortedSet; -import com.google.common.collect.Maps; -import com.google.common.collect.MoreCollectors; -import com.google.common.collect.Ordering; -import com.google.common.collect.SetMultimap; -import com.google.common.collect.Sets; +import com.google.common.collect.*; import com.google.common.primitives.Ints; import fr.inra.oresing.OreSiTechnicalException; -import fr.inra.oresing.checker.CheckerFactory; -import fr.inra.oresing.checker.DateLineChecker; -import fr.inra.oresing.checker.FloatChecker; -import fr.inra.oresing.checker.IntegerChecker; -import fr.inra.oresing.checker.InvalidDatasetContentException; -import fr.inra.oresing.checker.LineChecker; -import fr.inra.oresing.checker.ReferenceLineChecker; -import fr.inra.oresing.checker.ReferenceLineCheckerConfiguration; +import fr.inra.oresing.checker.*; import fr.inra.oresing.groovy.Expression; import fr.inra.oresing.groovy.GroovyContextHelper; import fr.inra.oresing.groovy.StringGroovyExpression; -import fr.inra.oresing.model.Application; -import fr.inra.oresing.model.Authorization; -import fr.inra.oresing.model.BinaryFile; -import fr.inra.oresing.model.BinaryFileDataset; -import fr.inra.oresing.model.Configuration; -import fr.inra.oresing.model.Data; -import fr.inra.oresing.model.Datum; -import fr.inra.oresing.model.LocalDateTimeRange; -import fr.inra.oresing.model.ReferenceColumn; -import fr.inra.oresing.model.ReferenceColumnSingleValue; -import fr.inra.oresing.model.ReferenceColumnValue; -import fr.inra.oresing.model.ReferenceDatum; -import fr.inra.oresing.model.ReferenceValue; -import fr.inra.oresing.model.VariableComponentKey; +import fr.inra.oresing.model.*; import fr.inra.oresing.model.chart.OreSiSynthesis; -import fr.inra.oresing.persistence.AuthenticationService; -import fr.inra.oresing.persistence.BinaryFileInfos; -import fr.inra.oresing.persistence.DataRepository; -import fr.inra.oresing.persistence.DataRow; -import fr.inra.oresing.persistence.DataSynthesisRepository; -import fr.inra.oresing.persistence.Ltree; -import fr.inra.oresing.persistence.OreSiRepository; -import fr.inra.oresing.persistence.ReferenceValueRepository; -import fr.inra.oresing.persistence.SqlPolicy; -import fr.inra.oresing.persistence.SqlSchema; -import fr.inra.oresing.persistence.SqlSchemaForApplication; -import fr.inra.oresing.persistence.SqlService; +import fr.inra.oresing.persistence.*; import fr.inra.oresing.persistence.roles.OreSiRightOnApplicationRole; import fr.inra.oresing.persistence.roles.OreSiUserRole; import fr.inra.oresing.rest.validationcheckresults.DateValidationCheckResult; @@ -88,28 +44,10 @@ import java.io.IOException; import java.io.InputStream; import java.io.StringWriter; import java.time.Duration; -import java.time.Instant; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.ZoneOffset; +import java.time.*; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.TreeMap; -import java.util.UUID; +import java.util.*; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import java.util.function.Function; @@ -483,7 +421,7 @@ public class OreSiService { repo.getRepository(app).binaryFile().store(f); buildSynthesis(app.getName(), dataType); }); - if(dataType!=null){ + if (dataType != null) { buildSynthesis(app.getName(), dataType); } } @@ -528,7 +466,7 @@ public class OreSiService { } }) ); - dataRepository.updateConstraintForeigData(uuids); + dataRepository.updateConstraintForeignData(uuids); errors.addAll(uniquenessBuilder.getErrors()); InvalidDatasetContentException.checkErrorsIsEmpty(errors); } @@ -628,12 +566,16 @@ public class OreSiService { ImmutableSet<LineChecker> lineCheckers, Configuration.DataTypeDescription dataTypeDescription, BinaryFileDataset binaryFileDataset) { - DateLineChecker timeScopeDateLineChecker = lineCheckers.stream() - .filter(lineChecker -> lineChecker instanceof DateLineChecker) - .map(lineChecker -> (DateLineChecker) lineChecker) - .filter(dateLineChecker -> dateLineChecker.getTarget().equals(dataTypeDescription.getAuthorization().getTimeScope())) - .collect(MoreCollectors.onlyElement()); + final Configuration.AuthorizationDescription authorization = dataTypeDescription.getAuthorization(); + final boolean haveAuthorizations = authorization != null; + final DateLineChecker timeScopeDateLineChecker = haveAuthorizations? + lineCheckers.stream() + .filter(lineChecker -> lineChecker instanceof DateLineChecker) + .map(lineChecker -> (DateLineChecker) lineChecker) + .filter(dateLineChecker -> dateLineChecker.getTarget().equals(authorization.getTimeScope())) + .collect(MoreCollectors.onlyElement()) + :null; return rowWithData -> { Datum datum = Datum.copyOf(rowWithData.getDatum()); @@ -668,26 +610,41 @@ public class OreSiService { errors.addAll(rowErrors); return Stream.empty(); } - - String timeScopeValue = datum.get(dataTypeDescription.getAuthorization().getTimeScope()); - LocalDateTimeRange timeScope = LocalDateTimeRange.parse(timeScopeValue, timeScopeDateLineChecker); + LocalDateTimeRange timeScope; + if (timeScopeDateLineChecker!=null) { + String timeScopeValue = datum.get(authorization.getTimeScope()); + timeScope = LocalDateTimeRange.parse(timeScopeValue, timeScopeDateLineChecker); + } else { + timeScope = LocalDateTimeRange.always(); + } Map<String, String> requiredAuthorizations = new LinkedHashMap<>(); - dataTypeDescription.getAuthorization().getAuthorizationScopes().forEach((authorizationScope, authorizationScopeDescription) -> { - VariableComponentKey variableComponentKey = authorizationScopeDescription.getVariableComponentKey(); - String requiredAuthorization = datum.get(variableComponentKey); - Ltree.checkSyntax(requiredAuthorization); - requiredAuthorizations.put(authorizationScope, requiredAuthorization); - }); + if(haveAuthorizations) { + authorization.getAuthorizationScopes().forEach((authorizationScope, authorizationScopeDescription) -> { + VariableComponentKey variableComponentKey = authorizationScopeDescription.getVariableComponentKey(); + String requiredAuthorization = datum.get(variableComponentKey); + Ltree.checkSyntax(requiredAuthorization); + requiredAuthorizations.put(authorizationScope, requiredAuthorization); + }); + } checkTimescopRangeInDatasetRange(timeScope, errors, binaryFileDataset, rowWithData.getLineNumber()); checkRequiredAuthorizationInDatasetRange(requiredAuthorizations, errors, binaryFileDataset, rowWithData.getLineNumber()); // String rowId = Hashing.sha256().hashString(line.toString(), Charsets.UTF_8).toString(); String rowId = UUID.randomUUID().toString(); final List<String> uniquenessValues = uniquenessBuilder.test(datum, rowWithData.getLineNumber()); - if(uniquenessValues ==null) { + if (uniquenessValues == null) { return Stream.of((Data) null); - }; - Stream<Data> dataStream = dataTypeDescription.getAuthorization().getDataGroups().entrySet().stream().map(entry -> { + } + LinkedHashMap<String, Configuration.DataGroupDescription> dataGroups; + if(!haveAuthorizations){ + dataGroups=new LinkedHashMap<>(); + final Configuration.DataGroupDescription dataGroupDescription = new Configuration.DataGroupDescription(); + dataGroupDescription.setData(dataTypeDescription.getData().keySet()); + dataGroups.put("_default_", dataGroupDescription); + }else{ + dataGroups= authorization.getDataGroups(); + } + Stream<Data> dataStream = dataGroups.entrySet().stream().map(entry -> { String dataGroup = entry.getKey(); Configuration.DataGroupDescription dataGroupDescription = entry.getValue(); @@ -1017,7 +974,7 @@ public class OreSiService { * @param formatDescription * @param linesIterator */ - private void readPostHeader(Configuration.FormatDescription formatDescription, ImmutableList<String> headerRow, Datum constantValues, Iterator<CSVRecord> linesIterator) { + private void readPostHeader(Configuration.FormatDescription formatDescription, ImmutableList<String> headerRow, Datum constantValues, Iterator<CSVRecord> linesIterator) { ImmutableSetMultimap<Integer, Configuration.HeaderConstantDescription> perRowNumberConstants = formatDescription.getConstants().stream() .collect( @@ -1026,7 +983,7 @@ public class OreSiService { Function.identity() ) ); - for (int lineNumber = formatDescription.getHeaderLine()+1; lineNumber < formatDescription.getFirstRowLine(); lineNumber++) { + for (int lineNumber = formatDescription.getHeaderLine() + 1; lineNumber < formatDescription.getFirstRowLine(); lineNumber++) { CSVRecord row = linesIterator.next(); ImmutableSet<Configuration.HeaderConstantDescription> constantDescriptions = perRowNumberConstants.get(lineNumber); constantDescriptions.forEach(constant -> { @@ -1102,12 +1059,6 @@ public class OreSiService { return computeDefaultValueFn; } - @Value - private static class ComputedValuesContext { - ImmutableMap<VariableComponentKey, Function<Datum, String>> defaultValueFns; - ImmutableSet<VariableComponentKey> replaceEnabled; - } - public String getDataCsv(DownloadDatasetQuery downloadDatasetQuery, String nameOrId, String dataType, String locale) { DownloadDatasetQuery downloadDatasetQueryCopy = DownloadDatasetQuery.buildDownloadDatasetQuery(downloadDatasetQuery, nameOrId, dataType, getApplication(nameOrId)); List<DataRow> list = findData(downloadDatasetQueryCopy, nameOrId, dataType); @@ -1363,20 +1314,20 @@ public class OreSiService { .filter(entry -> Strings.isNullOrEmpty(variable) || entry.getKey().equals(variable)) .anyMatch(entry -> entry.getValue().getChartDescription() != null); String sql; - if(hasChartDescription) { + if (hasChartDescription) { sql = application.getConfiguration().getDataTypes().get(dataType).getData().entrySet().stream() .filter(entry -> Strings.isNullOrEmpty(variable) || entry.getKey().equals(variable)) .filter(entry -> entry.getValue().getChartDescription() != null) .map(entry -> entry.getValue().getChartDescription().toSQL(entry.getKey(), dataType)) .collect(Collectors.joining(", \n")); - }else { + } else { sql = Configuration.Chart.toSQL(dataType); } List<OreSiSynthesis> oreSiSynthesisList = new LinkedList<>(); - final List<OreSiSynthesis> oreSiSynthesis = repo.buildSynthesis(sql, hasChartDescription); + final List<OreSiSynthesis> oreSiSynthesis = repo.buildSynthesis(sql, hasChartDescription); repo.storeAll(oreSiSynthesis.stream()); - return !hasChartDescription?Map.of("__NO-CHART",oreSiSynthesis):oreSiSynthesis.stream().collect(Collectors.groupingBy(OreSiSynthesis::getVariable)); + return !hasChartDescription ? Map.of("__NO-CHART", oreSiSynthesis) : oreSiSynthesis.stream().collect(Collectors.groupingBy(OreSiSynthesis::getVariable)); } public Map<String, List<OreSiSynthesis>> getSynthesis(String nameOrId, String dataType) { @@ -1396,7 +1347,13 @@ public class OreSiService { } public Map<Ltree, List<ReferenceValue>> getReferenceDisplaysById(Application application, Set<String> listOfDataIds) { - return repo.getRepository(application).referenceValue(). getReferenceDisplaysById(listOfDataIds); + return repo.getRepository(application).referenceValue().getReferenceDisplaysById(listOfDataIds); + } + + @Value + private static class ComputedValuesContext { + ImmutableMap<VariableComponentKey, Function<Datum, String>> defaultValueFns; + ImmutableSet<VariableComponentKey> replaceEnabled; } @Value @@ -1439,10 +1396,10 @@ public class OreSiService { public List<String> test(Datum datum, int lineNumber) { UniquenessKeys uniquenessKeys = new UniquenessKeys(datum, uniquenessDescription); - uniquenessInFile.compute(uniquenessKeys, (k,v) -> v==null?new LinkedList<>():v) + uniquenessInFile.compute(uniquenessKeys, (k, v) -> v == null ? new LinkedList<>() : v) .add(lineNumber); - boolean isInError = uniquenessInFile.get(uniquenessKeys).size()>1; - return isInError?null:uniquenessKeys.getValues(); + boolean isInError = uniquenessInFile.get(uniquenessKeys).size() > 1; + return isInError ? null : uniquenessKeys.getValues(); } private CsvRowValidationCheckResult getErrorForEntry(Map.Entry<UniquenessKeys, List<Integer>> entry) { @@ -1464,7 +1421,7 @@ public class OreSiService { .collect(Collectors.toList()); } - public Map<String, String> getUniquenessKey(UniquenessKeys uniquenessKeys){ + public Map<String, String> getUniquenessKey(UniquenessKeys uniquenessKeys) { Map<String, String> uniquenessKeyMap = new HashMap<>(); for (int i = 0; i < uniquenessDescription.size(); i++) { uniquenessKeyMap.put(uniquenessDescription.get(i).getId(), uniquenessKeys.getValues().get(i)); @@ -1476,6 +1433,7 @@ public class OreSiService { class UniquenessKeys implements Comparable<UniquenessKeys> { List<String> values = new LinkedList<>(); List<VariableComponentKey> uniquenessDescription; + public UniquenessKeys(Datum datum, List<VariableComponentKey> uniquenessDescription) { this.uniquenessDescription = uniquenessDescription; this.values = uniquenessDescription.stream() diff --git a/src/test/java/fr/inra/oresing/rest/Fixtures.java b/src/test/java/fr/inra/oresing/rest/Fixtures.java index d27aac4bc71ee2a9efcd8f4a5cad67eca3cd2026..d5c74df3575a6f9a55300c0919419aa863ad560d 100644 --- a/src/test/java/fr/inra/oresing/rest/Fixtures.java +++ b/src/test/java/fr/inra/oresing/rest/Fixtures.java @@ -152,12 +152,13 @@ public class Fixtures { " }", plateforme, projet, site); } - public String getProgressiveYamlWithNoReferenceForAuthorizationScopeApplicationConfigurationResourceName() { - return "/data/progressiveyaml/testAuthorizationScopeWithoutReference.yaml"; - } - - public String getProgressiveYamlWithReferenceAndNoHierarchicalReferenceForAuthorizationScopeApplicationConfigurationResourceName() { - return "/data/progressiveyaml/testAuthorizationScopeWithReferenceAndNoHierarchicalReference.yaml"; + public Map<String, String> getProgressiveYaml() { + Map<String, String> yamls = new LinkedHashMap<>(); + yamls.put("testAuthorizationScopeWithoutReference", "/data/progressiveyaml/testAuthorizationScopeWithoutReference.yaml"); + yamls.put("testAuthorizationScopeWithReferenceAndNoHierarchicalReference", "/data/progressiveyaml/testAuthorizationScopeWithReferenceAndNoHierarchicalReference.yaml"); + yamls.put("yamlWithEmptyDatagroup", "/data/progressiveyaml/testEmptyDatagroup.yaml"); + yamls.put("yamlWithoutAuthorization", "/data/progressiveyaml/noAuthorization.yaml"); + return yamls; } public Map<String, String> getProgressiveYamlReferentielFiles() { @@ -678,6 +679,7 @@ public class Fixtures { .put("meteo_m", "/data/foret/data/meteo/mensuel/hesse-hesse_1_meteo_m_01-2012_03-2012.csv")*/ .build(); } + public Map<String, Integer> getForetEssaiSynthesisSize() { ImmutableMap.Builder<String, Integer> builder = ImmutableMap.builder(); return builder diff --git a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java index 6579f9349cffac6de647d9584961a57aa0fb2a8b..50b81a6951e1167a415c013b904350889513d04a 100644 --- a/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java +++ b/src/test/java/fr/inra/oresing/rest/OreSiResourcesTest.java @@ -592,10 +592,49 @@ public class OreSiResourcesTest { } } + @Test + public void testProgressiveYamlWithoutAuthorization() throws Exception { + + URL resource = getClass().getResource(fixtures.getProgressiveYaml().get("yamlWithoutAuthorization")); + try (InputStream in = Objects.requireNonNull(resource).openStream()) { + MockMultipartFile configuration = new MockMultipartFile("file", "progressive.yaml", "text/plain", in); + //définition de l'application + authenticationService.addUserRightCreateApplication(userId); + + String result = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/progressive") + .file(configuration) + .cookie(authCookie)) + .andExpect(status().is2xxSuccessful()) + //.andExpect(jsonPath("$.id", IsNull.notNullValue())) + .andReturn().getResponse().getContentAsString(); + } + progressiveYamlAddReferencesAndData(); + } + + @Test + public void testProgressiveYamlWitEmptyDatagroup() throws Exception { + + URL resource = getClass().getResource(fixtures.getProgressiveYaml().get("yamlWithEmptyDatagroup")); + try (InputStream in = Objects.requireNonNull(resource).openStream()) { + MockMultipartFile configuration = new MockMultipartFile("file", "progressive.yaml", "text/plain", in); + //définition de l'application + authenticationService.addUserRightCreateApplication(userId); + + String result = mockMvc.perform(MockMvcRequestBuilders.multipart("/api/v1/applications/progressive") + .file(configuration) + .cookie(authCookie)) + .andExpect(status().is2xxSuccessful()) + //.andExpect(jsonPath("$.id", IsNull.notNullValue())) + .andReturn().getResponse().getContentAsString(); + } + + progressiveYamlAddReferencesAndData(); + } + @Test public void tesProgressiveYamlWithNoReference() throws Exception { - URL resource = getClass().getResource(fixtures.getProgressiveYamlWithNoReferenceForAuthorizationScopeApplicationConfigurationResourceName()); + URL resource = getClass().getResource(fixtures.getProgressiveYaml().get("testAuthorizationScopeWithoutReference")); try (InputStream in = Objects.requireNonNull(resource).openStream()) { MockMultipartFile configuration = new MockMultipartFile("file", "progressive.yaml", "text/plain", in); //définition de l'application @@ -621,7 +660,7 @@ public class OreSiResourcesTest { @Test public void tesProgressiveYaml() throws Exception { - URL resource = getClass().getResource(fixtures.getProgressiveYamlWithReferenceAndNoHierarchicalReferenceForAuthorizationScopeApplicationConfigurationResourceName()); + URL resource = getClass().getResource(fixtures.getProgressiveYaml().get("testAuthorizationScopeWithReferenceAndNoHierarchicalReference")); try (InputStream in = Objects.requireNonNull(resource).openStream()) { MockMultipartFile configuration = new MockMultipartFile("file", "progressive.yaml", "text/plain", in); //définition de l'application @@ -635,6 +674,10 @@ public class OreSiResourcesTest { .andReturn().getResponse().getContentAsString(); } + progressiveYamlAddReferencesAndData(); + } + + private void progressiveYamlAddReferencesAndData() throws Exception { String response; // Ajout de referentiel for (Map.Entry<String, String> e : fixtures.getProgressiveYamlReferentielFiles().entrySet()) { diff --git a/src/test/resources/data/progressiveyaml/noAuthorization.yaml b/src/test/resources/data/progressiveyaml/noAuthorization.yaml new file mode 100644 index 0000000000000000000000000000000000000000..e7fd1139122502745529e96e342aec4b112cbec7 --- /dev/null +++ b/src/test/resources/data/progressiveyaml/noAuthorization.yaml @@ -0,0 +1,75 @@ +version: 0 + +application: + name: Application de test + version: 1 + +references: + agroécosystème: + keyColumns: [ nom ] + columns: + nom: + sites: + keyColumns: [ nom du site ] + columns: + Agroécosystème: + nom du site: + parcelles: + keyColumns: [ site, nom de la parcelle ] + columns: + site: + nom de la parcelle: + +dataTypes: + date_de_visite: + data: + date: + components: + day: + checker: + name: Date + params: + pattern: dd/MM/yyyy + time: + localisation: + components: + agroecosysteme: +# checker: +# name: Reference +# params: +# refType: agroécosystème + relevant: + components: + numero: + format: + constants: + - rowNumber: 1 + columnNumber: 2 + boundTo: + variable: relevant + component: numero + exportHeader: relevant_number + headerLine: 2 + firstRowLine: 3 + columns: + - header: date + boundTo: + variable: date + component: day + - header: heure + boundTo: + variable: date + component: time + - header: agroecosysteme + boundTo: + variable: localisation + component: agroecosysteme + +# authorization: +# authorizationScopes: +# localization: +# variable: localisation +# component: agroecosysteme +# timeScope: +# variable: date +# component: day \ No newline at end of file diff --git a/src/test/resources/data/progressiveyaml/testEmptyDatagroup.yaml b/src/test/resources/data/progressiveyaml/testEmptyDatagroup.yaml new file mode 100644 index 0000000000000000000000000000000000000000..2b908964b6afa9cc62e08c3661c1234cc297493a --- /dev/null +++ b/src/test/resources/data/progressiveyaml/testEmptyDatagroup.yaml @@ -0,0 +1,75 @@ +version: 0 + +application: + name: Application de test + version: 1 + +references: + agroécosystème: + keyColumns: [ nom ] + columns: + nom: + sites: + keyColumns: [ nom du site ] + columns: + Agroécosystème: + nom du site: + parcelles: + keyColumns: [ site, nom de la parcelle ] + columns: + site: + nom de la parcelle: + +dataTypes: + date_de_visite: + data: + date: + components: + day: + checker: + name: Date + params: + pattern: dd/MM/yyyy + time: + localisation: + components: + agroecosysteme: + checker: + name: Reference + params: + refType: agroécosystème + relevant: + components: + numero: + format: + constants: + - rowNumber: 1 + columnNumber: 2 + boundTo: + variable: relevant + component: numero + exportHeader: relevant_number + headerLine: 2 + firstRowLine: 3 + columns: + - header: date + boundTo: + variable: date + component: day + - header: heure + boundTo: + variable: date + component: time + - header: agroecosysteme + boundTo: + variable: localisation + component: agroecosysteme + + authorization: + authorizationScopes: + localization: + variable: localisation + component: agroecosysteme + timeScope: + variable: date + component: day \ No newline at end of file diff --git a/ui/src/components/datatype/DataTypeDetailsPanel.vue b/ui/src/components/datatype/DataTypeDetailsPanel.vue index 9689a0631eb382943bcf72a8e36593412390af74..3e96fcfc89f31e602c1acbf3868b8f94993b82d2 100644 --- a/ui/src/components/datatype/DataTypeDetailsPanel.vue +++ b/ui/src/components/datatype/DataTypeDetailsPanel.vue @@ -6,9 +6,10 @@ :closeCb="closeCb" > <div class="Panel-buttons"> - <b-button type="is-dark" icon-left="key" @click="consultAuthorization">{{ + <b-button type="is-dark" icon-left="key" @click="consultAuthorization" v-if="dataType && dataType.hasAuthorizations">{{ $t("dataTypesManagement.consult-authorization") }}</b-button> + <div v-else>{{$t('dataTypesManagement.no_authorization', dataType)}}</div> </div> </SidePanel> </template> @@ -44,4 +45,4 @@ export default class DataTypeDetailsPanel extends Vue { margin-bottom: 0.5rem; } } -</style> +</style> \ No newline at end of file diff --git a/ui/src/locales/en.json b/ui/src/locales/en.json index e6cb579064a4bf8b717a68e2a2326cf9760412be..a108a680d2139b13c9bcb9f0bb7e9f450a19876e 100644 --- a/ui/src/locales/en.json +++ b/ui/src/locales/en.json @@ -218,6 +218,7 @@ "data":"Data" }, "dataTypesManagement": { + "no_authorization": "No authorization management for {localName}", "data-types": "Data types", "consult-authorization": "Consult authorizations", "réinitialiser": "Reset", diff --git a/ui/src/locales/fr.json b/ui/src/locales/fr.json index 09170cc081130b0c1e7059d9fa1b9a62fd156300..91942acb25399eed0d6b4271ed5c3c2ff5a8badc 100644 --- a/ui/src/locales/fr.json +++ b/ui/src/locales/fr.json @@ -218,6 +218,7 @@ "data": "Données" }, "dataTypesManagement": { + "no_authorization": "Pas de gestion des autorisations pour {localName}", "data-types": "Type de données", "consult-authorization": "Consulter les autorisations", "réinitialiser": "Réinitialiser", diff --git a/ui/src/services/InternationalisationService.js b/ui/src/services/InternationalisationService.js index ded0aef60fb55ae6ae98fb89a53e98f8e0532e49..16274df271d8523df303a0469ce434ed9b20450c 100644 --- a/ui/src/services/InternationalisationService.js +++ b/ui/src/services/InternationalisationService.js @@ -96,12 +96,13 @@ export class InternationalisationService extends Fetcher { if (application.internationalization != null) { let applicationDataTypes = application.internationalization.dataTypes; for (let applicationDataType in applicationDataTypes) { + localStorage.getItem(LOCAL_STORAGE_LANG) application.dataTypes[applicationDataType] = { ...application.dataTypes[applicationDataType], localName: applicationDataTypes[applicationDataType].internationalizationName?.[ localStorage.getItem(LOCAL_STORAGE_LANG) - ], + ]||applicationDataType, }; } } else { @@ -158,4 +159,4 @@ export class InternationalisationService extends Fetcher { } return refs.references; } -} +} \ No newline at end of file