Vous êtes sur la page 1sur 25

Master : MBISD

PFE

Parser
and
Code JAVA
The code consists of four classes:

JavaGenerator, KafkaPSM, FlinkC, and Main.


JavaGenerator
1. generateJavaClasses :

La méthode generateJavaClasses lit le fichier JSON spécifié par le paramètre jsonFilePath, analyse son contenu dans un JSONArray et traite chaque objet du
tableau.

• Une boucle for itère sur chaque élément du JSONArray.


• À chaque itération, un objet JSON individuel est extrait du JSONArray à l'aide de la méthode getJSONObject()
• Le code récupère la valeur de la propriété "class_streotype" de l'objet JSON
• Si la valeur de "class_streotype" est égale à la chaîne de caractères "kafkatopic", le code extrait la valeur de la propriété "class_name" de l'objet JSON et la
stocke dans la variable topic
JavaGenerator
• Une deuxième boucle for est utilisée pour itérer sur chaque élément du JSONArray à nouveau.
• Le code récupère les valeurs des propriétés "class_name", "class_streotype", "class_attributes" et "class_operations" de l'objet JSON.
• La méthode generateJavaClass est appelée en passant les valeurs extraites, ainsi que d'autres paramètres tels que finalTopic et
jsonFilePath.
• La méthode generateJavaClass est appelée dans un nouveau thread pour chaque objet JSON, en utilisant l'interface Runnable
• Les threads sont démarrés en appelant la méthode start() sur chaque objet Thread.
JavaGenerator
2. generateJavaClass:
• La méthode commence par initialiser un StringBuilder appelé sb pour construire le code généré
• Le code vérifie si la valeur de class_streotype est égale à "kafkaproducerstateless". Si c'est le cas, il entre dans une boucle
while (true) qui génère des attributs aléatoires en fonction des objets JSON contenus dans fieldsObject.
JavaGenerator
• Les valeurs sont ensuite converties en JSON à l'aide de la bibliothèque Gson et envoyées à un topic Kafka
en utilisant la classe KafkaPSM
• Ensuite, la méthode itère sur operationsObject et recherche l'opération avec le nom "generation". Une
valeur de délai est extraite des paramètres de cette opération, et la méthode se met en pause pendant ce
délai à l'aide de Thread.sleep(). Ensuite, la boucle while (true) continue avec la génération d'autres
attributs.
JavaGenerator
• Si la valeur de class_streotype est égale à "kafkaconsumer", le code génère du code Java pour créer une table temporaire
en utilisant le contenu de fieldsObject
• Les attributs sont extraits de chaque objet JSON dans fieldsObject et ajoutés à la chaîne sb en utilisant une syntaxe
spécifique. Certains types d'attributs sont modifiés pour correspondre aux types de données acceptés par une base de
données, par exemple, "Point" est converti en "ROW(xVARCHAR,y Varchar)".
JavaGenerator

La chaîne sb est ensuite complétée avec d'autres informations nécessaires pour la connexion à Kafka et la lecture des données,
telles que le nom du topic et les propriétés de connexion.
JavaGenerator
• Un autre StringBuilder appelé qr est initialisé pour construire une requête SQL.
• Le code lit à nouveau le contenu du fichier JSON dans jsonFilePath et extrait certaines valeurs pour générer la requête SQL.
• Il recherche un objet JSON avec le class_streotype "flinkcontinuousquery" et extrait les attributs et opérations associés.
• La requête SQL est construite en ajoutant les attributs nécessaires à la clause SELECT, puis le nom de la table, les clauses GROUP
BY et enfin, en ajoutant la clause TUMBLE pour définir la fenêtre temporelle.

vérifier si l'élément est un outputattribute ou non


JavaGenerator
Vérifier si le dernier élément existe

Vérifiez que outputattribute a une agrégation


JavaGenerator

vérifier si l'élément est un groupingattribute ou non


JavaGenerator
• on extrait les valeurs des clés "argument_value" et les stocke dans les variables v1 et v2, respectivement.
• Ensuite, le code utilise ces valeurs extraites pour construire une partie de la requête SQL.

• Enfin, le code utilise une classe FlinkC pour définir le flux de travail Flink en passant la requête CREATE TABLE et la
requête SELECT

FlinkC.defineWorkflow(sb.toString(), qr.toString());
KafkaPSM
• la classe KafkaPSM qui contient une méthode statique KafkaP pour envoyer des messages à un topic Kafka spécifié.

