Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: 74be88a7 by Tony Chemit at 2023-01-05T13:36:50+01:00 Report API - Review it and make json compliant - - - - - d17023ba by Tony Chemit at 2023-01-05T13:36:54+01:00 Améliorations de libellés de l'arbre - Closes #2595 - - - - - 17 changed files: - client/datasource/actions/src/main/java/fr/ird/observe/client/datasource/actions/report/ReportModel.java - client/datasource/editor/api/src/main/java/fr/ird/observe/client/datasource/editor/api/content/data/table/ContentTableUINavigationHandler.java - core/services/i18n/src/main/i18n/translations/services_en_GB.properties - core/services/i18n/src/main/i18n/translations/services_fr_FR.properties - toolkit/api-report/src/main/java/fr/ird/observe/report/Report.java - toolkit/api-report/src/main/java/fr/ird/observe/report/ReportRepeatVariable.java - toolkit/api-report/src/main/java/fr/ird/observe/report/ReportVariable.java - toolkit/api-report/src/main/java/fr/ird/observe/report/ReportVariableSupport.java - toolkit/api-report/src/main/java/fr/ird/observe/report/definition/DefaultReportDefinitionsBuilder.java - toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportDefinition.java - toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportOperationDefinition.java - toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportRepeatVariableDefinition.java - toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableDefinition.java - toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableSupportDefinition.java → toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableDefinitionSupport.java - toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportRepeatVariableAdapter.java - toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportVariableAdapter.java - toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportVariableSupportAdapter.java 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 { } public ReportDefinition getSelectedReportDefinition() { - return selectedReport == null ? null : selectedReport.getDefinition(); + return selectedReport == null ? null : selectedReport.definition(); } 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 @Override public String getText() { - String result = getNode().getScope().getI18nTranslation("type"); + String result = getNode().getScope().getI18nTranslation("title"); Long count = getNode().getInitializer().getCount(); if (count != null) { 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 observe.data.ll.observation.SetDetailComposition.sectionTemplate.delete=Confirm to delete current template. observe.data.ll.observation.SetDetailComposition.sections=Sections observe.data.ll.observation.SetDetailComposition.title.section.cant.use.firstTemplate=Can't use the first template while generating -observe.data.ll.observation.SetDetailComposition.type=Detailed compositions +observe.data.ll.observation.SetDetailComposition.type=Detailed composition observe.data.ll.observation.SetGlobalComposition.baitsCompositionTab=Baits observe.data.ll.observation.SetGlobalComposition.branchlinesCompositionTab=Branchlines observe.data.ll.observation.SetGlobalComposition.floatlinesCompositionTab=Floatlines observe.data.ll.observation.SetGlobalComposition.hooksCompositionTab=Hooks observe.data.ll.observation.SetGlobalComposition.mitigationTypeTab=Mitigation -observe.data.ll.observation.SetGlobalComposition.type=Global compositions +observe.data.ll.observation.SetGlobalComposition.type=Global composition observe.data.ll.observation.SetTdr.type=Fishing operation tdr observe.data.ll.observation.SizeMeasure.size=Size (cm) observe.data.ll.observation.SizeMeasure.size.short=Size (cm) @@ -996,7 +996,7 @@ observe.data.ps.localmarket.Batch.count.short=Count observe.data.ps.localmarket.Batch.count.validation.required=Count or weight must be filled (but not both). observe.data.ps.localmarket.Batch.date=Date observe.data.ps.localmarket.Batch.title=Batches -observe.data.ps.localmarket.Batch.type=Batches +observe.data.ps.localmarket.Batch.type=Batch observe.data.ps.localmarket.Batch.validation.date.after.currentPsCommonTrip.endDate=Date (%2$s) must be after trip end date (%1$s). observe.data.ps.localmarket.Batch.validation.date.after.currentPsCommonTrip.startDate=Date (%2$s) must be after trip start date (%1$s). 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 observe.data.ps.observation.ObjectSchoolEstimate.action.create=Create a new estimate observe.data.ps.observation.ObjectSchoolEstimate.action.save=Insert this estimate observe.data.ps.observation.ObjectSchoolEstimate.action.save.tip=Insert this estimate -observe.data.ps.observation.ObjectSchoolEstimate.title=School estimate +observe.data.ps.observation.ObjectSchoolEstimate.title=Object School estimate observe.data.ps.observation.ObjectSchoolEstimate.totalWeight=Weight (in t) observe.data.ps.observation.ObjectSchoolEstimate.totalWeight.short=Total weight 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 observe.data.GearUseFeatures.gear.short=Équipement observe.data.GearUseFeatures.number=Nombre observe.data.GearUseFeatures.number.short=Nombre -observe.data.GearUseFeatures.title=Équipement du bateau -observe.data.GearUseFeatures.type=Équipement du bateau +observe.data.GearUseFeatures.title=Équipements du navire +observe.data.GearUseFeatures.type=Équipement du navire observe.data.GearUseFeaturesMeasurement.type=Caractéristique d'un équipement observe.data.InlineData.action.add=Nouvelle entrée 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 observe.data.ll.logbook.SetGlobalComposition.floatlinesCompositionTab=Orins observe.data.ll.logbook.SetGlobalComposition.hooksCompositionTab=Hameçons observe.data.ll.logbook.SetGlobalComposition.mitigationTypeTab=Atténuations -observe.data.ll.logbook.SetGlobalComposition.type=Compositions globales +observe.data.ll.logbook.SetGlobalComposition.type=Composition globale observe.data.ll.observation.Activity.action.create=Activité suivante observe.data.ll.observation.Activity.action.move=Changer de marée 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 observe.data.ll.observation.Activity.setStat=Nombre d'opérations de pêche observe.data.ll.observation.Activity.title=Activité observe.data.ll.observation.Activity.type=Activité -observe.data.ll.observation.ActivityEncounter.type=Rencontre -observe.data.ll.observation.ActivitySensorUsed.type=Capteur +observe.data.ll.observation.ActivityEncounter.type=Rencontres +observe.data.ll.observation.ActivitySensorUsed.type=Capteurs utilisés observe.data.ll.observation.BaitsComposition.action.create=Nouvel appât observe.data.ll.observation.BaitsComposition.action.save=Insérer cet appât 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 observe.data.ll.observation.SensorUsed.action.save=Insérer ce capteur observe.data.ll.observation.SensorUsed.action.save.tip=Insérer ce capteur observe.data.ll.observation.SensorUsed.dataLocation.short=Hébergement -observe.data.ll.observation.SensorUsed.title=Capteurs +observe.data.ll.observation.SensorUsed.title=Capteurs utilisés observe.data.ll.observation.SensorUsed.type=Capteur utilisé observe.data.ll.observation.Set.action.add=Ajouter l'opération de pêche 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 observe.data.ll.observation.SetDetailComposition.sectionTemplate.delete=Confirmer la suppression du patron sélectionné. observe.data.ll.observation.SetDetailComposition.sections=Sections observe.data.ll.observation.SetDetailComposition.title.section.cant.use.firstTemplate=Impossible d'utiliser le premier modèle lors de la génération -observe.data.ll.observation.SetDetailComposition.type=Compositions détaillées +observe.data.ll.observation.SetDetailComposition.type=Composition détaillée observe.data.ll.observation.SetGlobalComposition.baitsCompositionTab=Appâts observe.data.ll.observation.SetGlobalComposition.branchlinesCompositionTab=Avançons observe.data.ll.observation.SetGlobalComposition.floatlinesCompositionTab=Orins observe.data.ll.observation.SetGlobalComposition.hooksCompositionTab=Hameçons observe.data.ll.observation.SetGlobalComposition.mitigationTypeTab=Atténuations -observe.data.ll.observation.SetGlobalComposition.type=Compositions globales +observe.data.ll.observation.SetGlobalComposition.type=Composition globale observe.data.ll.observation.SetTdr.type=Enregistreur de profondeur observe.data.ll.observation.SizeMeasure.size=Mesure (cm) observe.data.ll.observation.SizeMeasure.size.short=Mesure (cm) @@ -883,7 +883,7 @@ observe.data.ll.observation.Tdr.keyDataTab=Données clef observe.data.ll.observation.Tdr.localisationTab=Localisation observe.data.ll.observation.Tdr.speciesTab=Espèces associées observe.data.ll.observation.Tdr.timestampTab=Horodatage -observe.data.ll.observation.Tdr.title=Enregistreur de profondeur +observe.data.ll.observation.Tdr.title=Enregistreurs de profondeur observe.data.ll.observation.Tdr.type=Enregistreur de profondeur 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). 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 observe.data.ps.observation.ObjectSchoolEstimate.action.create=Nouvelle estimation observe.data.ps.observation.ObjectSchoolEstimate.action.save=Insérer cette estimation observe.data.ps.observation.ObjectSchoolEstimate.action.save.tip=Insérer la nouvelle estimation dans la table -observe.data.ps.observation.ObjectSchoolEstimate.title=Estimation banc +observe.data.ps.observation.ObjectSchoolEstimate.title=Estimation banc objet observe.data.ps.observation.ObjectSchoolEstimate.totalWeight=Poids (en t) observe.data.ps.observation.ObjectSchoolEstimate.totalWeight.short=Poids total 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 { /** * Cache of variables of this report indexed by their name. */ - private final transient Map<String, ReportVariable<?>> variableByName; + private transient Map<String, ReportVariable<?>> variableByName; /** * Cache of repeat variables of this report indexed by their name. */ - private final transient Map<String, ReportRepeatVariable<?>> repeatVariableByName; + private transient Map<String, ReportRepeatVariable<?>> repeatVariableByName; public Report(ReportDefinition definition) { this.definition = Objects.requireNonNull(definition); @@ -82,82 +82,90 @@ public final class Report implements Serializable, JsonAware { ReportRepeatVariableDefinition<?> definitionRepeatVariable = definitionRepeatVariables[i]; this.repeatVariables[i] = definitionRepeatVariable.toVariable(); } - this.variableByName = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariableSupport::getName, Function.identity()))); - this.repeatVariableByName = Collections.unmodifiableMap(Arrays.stream(repeatVariables).collect(Collectors.toMap(ReportVariableSupport::getName, Function.identity()))); } - public ReportDefinition getDefinition() { + public ReportDefinition definition() { return definition; } + public String getModelType() { + return definition().getModelType(); + } + public String getId() { - return getDefinition().getId(); + return definition().getId(); } public String getName() { - return getDefinition().getName(); + return definition().getName(); } public String getDescription() { - return getDefinition().getDescription(); + return definition().getDescription(); } public int getRows() { - return getDefinition().getRows(); + return definition().getRows(); } public int getColumns() { - return getDefinition().getColumns(); + return definition().getColumns(); } public String[] getColumnHeaders() { - return getDefinition().getColumnHeaders(); + return definition().getColumnHeaders(); } public String[] getRowHeaders() { - return getDefinition().getRowHeaders(); + return definition().getRowHeaders(); } public ReportRequestDefinition[] getRequests() { - return getDefinition().getRequests(); + return definition().getRequests(); } public ReportOperationDefinition[] getOperations() { - return getDefinition().getOperations(); + return definition().getOperations(); } - public ReportVariable<?>[] getVariables() { - return variables; + public Map<String, Set<String>> getVariableDependencies() { + return definition().getVariableDependencies(); } - public Map<String, Set<String>> getVariableDependencies() { - return getDefinition().getVariableDependencies(); + public ReportVariable<?>[] getVariables() { + return variables; } public Map<String, ReportVariable<?>> getVariableByName() { + if (variableByName == null) { + this.variableByName = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariable::getName, Function.identity()))); + } return variableByName; } public ReportVariable<?> getVariable(String variableName) { - return variableByName.get(variableName); + return getVariableByName().get(variableName); } public ReportRepeatVariable<?>[] getRepeatVariables() { return repeatVariables; } - public String getModelType() { - return getDefinition().getModelType(); - } - - @Override - public String toString() { - return getDefinition().toString(); + public Map<String, ReportRepeatVariable<?>> getRepeatVariableByName() { + if (repeatVariableByName == null) { + this.repeatVariableByName = Collections.unmodifiableMap(Arrays.stream(repeatVariables).collect(Collectors.toMap(ReportRepeatVariable::getName, Function.identity()))); + } + return repeatVariableByName; } @SuppressWarnings("unchecked") public <V> ReportRepeatVariable<V> getRepeatVariable(String name) { - return (ReportRepeatVariable<V>) repeatVariableByName.get(name); + return (ReportRepeatVariable<V>) getRepeatVariableByName().get(name); + } + + @Override + public String toString() { + return definition().toString(); } /** @@ -246,12 +254,13 @@ public final class Report implements Serializable, JsonAware { * @param dependencyVariableName the dependency variable name that has changed */ public void unloadVariablesIfNecessary(String dependencyVariableName) { + Map<String, Set<String>> variableDependencyNamesMap = getVariableDependencies(); for (ReportVariable<?> variable : variables) { if (!variable.isValuesLoaded()) { // this variable is not loaded (so can not unload it) continue; } - Set<String> variableDependencyNames = getVariableDependencies().get(variable.getName()); + Set<String> variableDependencyNames = variableDependencyNamesMap.get(variable.getName()); if (variableDependencyNames == null) { // this variable has no dependency continue; @@ -262,4 +271,5 @@ public final class Report implements Serializable, JsonAware { } } } + } ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/ReportRepeatVariable.java ===================================== @@ -44,22 +44,16 @@ import java.util.stream.Collectors; * @author Tony Chemit - dev@tchemit.fr * @since 9.0.23 */ -public final class ReportRepeatVariable<V> extends ReportVariableSupport<V> { +public final class ReportRepeatVariable<V> extends ReportVariableSupport<V, ReportRepeatVariableDefinition<V>> { private static final long serialVersionUID = 1L; - private final ReportRepeatVariableDefinition<V> definition; public ReportRepeatVariable(ReportRepeatVariableDefinition<V> definition) { - this.definition = definition; - } - - @Override - public ReportRepeatVariableDefinition<V> getDefinition() { - return definition; + super(definition); } public boolean isAddNullValue() { - return getDefinition().isAddNullValue(); + return definition().isAddNullValue(); } @Override @@ -72,7 +66,7 @@ public final class ReportRepeatVariable<V> extends ReportVariableSupport<V> { public List<String> computeIndexList() { //FIXME This is already done by setValues method? Why using a "null" instead of null value? - Set<V> tmp = new LinkedHashSet<>(values); + Set<V> tmp = new LinkedHashSet<>(getValues()); boolean useNullValue = tmp.remove(null); List<String> result = tmp.stream().map(s -> s instanceof ToolkitId ? ((ToolkitId) s).getId() : String.valueOf(s)).collect(Collectors.toList()); 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; * @author Tony Chemit - dev@tchemit.fr * @since 1.7 */ -public final class ReportVariable<V> extends ReportVariableSupport<V> { +public final class ReportVariable<V> extends ReportVariableSupport<V, ReportVariableDefinition<V>> { public final static String PROPERTY_SELECTED_VALUE = "selectedValue"; private static final long serialVersionUID = 1L; - private final ReportVariableDefinition<V> definition; /** * Selected value for this variable, that will be used to execute report. */ private V selectedValue; public ReportVariable(ReportVariableDefinition<V> definition) { - this.definition = definition; - } - - @Override - public ReportVariableDefinition<V> getDefinition() { - return definition; + super(definition); } public V getSelectedValue() { @@ -64,7 +58,7 @@ public final class ReportVariable<V> extends ReportVariableSupport<V> { } public boolean isValuesLoadedAndSelectedValueFilled() { - return isValuesLoaded() && getSelectedValue() != null; + return isValuesLoaded() && isSelectedValueFilled(); } @Override ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/ReportVariableSupport.java ===================================== @@ -22,7 +22,7 @@ package fr.ird.observe.report; * #L% */ -import fr.ird.observe.report.definition.ReportVariableSupportDefinition; +import fr.ird.observe.report.definition.ReportVariableDefinitionSupport; import io.ultreia.java4all.util.json.JsonAware; import java.io.Serializable; @@ -39,27 +39,38 @@ import java.util.Set; * @see ReportRepeatVariable * @since 9.0.22 */ -public abstract class ReportVariableSupport<V> implements Serializable, JsonAware { +public abstract class ReportVariableSupport<V, D extends ReportVariableDefinitionSupport<V>> implements Serializable, JsonAware { + public final static String PROPERTY_DEFINITION = "definition"; public final static String PROPERTY_VALUES = "values"; /** - * Found values to this variable. + * Definition of this variable. */ - protected Set<V> values; + private final D definition; + /** + * Values loaded for this variable. + */ + private Set<V> values; - public abstract ReportVariableSupportDefinition<V> getDefinition(); + protected ReportVariableSupport(D definition) { + this.definition = definition; + } + + public final D definition() { + return definition; + } public final String getName() { - return getDefinition().getName(); + return definition().getName(); } public final Class<V> getType() { - return getDefinition().getType(); + return definition().getType(); } public final String getRequest() { - return getDefinition().getRequest(); + return definition().getRequest(); } public final Set<V> getValues() { @@ -82,12 +93,12 @@ public abstract class ReportVariableSupport<V> implements Serializable, JsonAwar public final boolean equals(Object o) { if (this == o) return true; if (o == null || !getClass().equals(o.getClass())) return false; - ReportVariableSupport<?> that = (ReportVariableSupport<?>) o; - return Objects.equals(getDefinition(), that.getDefinition()); + ReportVariableSupport<?, ?> that = (ReportVariableSupport<?, ?>) o; + return Objects.equals(definition(), that.definition()); } @Override public final int hashCode() { - return Objects.hash(getDefinition()); + return Objects.hash(definition()); } } ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/definition/DefaultReportDefinitionsBuilder.java ===================================== @@ -139,7 +139,7 @@ public class DefaultReportDefinitionsBuilder implements ReportDefinitionsBuilder String[] rowHeaders = loadHeaders(reportName, REPORT_ROWS, reportProperties); String[] columnHeaders = loadHeaders(reportName, REPORT_COLUMNS, reportProperties); List<ReportVariableDefinition<?>> variables = getVariables(reportName, reportProperties); - Set<String> variablesNames = variables.stream().map(ReportVariableSupportDefinition::getName).collect(Collectors.toSet()); + Set<String> variablesNames = variables.stream().map(ReportVariableDefinition::getName).collect(Collectors.toSet()); List<ReportRepeatVariableDefinition<?>> repeatVariables = getRepeatVariables(reportName, reportProperties, variablesNames); ReportRequestDefinition[] requests = getRequests(reportName, reportProperties); 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 { /** * Cache of dependencies on variables (key is variable name, value is the required variable names to be able to populate the variable). */ - private final transient Map<String, Set<String>> variableDependencies; + private transient Map<String, Set<String>> variableDependencies; public ReportDefinition(String modelType, String id, @@ -116,8 +116,6 @@ public final class ReportDefinition implements Serializable, JsonAware { this.operations = operations; this.variables = variables; this.repeatVariables = repeatVariables; - Map<String, ReportVariableDefinition<?>> variableByName = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariableDefinition::getName, Function.identity()))); - this.variableDependencies = computeVariableDependencies(variableByName); } public String getModelType() { @@ -149,6 +147,9 @@ public final class ReportDefinition implements Serializable, JsonAware { } public Map<String, Set<String>> getVariableDependencies() { + if (variableDependencies == null) { + this.variableDependencies = computeVariableDependencies(); + } return variableDependencies; } @@ -181,8 +182,8 @@ public final class ReportDefinition implements Serializable, JsonAware { return t(name); } - static Map<String, Set<String>> computeVariableDependencies(Map<String, ReportVariableDefinition<?>> variableByNames) { - + private Map<String, Set<String>> computeVariableDependencies() { + Map<String, ReportVariableDefinition<?>> variableByNames = Collections.unmodifiableMap(Arrays.stream(variables).collect(Collectors.toMap(ReportVariableDefinition::getName, Function.identity()))); Set<String> variableNames = variableByNames.keySet(); Map<String, Set<String>> variableDependencies = new TreeMap<>(); 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 { * Name of the operation, this is the fully qualified name of the ReportOperationConsumer. */ private final String name; + /** + * Optional parameters of this operation. + */ private final String parameters; 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; * @author Tony Chemit - dev@tchemit.fr * @since 9.0.23 */ -public final class ReportRepeatVariableDefinition<V> extends ReportVariableSupportDefinition<V> { - - public final static String PROPERTY_ADD_NULL_VALUE = "addNullValue"; +public final class ReportRepeatVariableDefinition<V> extends ReportVariableDefinitionSupport<V> { private static final long serialVersionUID = 1L; ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableDefinition.java ===================================== @@ -33,7 +33,7 @@ import fr.ird.observe.report.ReportVariable; * @author Tony Chemit - dev@tchemit.fr * @since 2.0.23 */ -public final class ReportVariableDefinition<V> extends ReportVariableSupportDefinition<V> { +public final class ReportVariableDefinition<V> extends ReportVariableDefinitionSupport<V> { public ReportVariableDefinition(String name, Class<V> type, String request, String comment) { super(name, type, request, comment); ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableSupportDefinition.java → toolkit/api-report/src/main/java/fr/ird/observe/report/definition/ReportVariableDefinitionSupport.java ===================================== @@ -37,13 +37,7 @@ import java.util.Objects; * @author Tony Chemit - dev@tchemit.fr * @since 2.0.23 */ -public abstract class ReportVariableSupportDefinition<V> implements Serializable, JsonAware { - - public final static String PROPERTY_NAME = "name"; - public final static String PROPERTY_TYPE = "type"; - public final static String PROPERTY_REQUEST = "request"; - public final static String PROPERTY_COMMENT = "comment"; - +public abstract class ReportVariableDefinitionSupport<V> implements Serializable, JsonAware { /** * Name of the variable. */ @@ -61,7 +55,7 @@ public abstract class ReportVariableSupportDefinition<V> implements Serializable */ private final String comment; - public ReportVariableSupportDefinition(String name, Class<V> type, String request, String comment) { + public ReportVariableDefinitionSupport(String name, Class<V> type, String request, String comment) { this.name = Objects.requireNonNull(name); this.type = Objects.requireNonNull(type); this.request = Objects.requireNonNull(request); @@ -88,13 +82,13 @@ public abstract class ReportVariableSupportDefinition<V> implements Serializable return comment != null; } - public abstract ReportVariableSupport<?> toVariable(); + public abstract ReportVariableSupport<?, ?> toVariable(); @Override public final boolean equals(Object o) { if (this == o) return true; if (o == null || !getClass().equals(o.getClass())) return false; - ReportVariableSupportDefinition<?> that = (ReportVariableSupportDefinition<?>) o; + ReportVariableDefinitionSupport<?> that = (ReportVariableDefinitionSupport<?>) o; return Objects.equals(name, that.name); } ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportRepeatVariableAdapter.java ===================================== @@ -24,10 +24,8 @@ package fr.ird.observe.report.json; import com.google.auto.service.AutoService; import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; -import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; +import com.google.gson.reflect.TypeToken; import fr.ird.observe.report.ReportRepeatVariable; import fr.ird.observe.report.definition.ReportRepeatVariableDefinition; import io.ultreia.java4all.util.json.JsonAdapter; @@ -41,7 +39,7 @@ import java.lang.reflect.Type; * @since 9.0.22 */ @AutoService(JsonAdapter.class) -public class ReportRepeatVariableAdapter extends ReportVariableSupportAdapter implements JsonDeserializer<ReportRepeatVariable<?>> { +public class ReportRepeatVariableAdapter<V> extends ReportVariableSupportAdapter<V, ReportRepeatVariableDefinition<V>, ReportRepeatVariable<V>> { @Override public Class<?> type() { @@ -49,22 +47,15 @@ public class ReportRepeatVariableAdapter extends ReportVariableSupportAdapter im } @Override - public ReportRepeatVariable<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonObject = json.getAsJsonObject(); - - String name = getVariableName(context, jsonObject); - Class<?> type = getVariableType(context, jsonObject); - String request = getVariableRequest(context, jsonObject); - String comment = getVariableComment(context, jsonObject); - boolean addNullValue = getAddNullValue(context, jsonObject); - ReportRepeatVariableDefinition<?> definition = new ReportRepeatVariableDefinition<>(name, type, request, comment, addNullValue); - ReportRepeatVariable<?> result = new ReportRepeatVariable<>(definition); - - loadVariableValues(context, jsonObject, result); - return result; + protected Type definitionType() { + return new TypeToken<ReportRepeatVariableDefinition<V>>() { + }.getType(); } - protected boolean getAddNullValue(JsonDeserializationContext context, JsonObject jsonObject) { - return context.deserialize(jsonObject.get(ReportRepeatVariableDefinition.PROPERTY_ADD_NULL_VALUE), boolean.class); + @Override + protected ReportRepeatVariable<V> deserialize(JsonDeserializationContext context, JsonObject jsonObject, ReportRepeatVariableDefinition<V> definition) { + ReportRepeatVariable<V> result = new ReportRepeatVariable<>(definition); + deserializeValues(context, jsonObject, result); + return result; } } ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportVariableAdapter.java ===================================== @@ -25,10 +25,9 @@ package fr.ird.observe.report.json; import com.google.auto.service.AutoService; import com.google.gson.JsonDeserializationContext; -import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; -import com.google.gson.JsonParseException; +import com.google.gson.reflect.TypeToken; import fr.ird.observe.report.ReportVariable; import fr.ird.observe.report.definition.ReportVariableDefinition; import io.ultreia.java4all.util.json.JsonAdapter; @@ -39,7 +38,7 @@ import java.lang.reflect.Type; * @author Tony Chemit - dev@tchemit.fr */ @AutoService(JsonAdapter.class) -public class ReportVariableAdapter extends ReportVariableSupportAdapter implements JsonDeserializer<ReportVariable<?>> { +public class ReportVariableAdapter<V> extends ReportVariableSupportAdapter<V, ReportVariableDefinition<V>, ReportVariable<V>> { @Override public Class<?> type() { @@ -47,27 +46,22 @@ public class ReportVariableAdapter extends ReportVariableSupportAdapter implemen } @Override - public ReportVariable<?> deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { - JsonObject jsonObject = json.getAsJsonObject(); - - String name = getVariableName(context, jsonObject); - Class<?> type = getVariableType(context, jsonObject); - String request = getVariableRequest(context, jsonObject); - String comment = getVariableComment(context, jsonObject); - - ReportVariableDefinition<?> definition = new ReportVariableDefinition<>(name, type, request, comment); - ReportVariable<?> result = new ReportVariable<>(definition); + protected Type definitionType() { + return new TypeToken<ReportVariableDefinition<V>>() { + }.getType(); + } - loadVariableValues(context, jsonObject, result); - loadSelectedValue(context, jsonObject, result); + @Override + protected ReportVariable<V> deserialize(JsonDeserializationContext context, JsonObject jsonObject, ReportVariableDefinition<V> definition) { + ReportVariable<V> result = new ReportVariable<>(definition); + deserializeValues(context, jsonObject, result); + deserializeSelectedValue(context, jsonObject, result); return result; } - protected <V> void loadSelectedValue(JsonDeserializationContext context, JsonObject jsonObject, ReportVariable<V> variable) { + protected void deserializeSelectedValue(JsonDeserializationContext context, JsonObject jsonObject, ReportVariable<V> variable) { JsonElement json = jsonObject.get(ReportVariable.PROPERTY_SELECTED_VALUE); - if (json != null) { - V selectedValue = context.deserialize(json, variable.getType()); - variable.setSelectedValue(selectedValue); - } + V selectedValue = deserializeValue(context, variable.getType(), json); + variable.setSelectedValue(selectedValue); } } ===================================== toolkit/api-report/src/main/java/fr/ird/observe/report/json/ReportVariableSupportAdapter.java ===================================== @@ -22,13 +22,17 @@ package fr.ird.observe.report.json; * #L% */ +import com.google.gson.JsonArray; import com.google.gson.JsonDeserializationContext; +import com.google.gson.JsonDeserializer; import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.google.gson.JsonParseException; import fr.ird.observe.report.ReportVariableSupport; -import fr.ird.observe.report.definition.ReportVariableSupportDefinition; +import fr.ird.observe.report.definition.ReportVariableDefinitionSupport; import io.ultreia.java4all.util.json.JsonAdapter; +import java.lang.reflect.Type; import java.util.HashSet; import java.util.Set; @@ -40,34 +44,38 @@ import java.util.Set; * @author Tony Chemit - dev@tchemit.fr * @since 9.0.22 */ -public abstract class ReportVariableSupportAdapter implements JsonAdapter { +public abstract class ReportVariableSupportAdapter<V, D extends ReportVariableDefinitionSupport<V>, R extends ReportVariableSupport<V, D>> implements JsonAdapter, JsonDeserializer<R> { - protected String getVariableName(JsonDeserializationContext context, JsonObject jsonObject) { - return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_NAME), String.class); - } + protected abstract Type definitionType(); - protected Class<?> getVariableType(JsonDeserializationContext context, JsonObject jsonObject) { - return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_TYPE), Class.class); - } + protected abstract R deserialize(JsonDeserializationContext context, JsonObject jsonObject, D definition); - protected String getVariableRequest(JsonDeserializationContext context, JsonObject jsonObject) { - return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_REQUEST), String.class); + @Override + public final R deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + JsonObject jsonObject = json.getAsJsonObject(); + D definition = deserializeDefinition(context, jsonObject); + return deserialize(context, jsonObject, definition); } - protected String getVariableComment(JsonDeserializationContext context, JsonObject jsonObject) { - return context.deserialize(jsonObject.get(ReportVariableSupportDefinition.PROPERTY_COMMENT), String.class); + protected D deserializeDefinition(JsonDeserializationContext context, JsonObject jsonObject) { + return context.deserialize(jsonObject.get(ReportVariableSupport.PROPERTY_DEFINITION), definitionType()); } - protected <V> void loadVariableValues(JsonDeserializationContext context, JsonObject jsonObject, ReportVariableSupport<V> variable) { + protected void deserializeValues(JsonDeserializationContext context, JsonObject jsonObject, R variable) { JsonElement valuesJson = jsonObject.get(ReportVariableSupport.PROPERTY_VALUES); if (valuesJson != null) { - Set<V> values = new HashSet<>(); Class<V> type = variable.getType(); - for (JsonElement valueJson : valuesJson.getAsJsonArray()) { - V value = context.deserialize(valueJson, type); + JsonArray jsonArray = valuesJson.getAsJsonArray(); + Set<V> values = new HashSet<>(jsonArray.size()); + for (JsonElement valueJson : jsonArray) { + V value = deserializeValue(context, type, valueJson); values.add(value); } variable.setValues(values); } } + + protected V deserializeValue(JsonDeserializationContext context, Class<V> variableType, JsonElement valueJson) { + return valueJson == null ? null : context.deserialize(valueJson, variableType); + } } View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/f7fe96e96019244798bc1f603... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/f7fe96e96019244798bc1f603... You're receiving this email because of your account on gitlab.com.