Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe

Commits:

17 changed files:

Changes:

  • client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java
    ... ... @@ -342,7 +342,7 @@ public class ReportModel extends AdminActionModel {
    342 342
         }
    
    343 343
     
    
    344 344
         public ReportDefinition getSelectedReportDefinition() {
    
    345
    -        return selectedReport == null ? null : selectedReport.getDefinition();
    
    345
    +        return selectedReport == null ? null : selectedReport.definition();
    
    346 346
         }
    
    347 347
     
    
    348 348
         public void setSelectedReport(Report selectedReport) {
    

  • client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUINavigationHandler.java
    ... ... @@ -64,7 +64,7 @@ public abstract class ContentTableUINavigationHandler<N extends ContentTableUINa
    64 64
     
    
    65 65
         @Override
    
    66 66
         public String getText() {
    
    67
    -        String result = getNode().getScope().getI18nTranslation("type");
    
    67
    +        String result = getNode().getScope().getI18nTranslation("title");
    
    68 68
             Long count = getNode().getInitializer().getCount();
    
    69 69
             if (count != null) {
    
    70 70
                 result += String.format(" (%d)", count);
    

  • core/services/i18n/src/main/i18n/translations/services_en_GB.properties
    ... ... @@ -862,13 +862,13 @@ observe.data.ll.observation.SetDetailComposition.section.delete.message=Confirm
    862 862
     observe.data.ll.observation.SetDetailComposition.sectionTemplate.delete=Confirm to delete current template.
    
    863 863
     observe.data.ll.observation.SetDetailComposition.sections=Sections
    
    864 864
     observe.data.ll.observation.SetDetailComposition.title.section.cant.use.firstTemplate=Can't use the first template while generating
    
    865
    -observe.data.ll.observation.SetDetailComposition.type=Detailed compositions
    
    865
    +observe.data.ll.observation.SetDetailComposition.type=Detailed composition
    
    866 866
     observe.data.ll.observation.SetGlobalComposition.baitsCompositionTab=Baits
    
    867 867
     observe.data.ll.observation.SetGlobalComposition.branchlinesCompositionTab=Branchlines
    
    868 868
     observe.data.ll.observation.SetGlobalComposition.floatlinesCompositionTab=Floatlines
    
    869 869
     observe.data.ll.observation.SetGlobalComposition.hooksCompositionTab=Hooks
    
    870 870
     observe.data.ll.observation.SetGlobalComposition.mitigationTypeTab=Mitigation
    
    871
    -observe.data.ll.observation.SetGlobalComposition.type=Global compositions
    
    871
    +observe.data.ll.observation.SetGlobalComposition.type=Global composition
    
    872 872
     observe.data.ll.observation.SetTdr.type=Fishing operation tdr
    
    873 873
     observe.data.ll.observation.SizeMeasure.size=Size (cm)
    
    874 874
     observe.data.ll.observation.SizeMeasure.size.short=Size (cm)
    
    ... ... @@ -996,7 +996,7 @@ observe.data.ps.localmarket.Batch.count.short=Count
    996 996
     observe.data.ps.localmarket.Batch.count.validation.required=Count or weight must be filled (but not both).
    
    997 997
     observe.data.ps.localmarket.Batch.date=Date
    
    998 998
     observe.data.ps.localmarket.Batch.title=Batches
    
    999
    -observe.data.ps.localmarket.Batch.type=Batches
    
    999
    +observe.data.ps.localmarket.Batch.type=Batch
    
    1000 1000
     observe.data.ps.localmarket.Batch.validation.date.after.currentPsCommonTrip.endDate=Date (%2$s) must be after trip end date (%1$s).
    
    1001 1001
     observe.data.ps.localmarket.Batch.validation.date.after.currentPsCommonTrip.startDate=Date (%2$s) must be after trip start date (%1$s).
    
    1002 1002
     observe.data.ps.localmarket.Batch.validation.date.delay.too.long=Delay in days with trip end date is %d and can not be more than %s days.
    
    ... ... @@ -1351,7 +1351,7 @@ observe.data.ps.observation.ObjectObservedSpecies.type=Object observed species
    1351 1351
     observe.data.ps.observation.ObjectSchoolEstimate.action.create=Create a new estimate
    
    1352 1352
     observe.data.ps.observation.ObjectSchoolEstimate.action.save=Insert this estimate
    
    1353 1353
     observe.data.ps.observation.ObjectSchoolEstimate.action.save.tip=Insert this estimate
    
    1354
    -observe.data.ps.observation.ObjectSchoolEstimate.title=School estimate
    
    1354
    +observe.data.ps.observation.ObjectSchoolEstimate.title=Object School estimate
    
    1355 1355
     observe.data.ps.observation.ObjectSchoolEstimate.totalWeight=Weight (in t)
    
    1356 1356
     observe.data.ps.observation.ObjectSchoolEstimate.totalWeight.short=Total weight
    
    1357 1357
     observe.data.ps.observation.ObjectSchoolEstimate.type=Object school estimate
    

  • core/services/i18n/src/main/i18n/translations/services_fr_FR.properties
    ... ... @@ -471,8 +471,8 @@ observe.data.GearUseFeatures.gear=Équipement
    471 471
     observe.data.GearUseFeatures.gear.short=Équipement
    
    472 472
     observe.data.GearUseFeatures.number=Nombre
    
    473 473
     observe.data.GearUseFeatures.number.short=Nombre
    
    474
    -observe.data.GearUseFeatures.title=Équipement du bateau
    
    475
    -observe.data.GearUseFeatures.type=Équipement du bateau
    
    474
    +observe.data.GearUseFeatures.title=Équipements du navire
    
    475
    +observe.data.GearUseFeatures.type=Équipement du navire
    
    476 476
     observe.data.GearUseFeaturesMeasurement.type=Caractéristique d'un équipement
    
    477 477
     observe.data.InlineData.action.add=Nouvelle entrée
    
    478 478
     observe.data.InlineData.action.add.tip=Ajouter une nouvelle donnée de type «%s»
    
    ... ... @@ -714,7 +714,7 @@ observe.data.ll.logbook.SetGlobalComposition.branchlinesCompositionTab=Avançons
    714 714
     observe.data.ll.logbook.SetGlobalComposition.floatlinesCompositionTab=Orins
    
    715 715
     observe.data.ll.logbook.SetGlobalComposition.hooksCompositionTab=Hameçons
    
    716 716
     observe.data.ll.logbook.SetGlobalComposition.mitigationTypeTab=Atténuations
    
    717
    -observe.data.ll.logbook.SetGlobalComposition.type=Compositions globales
    
    717
    +observe.data.ll.logbook.SetGlobalComposition.type=Composition globale
    
    718 718
     observe.data.ll.observation.Activity.action.create=Activité suivante
    
    719 719
     observe.data.ll.observation.Activity.action.move=Changer de marée
    
    720 720
     observe.data.ll.observation.Activity.action.move.choose.parent.message=À quelle marée voulez-vous associer les activités sélectionnées ?
    
    ... ... @@ -729,8 +729,8 @@ observe.data.ll.observation.Activity.sensorUsedStat=Nombre de capteurs utilisés
    729 729
     observe.data.ll.observation.Activity.setStat=Nombre d'opérations de pêche
    
    730 730
     observe.data.ll.observation.Activity.title=Activité
    
    731 731
     observe.data.ll.observation.Activity.type=Activité
    
    732
    -observe.data.ll.observation.ActivityEncounter.type=Rencontre
    
    733
    -observe.data.ll.observation.ActivitySensorUsed.type=Capteur
    
    732
    +observe.data.ll.observation.ActivityEncounter.type=Rencontres
    
    733
    +observe.data.ll.observation.ActivitySensorUsed.type=Capteurs utilisés
    
    734 734
     observe.data.ll.observation.BaitsComposition.action.create=Nouvel appât
    
    735 735
     observe.data.ll.observation.BaitsComposition.action.save=Insérer cet appât
    
    736 736
     observe.data.ll.observation.BaitsComposition.action.save.tip=Insérer cet appât
    
    ... ... @@ -798,7 +798,7 @@ observe.data.ll.observation.SensorUsed.action.create=Nouveau capteur
    798 798
     observe.data.ll.observation.SensorUsed.action.save=Insérer ce capteur
    
    799 799
     observe.data.ll.observation.SensorUsed.action.save.tip=Insérer ce capteur
    
    800 800
     observe.data.ll.observation.SensorUsed.dataLocation.short=Hébergement
    
    801
    -observe.data.ll.observation.SensorUsed.title=Capteurs
    
    801
    +observe.data.ll.observation.SensorUsed.title=Capteurs utilisés
    
    802 802
     observe.data.ll.observation.SensorUsed.type=Capteur utilisé
    
    803 803
     observe.data.ll.observation.Set.action.add=Ajouter l'opération de pêche
    
    804 804
     observe.data.ll.observation.Set.action.add.tip=Ajouter l'opération de pêche associée à cette activité
    
    ... ... @@ -862,13 +862,13 @@ observe.data.ll.observation.SetDetailComposition.section.delete.message=Confirme
    862 862
     observe.data.ll.observation.SetDetailComposition.sectionTemplate.delete=Confirmer la suppression du patron sélectionné.
    
    863 863
     observe.data.ll.observation.SetDetailComposition.sections=Sections
    
    864 864
     observe.data.ll.observation.SetDetailComposition.title.section.cant.use.firstTemplate=Impossible d'utiliser le premier modèle lors de la génération
    
    865
    -observe.data.ll.observation.SetDetailComposition.type=Compositions détaillées
    
    865
    +observe.data.ll.observation.SetDetailComposition.type=Composition détaillée
    
    866 866
     observe.data.ll.observation.SetGlobalComposition.baitsCompositionTab=Appâts
    
    867 867
     observe.data.ll.observation.SetGlobalComposition.branchlinesCompositionTab=Avançons
    
    868 868
     observe.data.ll.observation.SetGlobalComposition.floatlinesCompositionTab=Orins
    
    869 869
     observe.data.ll.observation.SetGlobalComposition.hooksCompositionTab=Hameçons
    
    870 870
     observe.data.ll.observation.SetGlobalComposition.mitigationTypeTab=Atténuations
    
    871
    -observe.data.ll.observation.SetGlobalComposition.type=Compositions globales
    
    871
    +observe.data.ll.observation.SetGlobalComposition.type=Composition globale
    
    872 872
     observe.data.ll.observation.SetTdr.type=Enregistreur de profondeur
    
    873 873
     observe.data.ll.observation.SizeMeasure.size=Mesure (cm)
    
    874 874
     observe.data.ll.observation.SizeMeasure.size.short=Mesure (cm)
    
    ... ... @@ -883,7 +883,7 @@ observe.data.ll.observation.Tdr.keyDataTab=Données clef
    883 883
     observe.data.ll.observation.Tdr.localisationTab=Localisation
    
    884 884
     observe.data.ll.observation.Tdr.speciesTab=Espèces associées
    
    885 885
     observe.data.ll.observation.Tdr.timestampTab=Horodatage
    
    886
    -observe.data.ll.observation.Tdr.title=Enregistreur de profondeur
    
    886
    +observe.data.ll.observation.Tdr.title=Enregistreurs de profondeur
    
    887 887
     observe.data.ll.observation.Tdr.type=Enregistreur de profondeur
    
    888 888
     observe.data.ll.observation.Tdr.validation.deploymentEnd.after.fishingEnd=L'horodatage de fin de déploiement (%2$s) doit être après le début de celui de fin de pêche (%1$s).
    
    889 889
     observe.data.ll.observation.Tdr.validation.fishingEnd.after.fishingStart=L'horodatage de fin de pêche (%2$s) doit être après le début de celui de début de pêche (%1$s).
    
    ... ... @@ -1351,7 +1351,7 @@ observe.data.ps.observation.ObjectObservedSpecies.type=Faune observée
    1351 1351
     observe.data.ps.observation.ObjectSchoolEstimate.action.create=Nouvelle estimation
    
    1352 1352
     observe.data.ps.observation.ObjectSchoolEstimate.action.save=Insérer cette estimation
    
    1353 1353
     observe.data.ps.observation.ObjectSchoolEstimate.action.save.tip=Insérer la nouvelle estimation dans la table
    
    1354
    -observe.data.ps.observation.ObjectSchoolEstimate.title=Estimation banc
    
    1354
    +observe.data.ps.observation.ObjectSchoolEstimate.title=Estimation banc objet
    
    1355 1355
     observe.data.ps.observation.ObjectSchoolEstimate.totalWeight=Poids (en t)
    
    1356 1356
     observe.data.ps.observation.ObjectSchoolEstimate.totalWeight.short=Poids total
    
    1357 1357
     observe.data.ps.observation.ObjectSchoolEstimate.type=Estimation banc objet
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/Report.java
    ... ... @@ -59,11 +59,11 @@ public final class Report implements Serializable, JsonAware {
    59 59
         /**
    
    60 60
          * Cache of variables of this report indexed by their name.
    
    61 61
          */
    
    62
    -    private final transient Map<String, ReportVariable<?>> variableByName;
    
    62
    +    private transient Map<String, ReportVariable<?>> variableByName;
    
    63 63
         /**
    
    64 64
          * Cache of repeat variables of this report indexed by their name.
    
    65 65
          */
    
    66
    -    private final transient Map<String, ReportRepeatVariable<?>> repeatVariableByName;
    
    66
    +    private transient Map<String, ReportRepeatVariable<?>> repeatVariableByName;
    
    67 67
     
    
    68 68
         public Report(ReportDefinition definition) {
    
    69 69
             this.definition = Objects.requireNonNull(definition);
    
    ... ... @@ -82,82 +82,90 @@ public final class Report implements Serializable, JsonAware {
    82 82
                 ReportRepeatVariableDefinition<?> definitionRepeatVariable = definitionRepeatVariables[i];
    
    83 83
                 this.repeatVariables[i] = definitionRepeatVariable.toVariable();
    
    84 84
             }
    
    85
    -        this.variableByName = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariableSupport::getName, Function.identity())));
    
    86
    -        this.repeatVariableByName = Collections.unmodifiableMap(Arrays.stream(repeatVariables).collect(Collectors.toMap(ReportVariableSupport::getName, Function.identity())));
    
    87 85
         }
    
    88 86
     
    
    89
    -    public ReportDefinition getDefinition() {
    
    87
    +    public ReportDefinition definition() {
    
    90 88
             return definition;
    
    91 89
         }
    
    92 90
     
    
    91
    +    public String getModelType() {
    
    92
    +        return definition().getModelType();
    
    93
    +    }
    
    94
    +
    
    93 95
         public String getId() {
    
    94
    -        return getDefinition().getId();
    
    96
    +        return definition().getId();
    
    95 97
         }
    
    96 98
     
    
    97 99
         public String getName() {
    
    98
    -        return getDefinition().getName();
    
    100
    +        return definition().getName();
    
    99 101
         }
    
    100 102
     
    
    101 103
         public String getDescription() {
    
    102
    -        return getDefinition().getDescription();
    
    104
    +        return definition().getDescription();
    
    103 105
         }
    
    104 106
     
    
    105 107
         public int getRows() {
    
    106
    -        return getDefinition().getRows();
    
    108
    +        return definition().getRows();
    
    107 109
         }
    
    108 110
     
    
    109 111
         public int getColumns() {
    
    110
    -        return getDefinition().getColumns();
    
    112
    +        return definition().getColumns();
    
    111 113
         }
    
    112 114
     
    
    113 115
         public String[] getColumnHeaders() {
    
    114
    -        return getDefinition().getColumnHeaders();
    
    116
    +        return definition().getColumnHeaders();
    
    115 117
         }
    
    116 118
     
    
    117 119
         public String[] getRowHeaders() {
    
    118
    -        return getDefinition().getRowHeaders();
    
    120
    +        return definition().getRowHeaders();
    
    119 121
         }
    
    120 122
     
    
    121 123
         public ReportRequestDefinition[] getRequests() {
    
    122
    -        return getDefinition().getRequests();
    
    124
    +        return definition().getRequests();
    
    123 125
         }
    
    124 126
     
    
    125 127
         public ReportOperationDefinition[] getOperations() {
    
    126
    -        return getDefinition().getOperations();
    
    128
    +        return definition().getOperations();
    
    127 129
         }
    
    128 130
     
    
    129
    -    public ReportVariable<?>[] getVariables() {
    
    130
    -        return variables;
    
    131
    +    public Map<String, Set<String>> getVariableDependencies() {
    
    132
    +        return definition().getVariableDependencies();
    
    131 133
         }
    
    132 134
     
    
    133
    -    public Map<String, Set<String>> getVariableDependencies() {
    
    134
    -        return getDefinition().getVariableDependencies();
    
    135
    +    public ReportVariable<?>[] getVariables() {
    
    136
    +        return variables;
    
    135 137
         }
    
    136 138
     
    
    137 139
         public Map<String, ReportVariable<?>> getVariableByName() {
    
    140
    +        if (variableByName == null) {
    
    141
    +            this.variableByName = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariable::getName, Function.identity())));
    
    142
    +        }
    
    138 143
             return variableByName;
    
    139 144
         }
    
    140 145
     
    
    141 146
         public ReportVariable<?> getVariable(String variableName) {
    
    142
    -        return variableByName.get(variableName);
    
    147
    +        return getVariableByName().get(variableName);
    
    143 148
         }
    
    144 149
     
    
    145 150
         public ReportRepeatVariable<?>[] getRepeatVariables() {
    
    146 151
             return repeatVariables;
    
    147 152
         }
    
    148 153
     
    
    149
    -    public String getModelType() {
    
    150
    -        return getDefinition().getModelType();
    
    151
    -    }
    
    152
    -
    
    153
    -    @Override
    
    154
    -    public String toString() {
    
    155
    -        return getDefinition().toString();
    
    154
    +    public Map<String, ReportRepeatVariable<?>> getRepeatVariableByName() {
    
    155
    +        if (repeatVariableByName == null) {
    
    156
    +            this.repeatVariableByName = Collections.unmodifiableMap(Arrays.stream(repeatVariables).collect(Collectors.toMap(ReportRepeatVariable::getName, Function.identity())));
    
    157
    +        }
    
    158
    +        return repeatVariableByName;
    
    156 159
         }
    
    157 160
     
    
    158 161
         @SuppressWarnings("unchecked")
    
    159 162
         public <V> ReportRepeatVariable<V> getRepeatVariable(String name) {
    
    160
    -        return (ReportRepeatVariable<V>) repeatVariableByName.get(name);
    
    163
    +        return (ReportRepeatVariable<V>) getRepeatVariableByName().get(name);
    
    164
    +    }
    
    165
    +
    
    166
    +    @Override
    
    167
    +    public String toString() {
    
    168
    +        return definition().toString();
    
    161 169
         }
    
    162 170
     
    
    163 171
         /**
    
    ... ... @@ -246,12 +254,13 @@ public final class Report implements Serializable, JsonAware {
    246 254
          * @param dependencyVariableName the dependency variable name that has changed
    
    247 255
          */
    
    248 256
         public void unloadVariablesIfNecessary(String dependencyVariableName) {
    
    257
    +        Map<String, Set<String>> variableDependencyNamesMap = getVariableDependencies();
    
    249 258
             for (ReportVariable<?> variable : variables) {
    
    250 259
                 if (!variable.isValuesLoaded()) {
    
    251 260
                     // this variable is not loaded (so can not unload it)
    
    252 261
                     continue;
    
    253 262
                 }
    
    254
    -            Set<String> variableDependencyNames = getVariableDependencies().get(variable.getName());
    
    263
    +            Set<String> variableDependencyNames = variableDependencyNamesMap.get(variable.getName());
    
    255 264
                 if (variableDependencyNames == null) {
    
    256 265
                     // this variable has no dependency
    
    257 266
                     continue;
    
    ... ... @@ -262,4 +271,5 @@ public final class Report implements Serializable, JsonAware {
    262 271
                 }
    
    263 272
             }
    
    264 273
         }
    
    274
    +
    
    265 275
     }

  • toolkit/api-report/src/main/java/fr/ird/observe/report/ReportRepeatVariable.java
    ... ... @@ -44,22 +44,16 @@ import java.util.stream.Collectors;
    44 44
      * @author Tony Chemit - dev@tchemit.fr
    
    45 45
      * @since 9.0.23
    
    46 46
      */
    
    47
    -public final class ReportRepeatVariable<V> extends ReportVariableSupport<V> {
    
    47
    +public final class ReportRepeatVariable<V> extends ReportVariableSupport<V, ReportRepeatVariableDefinition<V>> {
    
    48 48
     
    
    49 49
         private static final long serialVersionUID = 1L;
    
    50
    -    private final ReportRepeatVariableDefinition<V> definition;
    
    51 50
     
    
    52 51
         public ReportRepeatVariable(ReportRepeatVariableDefinition<V> definition) {
    
    53
    -        this.definition = definition;
    
    54
    -    }
    
    55
    -
    
    56
    -    @Override
    
    57
    -    public ReportRepeatVariableDefinition<V> getDefinition() {
    
    58
    -        return definition;
    
    52
    +        super(definition);
    
    59 53
         }
    
    60 54
     
    
    61 55
         public boolean isAddNullValue() {
    
    62
    -        return getDefinition().isAddNullValue();
    
    56
    +        return definition().isAddNullValue();
    
    63 57
         }
    
    64 58
     
    
    65 59
         @Override
    
    ... ... @@ -72,7 +66,7 @@ public final class ReportRepeatVariable<V> extends ReportVariableSupport<V> {
    72 66
     
    
    73 67
         public List<String> computeIndexList() {
    
    74 68
             //FIXME This is already done by setValues method? Why using a "null" instead of null value?
    
    75
    -        Set<V> tmp = new LinkedHashSet<>(values);
    
    69
    +        Set<V> tmp = new LinkedHashSet<>(getValues());
    
    76 70
             boolean useNullValue = tmp.remove(null);
    
    77 71
             List<String> result = tmp.stream().map(s -> s instanceof ToolkitId ? ((ToolkitId) s).getId() : String.valueOf(s)).collect(Collectors.toList());
    
    78 72
             if (useNullValue || isAddNullValue()) {
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/ReportVariable.java
    ... ... @@ -30,25 +30,19 @@ import fr.ird.observe.report.definition.ReportVariableDefinition;
    30 30
      * @author Tony Chemit - dev@tchemit.fr
    
    31 31
      * @since 1.7
    
    32 32
      */
    
    33
    -public final class ReportVariable<V> extends ReportVariableSupport<V> {
    
    33
    +public final class ReportVariable<V> extends ReportVariableSupport<V, ReportVariableDefinition<V>> {
    
    34 34
     
    
    35 35
         public final static String PROPERTY_SELECTED_VALUE = "selectedValue";
    
    36 36
     
    
    37 37
         private static final long serialVersionUID = 1L;
    
    38 38
     
    
    39
    -    private final ReportVariableDefinition<V> definition;
    
    40 39
         /**
    
    41 40
          * Selected value for this variable, that will be used to execute report.
    
    42 41
          */
    
    43 42
         private V selectedValue;
    
    44 43
     
    
    45 44
         public ReportVariable(ReportVariableDefinition<V> definition) {
    
    46
    -        this.definition = definition;
    
    47
    -    }
    
    48
    -
    
    49
    -    @Override
    
    50
    -    public ReportVariableDefinition<V> getDefinition() {
    
    51
    -        return definition;
    
    45
    +        super(definition);
    
    52 46
         }
    
    53 47
     
    
    54 48
         public V getSelectedValue() {
    
    ... ... @@ -64,7 +58,7 @@ public final class ReportVariable<V> extends ReportVariableSupport<V> {
    64 58
         }
    
    65 59
     
    
    66 60
         public boolean isValuesLoadedAndSelectedValueFilled() {
    
    67
    -        return isValuesLoaded() && getSelectedValue() != null;
    
    61
    +        return isValuesLoaded() && isSelectedValueFilled();
    
    68 62
         }
    
    69 63
     
    
    70 64
         @Override
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/ReportVariableSupport.java
    ... ... @@ -22,7 +22,7 @@ package fr.ird.observe.report;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    -import fr.ird.observe.report.definition.ReportVariableSupportDefinition;
    
    25
    +import fr.ird.observe.report.definition.ReportVariableDefinitionSupport;
    
    26 26
     import io.ultreia.java4all.util.json.JsonAware;
    
    27 27
     
    
    28 28
     import java.io.Serializable;
    
    ... ... @@ -39,27 +39,38 @@ import java.util.Set;
    39 39
      * @see ReportRepeatVariable
    
    40 40
      * @since 9.0.22
    
    41 41
      */
    
    42
    -public abstract class ReportVariableSupport<V> implements Serializable, JsonAware {
    
    42
    +public abstract class ReportVariableSupport<V, D extends ReportVariableDefinitionSupport<V>> implements Serializable, JsonAware {
    
    43 43
     
    
    44
    +    public final static String PROPERTY_DEFINITION = "definition";
    
    44 45
         public final static String PROPERTY_VALUES = "values";
    
    45 46
     
    
    46 47
         /**
    
    47
    -     * Found values to this variable.
    
    48
    +     * Definition of this variable.
    
    48 49
          */
    
    49
    -    protected Set<V> values;
    
    50
    +    private final D definition;
    
    51
    +    /**
    
    52
    +     * Values loaded for this variable.
    
    53
    +     */
    
    54
    +    private Set<V> values;
    
    50 55
     
    
    51
    -    public abstract ReportVariableSupportDefinition<V> getDefinition();
    
    56
    +    protected ReportVariableSupport(D definition) {
    
    57
    +        this.definition = definition;
    
    58
    +    }
    
    59
    +
    
    60
    +    public final D definition() {
    
    61
    +        return definition;
    
    62
    +    }
    
    52 63
     
    
    53 64
         public final String getName() {
    
    54
    -        return getDefinition().getName();
    
    65
    +        return definition().getName();
    
    55 66
         }
    
    56 67
     
    
    57 68
         public final Class<V> getType() {
    
    58
    -        return getDefinition().getType();
    
    69
    +        return definition().getType();
    
    59 70
         }
    
    60 71
     
    
    61 72
         public final String getRequest() {
    
    62
    -        return getDefinition().getRequest();
    
    73
    +        return definition().getRequest();
    
    63 74
         }
    
    64 75
     
    
    65 76
         public final Set<V> getValues() {
    
    ... ... @@ -82,12 +93,12 @@ public abstract class ReportVariableSupport<V> implements Serializable, JsonAwar
    82 93
         public final boolean equals(Object o) {
    
    83 94
             if (this == o) return true;
    
    84 95
             if (o == null || !getClass().equals(o.getClass())) return false;
    
    85
    -        ReportVariableSupport<?> that = (ReportVariableSupport<?>) o;
    
    86
    -        return Objects.equals(getDefinition(), that.getDefinition());
    
    96
    +        ReportVariableSupport<?, ?> that = (ReportVariableSupport<?, ?>) o;
    
    97
    +        return Objects.equals(definition(), that.definition());
    
    87 98
         }
    
    88 99
     
    
    89 100
         @Override
    
    90 101
         public final int hashCode() {
    
    91
    -        return Objects.hash(getDefinition());
    
    102
    +        return Objects.hash(definition());
    
    92 103
         }
    
    93 104
     }

  • toolkit/api-report/src/main/java/fr/ird/observe/report/definition/DefaultReportDefinitionsBuilder.java
    ... ... @@ -139,7 +139,7 @@ public class DefaultReportDefinitionsBuilder implements ReportDefinitionsBuilder
    139 139
             String[] rowHeaders = loadHeaders(reportName, REPORT_ROWS, reportProperties);
    
    140 140
             String[] columnHeaders = loadHeaders(reportName, REPORT_COLUMNS, reportProperties);
    
    141 141
             List<ReportVariableDefinition<?>> variables = getVariables(reportName, reportProperties);
    
    142
    -        Set<String> variablesNames = variables.stream().map(ReportVariableSupportDefinition::getName).collect(Collectors.toSet());
    
    142
    +        Set<String> variablesNames = variables.stream().map(ReportVariableDefinition::getName).collect(Collectors.toSet());
    
    143 143
             List<ReportRepeatVariableDefinition<?>> repeatVariables = getRepeatVariables(reportName, reportProperties, variablesNames);
    
    144 144
             ReportRequestDefinition[] requests = getRequests(reportName, reportProperties);
    
    145 145
             List<ReportOperationDefinition> operations = getOperations(reportName, reportProperties);
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportDefinition.java
    ... ... @@ -94,7 +94,7 @@ public final class ReportDefinition implements Serializable, JsonAware {
    94 94
         /**
    
    95 95
          * Cache of dependencies on variables (key is variable name, value is the required variable names to be able to populate the variable).
    
    96 96
          */
    
    97
    -    private final transient Map<String, Set<String>> variableDependencies;
    
    97
    +    private transient Map<String, Set<String>> variableDependencies;
    
    98 98
     
    
    99 99
         public ReportDefinition(String modelType,
    
    100 100
                                 String id,
    
    ... ... @@ -116,8 +116,6 @@ public final class ReportDefinition implements Serializable, JsonAware {
    116 116
             this.operations = operations;
    
    117 117
             this.variables = variables;
    
    118 118
             this.repeatVariables = repeatVariables;
    
    119
    -        Map<String, ReportVariableDefinition<?>> variableByName = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariableDefinition::getName, Function.identity())));
    
    120
    -        this.variableDependencies = computeVariableDependencies(variableByName);
    
    121 119
         }
    
    122 120
     
    
    123 121
         public String getModelType() {
    
    ... ... @@ -149,6 +147,9 @@ public final class ReportDefinition implements Serializable, JsonAware {
    149 147
         }
    
    150 148
     
    
    151 149
         public Map<String, Set<String>> getVariableDependencies() {
    
    150
    +        if (variableDependencies == null) {
    
    151
    +            this.variableDependencies = computeVariableDependencies();
    
    152
    +        }
    
    152 153
             return variableDependencies;
    
    153 154
         }
    
    154 155
     
    
    ... ... @@ -181,8 +182,8 @@ public final class ReportDefinition implements Serializable, JsonAware {
    181 182
             return t(name);
    
    182 183
         }
    
    183 184
     
    
    184
    -    static Map<String, Set<String>> computeVariableDependencies(Map<String, ReportVariableDefinition<?>> variableByNames) {
    
    185
    -
    
    185
    +    private Map<String, Set<String>> computeVariableDependencies() {
    
    186
    +        Map<String, ReportVariableDefinition<?>> variableByNames = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariableDefinition::getName, Function.identity())));
    
    186 187
             Set<String> variableNames = variableByNames.keySet();
    
    187 188
             Map<String, Set<String>> variableDependencies = new TreeMap<>();
    
    188 189
             for (Map.Entry<String, ReportVariableDefinition<?>> entry : variableByNames.entrySet()) {
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportOperationDefinition.java
    ... ... @@ -38,6 +38,9 @@ public final class ReportOperationDefinition implements JsonAware {
    38 38
          * Name of the operation, this is the fully qualified name of the ReportOperationConsumer.
    
    39 39
          */
    
    40 40
         private final String name;
    
    41
    +    /**
    
    42
    +     * Optional parameters of this operation.
    
    43
    +     */
    
    41 44
         private final String parameters;
    
    42 45
     
    
    43 46
         public static ReportOperationDefinition of(String name) {
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportRepeatVariableDefinition.java
    ... ... @@ -30,9 +30,7 @@ import fr.ird.observe.report.ReportRepeatVariable;
    30 30
      * @author Tony Chemit - dev@tchemit.fr
    
    31 31
      * @since 9.0.23
    
    32 32
      */
    
    33
    -public final class ReportRepeatVariableDefinition<V> extends ReportVariableSupportDefinition<V> {
    
    34
    -
    
    35
    -    public final static String PROPERTY_ADD_NULL_VALUE = "addNullValue";
    
    33
    +public final class ReportRepeatVariableDefinition<V> extends ReportVariableDefinitionSupport<V> {
    
    36 34
     
    
    37 35
         private static final long serialVersionUID = 1L;
    
    38 36
     
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableDefinition.java
    ... ... @@ -33,7 +33,7 @@ import fr.ird.observe.report.ReportVariable;
    33 33
      * @author Tony Chemit - dev@tchemit.fr
    
    34 34
      * @since 2.0.23
    
    35 35
      */
    
    36
    -public final class ReportVariableDefinition<V> extends ReportVariableSupportDefinition<V> {
    
    36
    +public final class ReportVariableDefinition<V> extends ReportVariableDefinitionSupport<V> {
    
    37 37
     
    
    38 38
         public ReportVariableDefinition(String name, Class<V> type, String request, String comment) {
    
    39 39
             super(name, type, request, comment);
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableSupportDefinition.javatoolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableDefinitionSupport.java
    ... ... @@ -37,13 +37,7 @@ import java.util.Objects;
    37 37
      * @author Tony Chemit - dev@tchemit.fr
    
    38 38
      * @since 2.0.23
    
    39 39
      */
    
    40
    -public abstract class ReportVariableSupportDefinition<V> implements Serializable, JsonAware {
    
    41
    -
    
    42
    -    public final static String PROPERTY_NAME = "name";
    
    43
    -    public final static String PROPERTY_TYPE = "type";
    
    44
    -    public final static String PROPERTY_REQUEST = "request";
    
    45
    -    public final static String PROPERTY_COMMENT = "comment";
    
    46
    -
    
    40
    +public abstract class ReportVariableDefinitionSupport<V> implements Serializable, JsonAware {
    
    47 41
         /**
    
    48 42
          * Name of the variable.
    
    49 43
          */
    
    ... ... @@ -61,7 +55,7 @@ public abstract class ReportVariableSupportDefinition<V> implements Serializable
    61 55
          */
    
    62 56
         private final String comment;
    
    63 57
     
    
    64
    -    public ReportVariableSupportDefinition(String name, Class<V> type, String request, String comment) {
    
    58
    +    public ReportVariableDefinitionSupport(String name, Class<V> type, String request, String comment) {
    
    65 59
             this.name = Objects.requireNonNull(name);
    
    66 60
             this.type = Objects.requireNonNull(type);
    
    67 61
             this.request = Objects.requireNonNull(request);
    
    ... ... @@ -88,13 +82,13 @@ public abstract class ReportVariableSupportDefinition<V> implements Serializable
    88 82
             return comment != null;
    
    89 83
         }
    
    90 84
     
    
    91
    -    public abstract ReportVariableSupport<?> toVariable();
    
    85
    +    public abstract ReportVariableSupport<?, ?> toVariable();
    
    92 86
     
    
    93 87
         @Override
    
    94 88
         public final boolean equals(Object o) {
    
    95 89
             if (this == o) return true;
    
    96 90
             if (o == null || !getClass().equals(o.getClass())) return false;
    
    97
    -        ReportVariableSupportDefinition<?> that = (ReportVariableSupportDefinition<?>) o;
    
    91
    +        ReportVariableDefinitionSupport<?> that = (ReportVariableDefinitionSupport<?>) o;
    
    98 92
             return Objects.equals(name, that.name);
    
    99 93
         }
    
    100 94
     
    

  • toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportRepeatVariableAdapter.java
    ... ... @@ -24,10 +24,8 @@ package fr.ird.observe.report.json;
    24 24
     
    
    25 25
     import com.google.auto.service.AutoService;
    
    26 26
     import com.google.gson.JsonDeserializationContext;
    
    27
    -import com.google.gson.JsonDeserializer;
    
    28
    -import com.google.gson.JsonElement;
    
    29 27
     import com.google.gson.JsonObject;
    
    30
    -import com.google.gson.JsonParseException;
    
    28
    +import com.google.gson.reflect.TypeToken;
    
    31 29
     import fr.ird.observe.report.ReportRepeatVariable;
    
    32 30
     import fr.ird.observe.report.definition.ReportRepeatVariableDefinition;
    
    33 31
     import io.ultreia.java4all.util.json.JsonAdapter;
    
    ... ... @@ -41,7 +39,7 @@ import java.lang.reflect.Type;
    41 39
      * @since 9.0.22
    
    42 40
      */
    
    43 41
     @AutoService(JsonAdapter.class)
    
    44
    -public class ReportRepeatVariableAdapter extends ReportVariableSupportAdapter implements JsonDeserializer<ReportRepeatVariable<?>> {
    
    42
    +public class ReportRepeatVariableAdapter<V> extends ReportVariableSupportAdapter<V, ReportRepeatVariableDefinition<V>, ReportRepeatVariable<V>> {
    
    45 43
     
    
    46 44
         @Override
    
    47 45
         public Class<?> type() {
    
    ... ... @@ -49,22 +47,15 @@ public class ReportRepeatVariableAdapter extends ReportVariableSupportAdapter im
    49 47
         }
    
    50 48
     
    
    51 49
         @Override
    
    52
    -    public ReportRepeatVariable<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    53
    -        JsonObject jsonObject = json.getAsJsonObject();
    
    54
    -
    
    55
    -        String name = getVariableName(context, jsonObject);
    
    56
    -        Class<?> type = getVariableType(context, jsonObject);
    
    57
    -        String request = getVariableRequest(context, jsonObject);
    
    58
    -        String comment = getVariableComment(context, jsonObject);
    
    59
    -        boolean addNullValue = getAddNullValue(context, jsonObject);
    
    60
    -        ReportRepeatVariableDefinition<?> definition = new ReportRepeatVariableDefinition<>(name, type, request, comment, addNullValue);
    
    61
    -        ReportRepeatVariable<?> result = new ReportRepeatVariable<>(definition);
    
    62
    -
    
    63
    -        loadVariableValues(context, jsonObject, result);
    
    64
    -        return result;
    
    50
    +    protected Type definitionType() {
    
    51
    +        return new TypeToken<ReportRepeatVariableDefinition<V>>() {
    
    52
    +        }.getType();
    
    65 53
         }
    
    66 54
     
    
    67
    -    protected boolean getAddNullValue(JsonDeserializationContext context, JsonObject jsonObject) {
    
    68
    -        return context.deserialize(jsonObject.get(ReportRepeatVariableDefinition.PROPERTY_ADD_NULL_VALUE), boolean.class);
    
    55
    +    @Override
    
    56
    +    protected ReportRepeatVariable<V> deserialize(JsonDeserializationContext context, JsonObject jsonObject, ReportRepeatVariableDefinition<V> definition) {
    
    57
    +        ReportRepeatVariable<V> result = new ReportRepeatVariable<>(definition);
    
    58
    +        deserializeValues(context, jsonObject, result);
    
    59
    +        return result;
    
    69 60
         }
    
    70 61
     }

  • toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportVariableAdapter.java
    ... ... @@ -25,10 +25,9 @@ package fr.ird.observe.report.json;
    25 25
     
    
    26 26
     import com.google.auto.service.AutoService;
    
    27 27
     import com.google.gson.JsonDeserializationContext;
    
    28
    -import com.google.gson.JsonDeserializer;
    
    29 28
     import com.google.gson.JsonElement;
    
    30 29
     import com.google.gson.JsonObject;
    
    31
    -import com.google.gson.JsonParseException;
    
    30
    +import com.google.gson.reflect.TypeToken;
    
    32 31
     import fr.ird.observe.report.ReportVariable;
    
    33 32
     import fr.ird.observe.report.definition.ReportVariableDefinition;
    
    34 33
     import io.ultreia.java4all.util.json.JsonAdapter;
    
    ... ... @@ -39,7 +38,7 @@ import java.lang.reflect.Type;
    39 38
      * @author Tony Chemit - dev@tchemit.fr
    
    40 39
      */
    
    41 40
     @AutoService(JsonAdapter.class)
    
    42
    -public class ReportVariableAdapter extends ReportVariableSupportAdapter implements JsonDeserializer<ReportVariable<?>> {
    
    41
    +public class ReportVariableAdapter<V> extends ReportVariableSupportAdapter<V, ReportVariableDefinition<V>, ReportVariable<V>> {
    
    43 42
     
    
    44 43
         @Override
    
    45 44
         public Class<?> type() {
    
    ... ... @@ -47,27 +46,22 @@ public class ReportVariableAdapter extends ReportVariableSupportAdapter implemen
    47 46
         }
    
    48 47
     
    
    49 48
         @Override
    
    50
    -    public ReportVariable<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    51
    -        JsonObject jsonObject = json.getAsJsonObject();
    
    52
    -
    
    53
    -        String name = getVariableName(context, jsonObject);
    
    54
    -        Class<?> type = getVariableType(context, jsonObject);
    
    55
    -        String request = getVariableRequest(context, jsonObject);
    
    56
    -        String comment = getVariableComment(context, jsonObject);
    
    57
    -
    
    58
    -        ReportVariableDefinition<?> definition = new ReportVariableDefinition<>(name, type, request, comment);
    
    59
    -        ReportVariable<?> result = new ReportVariable<>(definition);
    
    49
    +    protected Type definitionType() {
    
    50
    +        return new TypeToken<ReportVariableDefinition<V>>() {
    
    51
    +        }.getType();
    
    52
    +    }
    
    60 53
     
    
    61
    -        loadVariableValues(context, jsonObject, result);
    
    62
    -        loadSelectedValue(context, jsonObject, result);
    
    54
    +    @Override
    
    55
    +    protected ReportVariable<V> deserialize(JsonDeserializationContext context, JsonObject jsonObject, ReportVariableDefinition<V> definition) {
    
    56
    +        ReportVariable<V> result = new ReportVariable<>(definition);
    
    57
    +        deserializeValues(context, jsonObject, result);
    
    58
    +        deserializeSelectedValue(context, jsonObject, result);
    
    63 59
             return result;
    
    64 60
         }
    
    65 61
     
    
    66
    -    protected <V> void loadSelectedValue(JsonDeserializationContext context, JsonObject jsonObject, ReportVariable<V> variable) {
    
    62
    +    protected void deserializeSelectedValue(JsonDeserializationContext context, JsonObject jsonObject, ReportVariable<V> variable) {
    
    67 63
             JsonElement json = jsonObject.get(ReportVariable.PROPERTY_SELECTED_VALUE);
    
    68
    -        if (json != null) {
    
    69
    -            V selectedValue = context.deserialize(json, variable.getType());
    
    70
    -            variable.setSelectedValue(selectedValue);
    
    71
    -        }
    
    64
    +        V selectedValue = deserializeValue(context, variable.getType(), json);
    
    65
    +        variable.setSelectedValue(selectedValue);
    
    72 66
         }
    
    73 67
     }

  • toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportVariableSupportAdapter.java
    ... ... @@ -22,13 +22,17 @@ package fr.ird.observe.report.json;
    22 22
      * #L%
    
    23 23
      */
    
    24 24
     
    
    25
    +import com.google.gson.JsonArray;
    
    25 26
     import com.google.gson.JsonDeserializationContext;
    
    27
    +import com.google.gson.JsonDeserializer;
    
    26 28
     import com.google.gson.JsonElement;
    
    27 29
     import com.google.gson.JsonObject;
    
    30
    +import com.google.gson.JsonParseException;
    
    28 31
     import fr.ird.observe.report.ReportVariableSupport;
    
    29
    -import fr.ird.observe.report.definition.ReportVariableSupportDefinition;
    
    32
    +import fr.ird.observe.report.definition.ReportVariableDefinitionSupport;
    
    30 33
     import io.ultreia.java4all.util.json.JsonAdapter;
    
    31 34
     
    
    35
    +import java.lang.reflect.Type;
    
    32 36
     import java.util.HashSet;
    
    33 37
     import java.util.Set;
    
    34 38
     
    
    ... ... @@ -40,34 +44,38 @@ import java.util.Set;
    40 44
      * @author Tony Chemit - dev@tchemit.fr
    
    41 45
      * @since 9.0.22
    
    42 46
      */
    
    43
    -public abstract class ReportVariableSupportAdapter implements JsonAdapter {
    
    47
    +public abstract class ReportVariableSupportAdapter<V, D extends ReportVariableDefinitionSupport<V>, R extends ReportVariableSupport<V, D>> implements JsonAdapter, JsonDeserializer<R> {
    
    44 48
     
    
    45
    -    protected String getVariableName(JsonDeserializationContext context, JsonObject jsonObject) {
    
    46
    -        return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_NAME), String.class);
    
    47
    -    }
    
    49
    +    protected abstract Type definitionType();
    
    48 50
     
    
    49
    -    protected Class<?> getVariableType(JsonDeserializationContext context, JsonObject jsonObject) {
    
    50
    -        return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_TYPE), Class.class);
    
    51
    -    }
    
    51
    +    protected abstract R deserialize(JsonDeserializationContext context, JsonObject jsonObject, D definition);
    
    52 52
     
    
    53
    -    protected String getVariableRequest(JsonDeserializationContext context, JsonObject jsonObject) {
    
    54
    -        return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_REQUEST), String.class);
    
    53
    +    @Override
    
    54
    +    public final R deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
    
    55
    +        JsonObject jsonObject = json.getAsJsonObject();
    
    56
    +        D definition = deserializeDefinition(context, jsonObject);
    
    57
    +        return deserialize(context, jsonObject, definition);
    
    55 58
         }
    
    56 59
     
    
    57
    -    protected String getVariableComment(JsonDeserializationContext context, JsonObject jsonObject) {
    
    58
    -        return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_COMMENT), String.class);
    
    60
    +    protected D deserializeDefinition(JsonDeserializationContext context, JsonObject jsonObject) {
    
    61
    +        return context.deserialize(jsonObject.get(ReportVariableSupport.PROPERTY_DEFINITION), definitionType());
    
    59 62
         }
    
    60 63
     
    
    61
    -    protected <V> void loadVariableValues(JsonDeserializationContext context, JsonObject jsonObject, ReportVariableSupport<V> variable) {
    
    64
    +    protected void deserializeValues(JsonDeserializationContext context, JsonObject jsonObject, R variable) {
    
    62 65
             JsonElement valuesJson = jsonObject.get(ReportVariableSupport.PROPERTY_VALUES);
    
    63 66
             if (valuesJson != null) {
    
    64
    -            Set<V> values = new HashSet<>();
    
    65 67
                 Class<V> type = variable.getType();
    
    66
    -            for (JsonElement valueJson : valuesJson.getAsJsonArray()) {
    
    67
    -                V value = context.deserialize(valueJson, type);
    
    68
    +            JsonArray jsonArray = valuesJson.getAsJsonArray();
    
    69
    +            Set<V> values = new HashSet<>(jsonArray.size());
    
    70
    +            for (JsonElement valueJson : jsonArray) {
    
    71
    +                V value = deserializeValue(context, type, valueJson);
    
    68 72
                     values.add(value);
    
    69 73
                 }
    
    70 74
                 variable.setValues(values);
    
    71 75
             }
    
    72 76
         }
    
    77
    +
    
    78
    +    protected V deserializeValue(JsonDeserializationContext context, Class<V> variableType, JsonElement valueJson) {
    
    79
    +        return valueJson == null ? null : context.deserialize(valueJson, variableType);
    
    80
    +    }
    
    73 81
     }