• La méthode KafkaP prend deux paramètres : TOPIC_NAME qui représente le nom du topic Kafka auquel envoyer le
message, et message qui représente le contenu du message à envoyer.

• La méthode configure les propriétés du producteur Kafka, telles que les adresses du serveur Bootstrap, les sérialiseurs de clé et
de valeur, et d'autres paramètres de configuration facultatifs.

• Ensuite, un objet KafkaProducer est créé en utilisant les propriétés configurées


• .
• Un ProducerRecord est créé avec le nom du topic et le message à envoyer.

• Enfin, le message est envoyé au topic à l'aide de la méthode send du producer


KafkaPSM
FlinkC
• la classe FlinkC qui contient des méthodes pour définir et exécuter un workflow Flink avec des requêtes SQL.
• La méthode defineWorkflow est une méthode statique qui prend en paramètres une chaîne de caractères tab représentant la
définition de la table et une chaîne de caractères qr représentant la requête SQL à exécuter. Cette méthode appelle la
méthode Main et affiche les résultats.
• La méthode Main crée un environnement d'exécution des flux et des paramètres d'environnement spécifiant le mode de
streaming.
• Ensuite, un environnement de table pour les flux est créé à l'aide de l'environnement d'exécution des flux et des paramètres
d'environnement.
• La méthode executeSql de l'environnement de table est appelée pour exécuter la définition de la table spécifiée par tab.
• La requête SQL spécifiée par qr est formatée et passée à la méthode sqlQuery de l'environnement de table pour créer un
objet Table.
• Enfin, la méthode execute est appelée sur l'objet Table pour exécuter la requête SQL et retourner le résultat sous la forme
d'un objet TableResult.
FlinkC
Main
• la classe Main qui contient une méthode main permettant de générer des classes Java à partir d'un fichier JSON
• La méthode main est la méthode principale qui est exécutée lorsque le programme démarre
• Dans cette méthode, une variable jsonFilePath est définie avec le chemin du fichier JSON à utiliser pour la génération des
classes Java
• La méthode generateJavaClasses est appelée, en passant le chemin du fichier JSON en argument, pour générer les classes Java
correspondantes.
PSM model
Parser:class
• Le Parser a besoin d'un fichier XMI qui stocke toutes les informations sur la notation du diagramme de classes UML
• On utilise la bibliothèque BeautifulSoup pour extraire des informations à partir de données au format XMI.
• La liste model est initialisée pour stocker les informations extraites.
• La boucle for class_ in data.findAll('packagedelement',{"xmi:type":"uml:Class"}) itère sur tous les éléments de type
"uml:Class" trouvés dans la variable data.
• À l'intérieur de la boucle, un dictionnaire class_dict est créé pour stocker les informations de chaque classe.
• Le nom de la classe est extrait de l'attribut 'name' de l'élément courant et est ajouté au dictionnaire class_dict avec la clé
'class_name'.
• La présence de base_class pour la classe courante est vérifiée à l'aide de data.find(base_class = class_['xmi:id']). Si base_class est
trouvée, son nom est extrait et ajouté au dictionnaire class_dict avec la clé 'class_stereotype'. Sinon, une liste vide est ajoutée.
• Les attributs de la classe sont extraits dans une liste de dictionnaires. Chaque dictionnaire contient les clés 'attribute_name',
'attribute_type', 'stereotype' et 'source'.
• Les opérations de la classe sont extraites de manière similaire. Chaque opération est représentée par un dictionnaire contenant les clés
'operation_name', 'stereotype' et 'parameters'.
• Le dictionnaire class_dict est ajouté à la liste model.
• Une fois la boucle terminée, la liste model contient les informations extraites pour chaque classe.
Parser:class
Résultat
Parser:association
• on extrait des informations sur les associations à partir de données au format XMI représentant un modèle PSM
• Une liste vide appelée modell est créée pour stocker les informations extraites.
• Une boucle for itère sur tous les éléments <packagedelement> du document XML ayant l'attribut xmi:type égal à
"uml:Association".
• À l'intérieur de la boucle, un dictionnaire vide class_dictt est créé pour représenter une association.
• L'attribut association est représentée par un dictionnaire contenant les clés value‘ et ‘class_name’
• L'attribut stereo contenant une liste de dictionnaires représentant les stéréotypes de l'association.
• Le dictionnaire class_dictt représentant l'association est ajouté à la liste modell.
Parser:association
Résultat
THANKS

Vous aimerez peut-être aussi