La generation automatique des fichiers d'un schema est séparé en plusieurs etapes:
- csv_parser, script parser_and_mv: le parseur csv utilise les onglets qui ne sont pas préfixés par '#' des fichiers excel contenus dans le repertoire "/models" pour générer les fichiers a parir des données contenus: un schema json, un docx pour visualiser les changements et une diagramme uml ainsi que les schemas asyncApi/openApi.
- csv_parser, script output_schemas_yaml: de la meme manière, le parseur générer un fichier yaml qui contient des informations nécessaires pour les etapes suivants de la generation automatique.
- automatic-schema-generator.sh: génére les fichiers suivants en utilisants les templates Go presents dans /templates et le fichier schemas.yaml génére a l'étape précédente:
- ContentMessage.java
- ContentMessageDeserializer.java
- EDXL-DE-full-schema.json
- RC-XML-ContentType.xsd
- Les fichiers utilisés pour la génération automatique des classes java
- csv_parser, json_schema2xsd: génére les schemas xsd à partir des schemas json générés.
- openapi-generator: génére les classes java a partir des fichiers config séparés en deux dossier: generator/config/generated qui contient les fichiers de config générés lors de l'etape 3, et generatr/config/manual qui contient les fichiers gérés manuellement.
- Modifier le fichier .xlsx existant ou creer un nouveau fichier pour ajouter une nouvelle feuille avec le nom du schema à ajouter.
- Construire le tableau représentant le schema en suivant les règles décrites sur la feuille "Mode d'emploi" du fichier.
- Construire le tableau de 'configuration' de l'onglet au dessus du tableau principal, en suivant la structure suivante (exemple du schema RC-EDA):
|schema|perimeter|rootElement|package|customExtendPackage|customExtendClass|automaticGeneration|subschema|header|xmlns|
|RC-EDA|15-18|createCase|cisu|||Y|N|Y|cisu:3.0|
Les colonnes correspondant aux informations suivantes:
- schema: Nom du schema (RC-EDA, RS-EDA, RS-ER, RS-ERROR)
- perimetre: L'en-tete de la colonne perimetre correspondante (15-18, 15-15, 15-SMUR, 15-15)
- rootElement: Element racine du schema, utilisé additionnellement pour la génération des classes java (createCase, createCaseHealth, resourcesEngagement, error)
- package: Package java des classes générées. Préfixé avec "com.hubsante.model." (cisu, health, resources.info, report)
- customExtendPackage: Permet de spécifier le package de la classe étendue par la classe du wrapper du schema; "rcde" par default.
- customExtendClass: Similairement, permet de spécifier la classe étendue, "DistributionElement" par defaut.
- automaticGeneration: Indique si on souhaite générer les fichiers avec automatic-schema-generator pour le schema.
- subschema: Indique si le schema est un "sous-schema" d'un schema existant - c'est a dire si elle doit générer ou pas les classes enfants (nécessaire pour ne pas écraser les classes générés pour la classe parent)
- header: Indique si une en-tête RC-DE doit etre presente dans les messages correspondants au schema.
- xmlns: Indique le namespace xml de l'element racine du schema.
- NB.: A enlever dés que le mechanisme de détection des schemas dans le fichier mdd est mis à jour Dans la cellule A1 de la feuille, lister, utilisant l'espace comme separateur, les schemas à generer à partir de cette feuille en suivant le modèle suivant: [[Nom du schema]:[Périmètre]:[Object racine]]. A noter qui la valeur "Périmètre" doit correspondre au titre d'une des colonnes de perimetre definies dans la feuille.
Ex.: La valeur RC-EDA:15-18:createCase RS-EDA:15-15:createCaseHealth RS-EDA-MAJ:15-MAJ:createCaseHealthUpdate dans la cellule A1 de la feuille RC-EDA génére 3 schemas distincts.
- Mettre le fichier .xlsx, modifié ou créé, dans ./csv_parser/models/.
- Modifier le fichier ./csv_parser/json_schema2xsd/src/main/java/json_schema2xsd/App.java :
- Dans la liste des schemas (ligne 25) ajouter le nom du schema (le meme qu'à la cellule A1).
- Dans le switch expression (ligne 91) ajouter un switch case sur le nom du schema, positionnant la variable root à la valeur d'objet racine du schema (le meme qu'à la cellule A1).
- Modifier le fichier ./csv_parser/workflow.py : ajouter le nom de la feuille dans la liste 'sheets' s'il n y est pas présent.
Les instructions suivantes concernent seulement les schemas qui sont à maintenir manuellement, c'est à dire les fichiers contenus dans le répertoire generator/config/manual.
-
Dans le dossier ./generator/config , créer un dossier portant le même nom que la feuille.
-
Dans le cas de base, dans le dossier créé, créer trois fichiers de configuration:
- [Nom du schema].generator-config.json
- [Nom du schema].usecase.generator-config.json
- [Nom du schema].wrapper.generator-config.json
-
Dans le cas d'un sous-schema qui contient des objets similaires (avec des proprietes en moins par rapport au schema de base), créer juste deux fichiers de configuration:
- [Nom du schema].usecase.generator-config.json
- [Nom du schema].wrapper.generator-config.json Puis ajouter le [Nom du schema] dans l'expression "if ... fi" de l'etape "Generate Java classes" du fichier .github/workflows/generate-model.yaml
-
Le contenu des fichiers doit correspondre au modele suivant:
{
"inputSpec": "./input/[Nom du schema].openapi.yaml",
"outputDir": "classes/",
"generatorName": "java",
"templateDir": [Varie en fonction du fichier config]
"globalProperties": {
"models": [Varie en fonction du fichier config]
"apis": false,
"apiTests": false,
"apiDocs": false,
"modelDocs": false,
"modelTests": false
},
"additionalProperties": {
"library": "native",
"modelPackage": "com.hubsante.model.[Package désiré]",
"serializationLibrary": "jackson",
"openApiNullable": true,
"supportUrlQuery": false,
"enablePostProcessFile": true
}
}
Les propriétés "templateDir" et "models" vont varier selon le fichier:
- [Nom du schema].generator-config.json:
"templateDir": "templates/child-classes/",
"models": "",
- [Nom du schema].usecase.generator-config.json:
"templateDir": "templates/useCase/",
"models": "[Object racine]",
- [Nom du schema].wrapper.generator.config.json:
"templateDir": "templates/useCase/",
"models": "[Object racine]Wrapper",
4. Dans le cas d'ajout d'un schema en dehors de la pipeline de génération automatique, il est nécessaire de manuellement modifier les templates go, situés dans le répertoire automatic-schema-generator/templates.
-
Modifier la template ContentMessage.java.tmpl, en rajoutant la classe wrapper générée dans la liste des @JsonSubTypes.Type annotations (e.g. @JsonSubTypes.type([Titre du schema]Wrapper.class) ) et dans la liste des schemas de la sous-classe UseCaseHelper, ainsi qu'ajouter les packages et classes nécessaries dans la liste des imports.
-
D'une maniere similaire, modifier la tempalte ContentMessageDeserializer.java.tmpl
-
Modifier la template /EDXL-DE-full.schema.json,tmpl en ajoutant le nouveau schema dans l'element 'oneOf' de l'objet 'EmbeddedJsonContent'm typiquement:
"oneOf": [
...
{
"allOf": [
{
"properties": {
"message": {
"$ref": "RC-DE.schema.json"
}
}
},
{
"properties": {
"message": {
"properties": {
"[Objet racine]": {
"$ref": "[Nom du schema].schema.json"
}
},
"required": [
"[Objet racine]"
]
}
}
}
]
}
...
]
Si la présence de l'en-tete RC-DE n'est pas désirée, il est seulement nécessaire d'ajouter la partie "properties" contenant le nouveau schema.
- Modifier le xsd schema RC-XML-ContentType.xsd.tmpl en ajoutant les éléments suivants:
- Une propriété xmlns:[Objet racine (en flatcase)]="urn:emergency:cisu:3.0:[Objet racine]" dans l'élément
- Un import <xs:import namespace="urn:emergency:cisu:3.0:[Objet racine]" schemaLocation="[Nom du schema].xsd"/>
- Un element <xs:element ref="[Objet racine (en flatcase)]:[Objet racine]"/> a l'interieur de l'element xs:choice
5 Lancer la génération des fichiers, en créant une pull request depuis la branche feature en question et poussant les modifications, declenchant l'action github sur le repo distant.
Penser à ajouter des fichiers exemples et des cas passants/non-passants dans src/main/resources/sample, ainsi que mettre en place des tests unitaires vérifiant la validation et la sérialisation/désérialisation des classes
- Mettre a jour la map et le switch case dans /composables/messageUtils.js et /mixins/messageUtils.js dans le répo Santé