APIs de table pour SQL Server

Documents pareils
APIs de table pour SQL Server

Notes de cours : bases de données distribuées et repliquées

1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7

Qu est ce que Visual Guard. Authentification Vérifier l identité d un utilisateur

Visual Paradigm Contraintes inter-associations

Les Triggers SQL. Didier DONSEZ. Université de Valenciennes Institut des Sciences et Techniques de Valenciennes

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

PROJET 1 : BASE DE DONNÉES REPARTIES

Création et Gestion des tables

CQP ADMINISTRATEUR DE BASES DE DONNÉES (ABD)

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

PostgreSQL, le cœur d un système critique

SQL Historique

Votre premier projet Android

Bases Java - Eclipse / Netbeans

Gestion de stock pour un magasin

Documentation de conception

Data Tier Application avec SQL Server 2008 R2

TP Contraintes - Triggers

S T L - C P S - L e s p l u g i n s E c l i p s e. - Une Introduction , Frédéric Peschanski

et Groupe Eyrolles, 2006, ISBN :

Compte Rendu d intégration d application

PG208, Projet n 3 : Serveur HTTP évolué

Introduction à ORACLE WAREHOUSE BUILDER Cédric du Mouza

Mercredi 15 Janvier 2014

Créer un rapport pour Reporting Services

Programme «Analyste Programmeur» Diplôme d état : «Développeur Informatique» Homologué au niveau III (Bac+2) (JO N 176 du 1 août 2003) (34 semaines)

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

< Atelier 1 /> Démarrer une application web

Programme détaillé. Administrateur de Base de Données Oracle - SQLServer - MySQL. Objectifs de la formation. Les métiers

Windows Server 2008 R2

Construire des plug-ins pour SAS Management Console SAS 9.1

Générer du code à partir d une description de haut niveau

CQP Développeur Nouvelles Technologies (DNT)

Partie I : Créer la base de données. Année universitaire 2008/2009 Master 1 SIIO Projet Introduction au Décisionnel, Oracle

Développer des Applications Internet Riches (RIA) avec les API d ArcGIS Server. Sébastien Boutard Thomas David

Développement de base de données Microsoft SQL Server Durée : 5 jours Référence : DPSQL12. Contenu

Manuel d utilisation du Guichet électronique V2

Modélisation et Gestion des bases de données avec mysql workbench

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Table des matières PRESENTATION DU LANGAGE DS2 ET DE SES APPLICATIONS. Introduction

INF 1250 INTRODUCTION AUX BASES DE DONNÉES. Guide d étude

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Restaurer des données

Cursus Sage ERP X3 Outils & Développement. Le parcours pédagogique Sage ERP X3 Outils et Développement

D une part, elles ne peuvent faire table rase de la richesse contenue dans leur système d information.

Olivier Mondet

//////////////////////////////////////////////////////////////////// Administration bases de données

Tutorial sur SQL Server 2000

TUTORIEL Qualit Eval. Introduction :

Module Administration BD Chapitre 1 : Surcouche procédurale dans les SGBDS

Information utiles. webpage : Google+ : digiusto/

Microsoft OSQL OSQL ou l'outil de base pour gérer SQL Server

Procédure d'installation complète de Click&Decide sur un serveur

Les déclencheurs. Version 1.0. Grégory CASANOVA

Cahier Technique. «Développer une application intranet pour la gestion des stages des étudiants» Antonin AILLET. Remi DEVES

La réplication sous SQL Server 2005

BIRT (Business Intelligence and Reporting Tools)

1.2 Genèse. 1.3 Version de Designer utilisée

CREATION WEB DYNAMIQUE

PHP 4 PARTIE : BASE DE DONNEES

Installation et compilation de gnurbs sous Windows

WinTask x64 Le Planificateur de tâches sous Windows 7 64 bits, Windows 8/ bits, Windows 2008 R2 et Windows bits

Chapitre 10. Architectures des systèmes de gestion de bases de données

La base de données XML exist. A. Belaïd

TP1 : Initiation à Java et Eclipse

CATALOGUE FORMATIONS DOMAINE Bases de données

Bases de données avancées Introduction

Armand PY-PATINEC 2010

Encryptions, compression et partitionnement des données

Présentation du PL/SQL

Historisation des données

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - pamarcelot@iktek.com

Mysql. Les requêtes préparées Prepared statements

Rapport de Stage Christopher Chedeau 2 au 26 Juin 2009

SQL Server 2012 Implémentation d'une solution de Business Intelligence (Sql Server, Analysis Services...)

wxwidgets dans un environnement Microsoft Windows

Bases de données et sites WEB

Gestion de base de données

Manipulation 4 : Application de «Change».

Plan du cours. Historique du langage Nouveautés de Java 7

LA GOUVERNANCE, OU COMMENT RAPPROCHER LES ÉQUIPES DE DÉVELOPPEMENT ET D INFRASTRUCTURE

Java et les bases de données: JDBC: Java DataBase Connectivity SQLJ: Embedded SQL in Java. Michel Bonjour

Le langage SQL Rappels

FORMATION TALEND. Page 1 sur 9

SQL Server Administration d'une base de données transactionnelle avec SQL Server Management Studio (édition enrichie de vidéos)

27/11/12 Nature. SDK Python et Java pour le développement de services ACCORD Module(s)

RÉALISATION D UN SITE DE RENCONTRE

Eclipse atelier Java

Projet de développement

SGBDR. Systèmes de Gestion de Bases de Données (Relationnelles)

ESPACE COLLABORATIF SHAREPOINT

Projet de développement. Introduction à Eclipse. Application à votre projet. Philippe Collet. Organisation. Cours 1 : principes généraux - svn

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Licence de MIDO - 3ème année Spécialités Informatique et Mathématiques Appliquées

Transcription:

2013 D - Pratique APIs de table pour SQL Server Établissement: HEG Arc Haute école Arc Gestion Réalisé par: M. Informaticien de gestion 2009-2013 S adresse à: M.Fabrice Camus Date de début et de fin du travail de Bachelor 08.04.2013 05.07. 2013 Dernière modification le: 03.07.2013 Date de création: 26.04.2012 Version du document: 1.0 Type de réalisation: Intra-muros

Sommaire 1 Introduction... 4 2 Avant-Projet... 5 2.1 Planification... 5 2.2 Planifié... 5 2.3 Réalisé... 6 2.4 Administration du projet... 7 2.5 Analyse des risques... 8 2.6 Technologies utilisées...10 3 Convention de nommage...11 4 Valeurs taguées utilisées...12 5 Fonctionnement du plugin...15 5.1 Principe de base...15 5.2 Déclenchement du plugin...16 5.2.1 Prérequis...16 5.2.2 Utilisation...16 5.2.3 Sélection des tables...17 5.2.4 Schéma de fonctionnement...18 6 L utilité concrète du plugin...19 6.1 Avant exécution du plugin...19 6.2 Résultat de l exécution...20 7 Développement...25 7.1 Génération des scripts d APIs de tables...25 7.2 Génération des logs...25 7.3 Exécution des scripts...26 7.3.1 Tables de journalisation...26 7.3.2 Tables de journalisation des exceptions...26 7.3.3 Colonnes d audit...26 7.3.4 Triggers...27 7.3.5 Procédures stockées...27 7.5 Abstraction des scripts...28 7.5.1 Génération des procédures...28 7.5.2 Génération du code SQL DDL...28 7.5.3 Génération des triggers...29 7.6 Paramétrage du plugin...30 Page 2 sur 42

7.6.1 Plugin.properties...30 7.6.2 database.properties...32 7.7 Script de déploiement...33 7.8 Tests...34 7.8.1 Tests unitaires...34 7.8.2 Tests par l utilisation...34 7.9 Gestion des erreurs...35 7.9.1 Implémentation de la gestion des messages et logs...35 7.9.2 Affichage de messages à l utilisateur...35 7.9.3 Exceptions...36 8 Ajout d un nouveau SGBDR...37 9 Amélioration...40 9.1 Récupérer une connexion de Visual Paradigm...40 9.2 Affichage de popup...41 9.3 Gérer les modifications incrémentales des APIs de table...41 9.4 Revoir la séparation des fichiers de propriétés...41 10 Conclusion...42 Page 3 sur 42

1 Introduction Ce document va présenter la démarche entreprise afin de parvenir à l aboutissement du travail. Les chapitres sont ordonnés de façon à ce que le premier corresponde à la première démarche entreprise et le dernier à la dernière démarche. Le premier chapitre présente la planification mise en place afin de réaliser ce projet ainsi qu une analyse des risques et une présentation des différentes technologies utilisées. Le deuxième chapitre présente les différentes conventions de nommage mises en place. Le suivant expose et explique les différentes valeurs taguées utilisées. Le chapitre 5 présente le fonctionnement du plugin dans son ensemble. Le sixième chapitre démontre l utilité de celuici. Le chapitre 7 présente quelques éléments concernant le développement propre du plugin. Le chapitre 8 explique la procédure d ajout d un nouveau SGBDR au sein du plugin. Le chapitre suivant présente les différentes améliorations possibles. Le dernier chapitre conclut ce projet. Page 4 sur 42

12 avril 19 avril 26 avril 3 mai 8 mai 17 mai 24 mai 31 mai 7 juin 21 juin 28 juin 5 juillet 2 Avant-Projet 2.1 Planification Ci-dessous, une présentation de l organisation des 12 semaines à dispositions afin de réaliser ce dit travail. Le but originel de cette planification était d organiser le travail plutôt que de déterminer que la tâche A doit être terminée en semaine 2. J ai pris la décision de ne pas utiliser de méthode de gestion de projet, à la mode, tel Agile car mon projet ne se prête que très peu à ce type d organisation. Effectivement, il m a été demandé de réaliser chaque tâche de façon complète et non incrémentale comme la méthode Agile le préconise. De plus, je suis seul sur ce projet. Je ne vois donc que très peu l intérêt d utiliser une telle méthode. Tout du moins, une organisation se basant sur des itérations a été utilisée. À la fin de chacune de celle-ci, il a été décidé, conjointement avec mon directeur de travail, de livrer le plugin. 2.2 Planifié Tâche Rédaction de la demande de ratification Analyse du plugin Itération 1 Itération 2 Itération 3 Itération 4 Rédaction des rapports Test global Page 5 sur 42

12 avril 19 avril 26 avril 3 mai 8 mai 17 mai 24 mai 31 mai 7 juin 21 juin 28 juin 5 juillet 2.3 Réalisé Tâche Rédaction de la demande de ratification Analyse du plugin Itération 1 1 1 1 Itération 2 Itération 3 1 Itération 4 Rédaction des rapports Test global 1. Retard dû à l analyse de l architecture à mettre en place. Effectivement, initialement, il était prévu que je complète le plugin «Génération des APIs de table pour Oracle», malheureusement, après analyse, il s est avéré que cette tâche demandait trop d adaptation. Page 6 sur 42

2.4 Administration du projet Dans l optique d assurer un suivi efficace, le directeur de travail m a convié à mettre en place les éléments d administration de projet suivant: Hebdomadairement une séance est organisée avec mon directeur de Bachelor et de l assistant. Un rapport, également hebdomadaire, doit être réalisé afin de présenter le déroulement de la semaine, les éventuels problèmes ainsi que le déroulement de la semaine à venir. Ce rapport hebdomadaire de travail doit être envoyé en fin de semaine par émail à mon directeur de Bachelor. Cette gestion apporte, pour le candidat, l avantage d être immédiatement redirigé en cas de problème. D un autre côté, le directeur de travail, qui est également le représentant du mandat dans mon cas, peut s assurer que le produit qu il attend réponde au mieux à ses besoins. Bien entendu, l inconvénient de la mise en place de cette administration réside dans le temps dépensé par les deux parties, autant pour la préparation des documents à envoyer que pour la lecture de ceux-ci. Au final, chacun y trouve son compte. Page 7 sur 42

2.5 Analyse des risques Le but de ce chapitre est de présenter les différents risques pouvant entraver le bon déroulement de ce projet. L analyse suivante vise essentiellement à identifier les risques et non pas à la mise en œuvre de mesures permettant de les réduire. Ci-dessous, une identification des différents risques: 1. Impossibilité d accéder à certains éléments du référentiel. Effectivement, il est possible que l API Java fourni par Visual Paradigm ne permette pas l accès à certains éléments(s). Ceci entraverait voir rendrait impossible la réalisation du plugin. Cependant ce risque est actuellement très réduit, car d utilise les mêmes méthodes que le plugin «Génération des APIs de table pour Oracle». 2. Impossibilité de reproduire les fonctionnalités du plugin «Génération des APIs de tables pour Oracle» dû au langage Transact SQL. Effectivement, il se peut que le langage Transact SQL ne puisse offrir les mêmes possibilités que le langage PLSQL. La réalisation, au préalable, des APIs à la main, a rendu ce risque inexistant. 3. Manque fonctionnel dû à une erreur d analyse du plugin de «Génération des APIs de tables pour Oracle». Il se peut que lors de l analyse du plugin «Génération des APIs de table pour Oracle», des fonctionnalités aient été oubliées. 4. Une mise à jour de Visual Paradigm changeant profondément le fonctionnement de l Open API. Un risque pour pourrait mettre fin à l utilisation de plugin est que Visual Paradigm décide, comme Oracle l ont fait avec l outil Designer, d arrêter le maintien de l Open API. Page 8 sur 42

La matrice ci-dessous présente les risques en fonction de leur gravité et de leur vraisemblance. Elle se base sur les recommandations EBIOS. Le placement ayant été fait au début de ce projet. Page 9 sur 42

2.6 Technologies utilisées Ci-dessous une liste et un petit descriptif des différentes technologies utilisées. Il est également précisé les différentes versions des logiciels/technologies utilisées afin d éviter les problèmes d incompatibilités. NetBeans IDE 7.3.1 (Build 201306052037) Java JDK 1.7.0_25 Java SE Runtime Environment 1.6.0_35-b10 Microsoft SQL Server 2008 R2 10.50.1600.1 (Microsoft SQL Server Developer Edition) Visual Paradigm for UML Enterprise Edition (Build 20130605) Page 10 sur 42

3 Convention de nommage Les conventions de nommage permettent de faciliter la compréhension des éléments ainsi que garder une unité au travers des différents documents/codes. J ai donc défini les éléments suivants: Concerne Détail Abréviation Trigger INSTEAD OF IOF Trigger AFTER AFTER Trigger Déclenchement avant PRE Trigger Déclenchement après POST Trigger Déclenchement pour chaque ligne ROW Trigger Déclenchement pour une ligne STMT Trigger Insert INS Trigger Update UPD Trigger Delete DEL Procédure Journal JN Il suffit de combiner ces différents éléments pour créer le nom des éléments que j ai utilisé. Exemple: Trigger INSTEAD OF UPDATE FOR EACH ROW = IOF_UPD_ROW Trigger AFTER DELETE = AFTER_DEL_STMT Page 11 sur 42

4 Valeurs taguées utilisées Les valeurs taguées permettent d indiquer au plugin les éléments à générer. Elles sont propres à chaque table. Voici une liste les décrivant: Valeurs taguées PRE_INS POST_INS PRE_UPD POST_UPD PRE_DEL POST_DEL JOURNAL CTRLAJUSER CTRLAJDATE CTRLMOUSER CTRLMODATE PROCEDURE PRE_BEFORE_INS_ROW PRE_BEFORE_INS_STMT PRE_BEFORE_UPD_ROW Explications avant chaque requête d insertion de données dans la base. après chaque requête d insertion de données dans la base. avant chaque requête de modification de données dans la base. après chaque requête de modification de données dans la base. avant chaque requête de suppression de données dans la base. après chaque requête de suppression de données dans la base. Permet de générer le mécanisme de journalisation des manipulations des données. Permet d ajouter la colonne CTRLAJUSER d information d audit de manipulation des enregistrements. Permet d ajouter la colonne CTRLAJDATE d information d audit de manipulation des enregistrements. Permet d ajouter la colonne CTRLMOUSER d information d audit de manipulation des enregistrements. Permet d ajouter la colonne CTRLMODATE d information d audit de manipulation des enregistrements. Permet d ajouter une procédure stockée personnalisée. avant une requête d insertion du trigger INSTEAD OF INSERT FOR EACH ROW. avant une requête d insertion du trigger INSTEAD OF INSERT STMT. avant une requête de mise à jour des données du trigger INSTEAD OF UPDATE FOR EACH ROW. Page 12 sur 42

PRE_BEFORE_UPD_STMT PRE_BEFORE_DEL_ROW PRE_BEFORE_DEL_STMT PRE_AFTER_INS_ROW PRE_AFTER_INS_STMT PRE_AFTER_UPD_ROW PRE_AFTER_UPD_STMT PRE_AFTER_DEL_ROW PRE_AFTER_DEL_STMT POST_BEFORE_INS_ROW POST_BEFORE_INS_STMT POST_BEFORE_UPD_ROW avant une requête de mise à jour des données du trigger INSTEAD OF UPDATE STMT. avant une requête de suppression de données du trigger INSTEAD OF DELETE FOR EACH ROW. avant une requête de suppression de données du trigger INSTEAD OF DELETE STMT. avant une requête d insertion du trigger AFTER INSERT FOR EACH ROW. avant une requête d insertion du trigger AFTER INSERT STMT. avant une requête de mise à jour des données du trigger AFTER UPDATE FOR EACH ROW. avant une requête de mise à jour des données du trigger AFTER UPDATE STMT. avant une requête de suppression de données du trigger AFTER DELETE FOR EACH ROW. avant une requête de suppression de données du trigger AFTER DELETE STMT. après une requête d insertion du trigger INSTEAD OF INSERT FOR EACH ROW. après une requête d insertion du trigger INSTEAD OF INSERT STMT. après une requête de mise à jour des données du trigger INSTEAD OF UPDATE FOR EACH ROW. POST_BEFORE_UPD_STMT après une requête de mise à jour des données du trigger INSTEAD OF UPDATE STMT. POST_BEFORE_DEL_ROW POST_BEFORE_DEL_STMT après une requête de suppression de données du trigger INSTEAD OF DELETE FOR EACH ROW. Page 13 sur 42

après une requête de suppression de données du trigger INSTEAD OF DELETE STMT. POST_AFTER_INS_ROW POST_AFTER_INS_STMT POST_AFTER_UPD_ROW POST_AFTER_UPD_STMT POST_AFTER_DEL_ROW POST_AFTER_DEL_STMT après une requête d insertion du trigger AFTER INSERT FOR EACH ROW. après une requête d insertion du trigger AFTER INSERT STMT. après une requête de mise à jour des données du trigger AFTER UPDATE FOR EACH ROW. après une requête de mise à jour des données du trigger AFTER UPDATE STMT. après une requête de suppression de données du trigger AFTER DELETE FOR EACH ROW. après une requête de suppression de données du trigger AFTER DELETE STMT. Page 14 sur 42

5 Fonctionnement du plugin 5.1 Principe de base L objectif de ce chapitre est de présenter les principes de base sur lesquels repose ce plugin. Il m a été expressément de développé un plugin pour Visual Paradigm et pour le SGBDR SQL Server. C est pourquoi aucune analyse n a été faite concernant le choix technologique. Effectivement, Visual Paradigm offre uniquement une API écrite en Java et SQL Server offre un langage de manipulation de ces objets: le Transact SQL. Les fonctionnalités qui ont été développées sont celles présentées dans le document théorique. Page 15 sur 42

5.2 Déclenchement du plugin 5.2.1 Prérequis Quelques règles sont à appliquer afin de pouvoir générer les APIs de table: Avoir défini au moins un modèle dans le projet Visual Paradigm et le nommer «Model». Avoir une clé primaire par table. Avoir au moins une table marquée par le stéréotype «MLD». Avoir au moins une colonne par table. Ces contraintes ont été fixées, car elles représentent le seuil minimum d informations nécessaire au bon fonctionnement du plugin. 5.2.2 Utilisation Le plugin se déclenche de deux manières. La première consiste à utiliser l icône dans la barre des raccourcis. La deuxième est de passer par le menu. Page 16 sur 42

5.2.3 Sélection des tables Le stéréotype «MLD» permet de sélectionner uniquement les tables dont nous voulons générer les APIs de table. Voici comment ajouter ce stéréotype : Page 17 sur 42

5.2.4 Schéma de fonctionnement Ci-dessous un schéma représentant le fonctionnement global des APIs de tables.

6 L utilité concrète du plugin L utilité du projet a déjà été partiellement expliquée dans le document d introduction. Ce chapitre va donc uniquement illustrer son utilisation. 6.1 Avant exécution du plugin Voici les tables qui me serviront d exemple. Voici les valeurs targuées de la table «Employes». Voici les valeurs targuées de la table «Departements» Page 19 sur 42

6.2 Résultat de l exécution Voici le résultat après exécution du plugin. Comme vous pouvez le remarquer, les colonnes de valeurs d informations d audit de manipulation des enregistrements ont été ajoutées en fonction des valeurs taguées. Voici les différentes tables présentes après exécution du plugin. Vous pouvez remarquer, la table de journalisation de la table Employes, est apparue ainsi que les deux tables de journalisation des exceptions. Voici les différentes procédures stockées. Les 3 procédures de journalisation des exceptions ont bien été créées ainsi que la procédure de journalisation de la table «Employes». Page 20 sur 42

Lors d une insertion d un département : INSERT INTO [AGL_RH].[dbo].[Departements] ([Code],[Libelle]) VALUES ('Inf','Informatique') GO Voici le résultat : Page 21 sur 42

Lors d une insertion d un employé : INSERT INTO [AGL_RH].[dbo].[Employes] ([DEP_Numero],[Mnemo],[Nom],[Prenom],[RueNo],[CodePostal],[Localite]) VALUES (1,'as','Senft','Arnaud','Docteur Tièche 5A','2732','Reconvilier') GO Table «Employes»: Table de journalisation de l employé : Page 22 sur 42

Mise à jour de cet employé : UPDATE [AGL_RH].[dbo].[Employes] SET [Mnemo] = 'sa' WHERE Numero = 1 GO Table «Employes» Table de journalisation de l employé : Page 23 sur 42

Suppression de cet employé : DELETE FROM [AGL_RH].[dbo].[Employes] WHERE Numero = 1 GO Table «Employes» vide : Table de journalisation : Page 24 sur 42

7 Développement 7.1 Génération des scripts d APIs de tables Trois scripts sont générés lors de l exécution du plugin. Le premier (PROC_DDL_SCRIPT) regroupe toutes les procédures stockées à créer : Procédure de journalisation. Procédure de journalisation des exceptions. Le deuxième (SQL_DDL_SCRIPT) regroupe tous les scripts de définition des données dont : Ajout de champs d audit. Création de la table de journalisation. Création des tables de journalisation des exceptions. Le dernier (TRIGGER_DDL_SCRIPT) regroupe les différents triggers à créer. 7.2 Génération des logs Le dossier logs contient tous les logs, par jour, des exceptions levées lors du déclenchement du plugin. Voici un exemple de log : EXCEPTION IN CLASS 'ch.hearc.ig.generationapistablesqlserver.presentation.action.actioncontroller' : Exception: ch.hearc.ig.generationapistablesqlserver.exceptions.nostereotypeexception Message: Il n y a pas de stéréotype MLD Date: 2013-07-01/09:29:18 Les logs contiennent donc la classe d où qui a généré l exception, l exception, le message et la date. Page 25 sur 42

7.3 Exécution des scripts 7.3.1 Tables de journalisation Voici comment se présente les différentes tables de journalisation générées dans SQL Server : 7.3.2 Tables de journalisation des exceptions Voici comment se présentent les tables de journalisation des erreurs générées: 7.3.3 Colonnes d audit Voici comment se présentent les colonnes d audit générées: Page 26 sur 42

7.3.4 Triggers Voici comment se présentes les triggers générés: 7.3.5 Procédures stockées Voici les différentes procédures stockées générées : Page 27 sur 42

7.5 Abstraction des scripts Le but est de s abstraire au maximum du SGBDR utilisé afin de réimplémenter le minimum d éléments lors de l ajout d un nouveau SGBDR. 7.5.1 Génération des procédures Étant donné que le but est de s abstraire au maximum du SGBDR utilisé sans pour autant rendre le plugin bloquant, une classe abstraite contenant les éléments «réutilisable» et indépendante du SGBDR a été créée. Cette classe a notamment le rôle de vérifier les valeurs taguées. Effectivement, celles-ci sont indépendantes du SGBDR utilisé. Ainsi pas besoin de réimplémenter ces tests lors de l ajout d un SGBDR. La définition des méthodes de génération des procédures est également un élément indépendant du SGBDR. 7.5.2 Génération du code SQL DDL Une classe abstraite contenant les éléments communs pour chaque SGBDR a également été créée pour les codes SQL DDL. Ces éléments communs sont les mêmes que pour les procédures. C est-à-dire, le test des valeurs taguées ainsi que la définition des méthodes de générations des codes SQL DDL. Page 28 sur 42

7.5.3 Génération des triggers Concernant la génération du code des triggers, très peu d éléments sont communs entre chaque SGBDR. Une classe abstraite est quand même présente, mais ne comprend que peu d éléments. Page 29 sur 42

7.6 Paramétrage du plugin 7.6.1 Plugin.properties Ce fichier de configuration du plugin permet de modifier les différents éléments générés. J ai pris la décision de centraliser et d externaliser ces éléments afin de : Ne pas devoir recompiler le plugin lors d une modification dans le fichier. Centraliser l ensemble des éléments susceptible de changer. Ainsi ce fichier regroupe, en un seul endroit, des propriétés ayant potentiellement un risque de changer. Permet de définir le nom du projet : PROJECT.NAME=GenerationAPIsTableSQLServer Permet de définir la version du projet : PLUGIN.VERSION=0.0.0 Permet de définir la date de la version : PLUGIN.VERSIONDATE=03.06.2013 Permet de définir le répertoire de Visual Paradigm qui contient les plugins : VP.PLUGINPATH=C:/Program Files (x86)/visual Paradigm for UML 10.1/plugins Permet de définir le nom du dossier des fichiers logs, le nom des fichiers et le niveau des logs : LOGSMANAGER.LOG_FOLDER=logs LOGSMANAGER.LOG_FILENAME_FORMAT=yyyy-MM-dd LOGSMANAGER.WARNING_LEVEL_TO_LOG=INFO Permet de définir le niveau des messages à afficher: MESSAGEMANAGER.WARNING_LEVEL_TO_SHOW=INFO Permet de définir le nom des Tagged Values à récupérer: TAGGEDVALUES.PRE_INS=PRE-INS TAGGEDVALUES.POST_INS=POST-INS TAGGEDVALUES.PRE_UPD=PRE-UPD TAGGEDVALUES.POST_UPD=POST-UDP TAGGEDVALUES.PRE_DEL=PRE-DEL TAGGEDVALUES.POST_DEL=POST-DEL TAGGEDVALUES.JOURNAL=JOURNAL TAGGEDVALUES.CTRLAJUSER=CTRLAJUSER TAGGEDVALUES.CTRLAJDATE=CTRLAJDATE TAGGEDVALUES.CTRLMOUSER=CTRLMOUSER TAGGEDVALUES.CTRLMODATE=CTRLMODATE TAGGEDVALUES.PROCEDURE=PROCEDURE TAGGEDVALUES.PRE_IOF_INS_ROW=PRE_IOF_INS_ROW TAGGEDVALUES.PRE_IOF_INS_STMT=PRE_IOF_INS_STMT TAGGEDVALUES.PRE_IOF_UPD_ROW=PRE_IOF_UPD_ROW TAGGEDVALUES.PRE_IOF_UPD_STMT=PRE_IOF_UPD_STMT TAGGEDVALUES.PRE_IOF_DEL_ROW=PRE_IOF_DEL_ROW TAGGEDVALUES.PRE_IOF_DEL_STMT=PRE_IOF_DEL_STMT TAGGEDVALUES.PRE_AFTER_INS_ROW=PRE_AFTER_INS_ROW TAGGEDVALUES.PRE_AFTER_INS_STMT=PRE_AFTER_INS_STMT TAGGEDVALUES.PRE_AFTER_UPD_ROW=PRE_AFTER_UPD_ROW TAGGEDVALUES.PRE_AFTER_UPD_STMT=PRE_AFTER_UPD_STMT TAGGEDVALUES.PRE_AFTER_DEL_ROW=PRE_AFTER_DEL_ROW TAGGEDVALUES.PRE_AFTER_DEL_STMT=PRE_AFTER_DEL_STMT Page 30 sur 42

TAGGEDVALUES.POST_IOF_INS_ROW=POST_IOF_INS_ROW TAGGEDVALUES.POST_IOF_INS_STMT=POST_IOF_INS_STMT TAGGEDVALUES.POST_IOF_UPD_ROW=POST_IOF_UPD_ROW TAGGEDVALUES.POST_IOF_UPD_STMT=POST_IOF_UPD_STMT TAGGEDVALUES.POST_IOF_DEL_ROW=POST_IOF_DEL_ROW TAGGEDVALUES.POST_IOF_DEL_STMT=POST_IOF_DEL_STMT TAGGEDVALUES.POST_AFTER_INS_ROW=POST_AFTER_INS_ROW TAGGEDVALUES.POST_AFTER_INS_STMT=POST_AFTER_INS_STMT TAGGEDVALUES.POST_AFTER_UPD_ROW=POST_AFTER_UPD_ROW TAGGEDVALUES.POST_AFTER_UPD_STMT=POST_AFTER_UPD_STMT TAGGEDVALUES.POST_AFTER_DEL_ROW=POST_AFTER_DEL_ROW TAGGEDVALUES.POST_AFTER_DEL_STMT=POST_AFTER_DEL_STMT Permet de définir le nom des triggers: TRIGGER.IOF_INS_ROW_NAME=IOF_INS_ROW TRIGGER.IOF_INS_STMT_NAME=IOF_INS_STMT TRIGGER.IOF_UPD_ROW_NAME=IOF_UPD_ROW TRIGGER.IOF_UPD_STMT_NAME=IOF_UPD_STMT TRIGGER.IOF_DEL_ROW_NAME=IOF_DEL_ROW TRIGGER.IOF_DEL_STMT_NAME=IOF_DEL_STMT TRIGGER.AFTER_INS_ROW_NAME=AFTER_INS_ROW TRIGGER.AFTER_INS_STMT_NAME=AFTER_INS_STMT TRIGGER.AFTER_UPD_ROW_NAME=AFTER_UPD_ROW TRIGGER.AFTER_UPD_STMT_NAME=AFTER_UPD_STMT TRIGGER.AFTER_DEL_ROW_NAME=AFTER_DEL_ROW TRIGGER.AFTER_DEL_STMT_NAME=AFTER_DEL_STMT Permet de définir le nom du stéréotype MLD: STEREOTYPE.SCHEMA_TO_TRANSFORM=MLD Permet de définir le nom des tables ou de leur extension : TABLE.DDL_EXCEPTION_JOURNAL_NAME=ERRORS_JN TABLE.DDL_EXCEPTION_TRACE_JOURNAL_NAME=ERRORS_JN_CALLS TABLE.DDL_JOURNAL_EXT_NAME=_JN Permet de définir le nom du dossier contenant les scripts et le nom de ceux-ci : SCRIPTS.FOLDER_NAME=scripts_apis SCRIPTS.SQL_DDL_SCRIPT=SQL_DDL_SCRIPT SCRIPTS.PROC_DDL_SCRIPT=PROC_DDL_SCRIPT SCRIPTS.TRIGGER_DDL_SCRIPT=TRIGGER_DDL_SCRIPT Permet de définir le nom des procedures: PROCEDURE.ERR_PROCESS=ERR_PROCESS PROCEDURE.ERR_SAVE_NEW=ERR_SAVE_NEW PROCEDURE.ERR_SAVE_CALL=ERR_SAVE_CALL PROCEDURE.JOURNAL_PREFIXE=ins_jn_ Page 31 sur 42

7.6.2 database.properties Ce fichier regroupe les différentes propriétés concernant la base de données. Permet d indiquer la base de données désirée : SGBDR=SQL_Server Permet de configurer les paramètres de connexion à la base de données : DB_URL=jdbc:sqlserver://AGL-SENFTA:1433;DatabaseName=AGL_RH DB_USERNAME=AGL_USER DB_PWD=AGL_USER Page 32 sur 42

7.7 Script de déploiement Voici le script ANT (build-vp.xml) qui a été utilisé afin de déployer automatiquement le projet dans le dossier «plugin» de Visual Paradigm. <?xml version="1.0"?> <project name="compileandcopytovp" default="doall"> </project> <property file="plugin.properties" /> <!-- Define folders --> <property name="srcpath" location="src" /> <property name="buildpath" location="classes" /> <!-- Run all targets --> <target name="doall"> </target> <echo message="starting Ant script" level="info" /> <antcall target="copytovp" /> <echo message="end Ant script" level="info" /> <!-- Deploy to Visual Paradigm --> <target name="copytovp"> </target> <echo message="deploying to VP plugins folder..." level="info" /> <delete dir="${vp.pluginspath}/${project.deployedfolder}" /> <mkdir dir="${vp.pluginspath}/${project.deployedfolder}"/> <copy todir="${vp.pluginspath}/${project.deployedfolder}/"> </copy> <fileset dir="." excludes="**/.project, **/.classpath, **/build.xml, **/build-vp.xml, **/manifest.mf, **/src/, **/.settings/, **/.externaltoolbuilders/, nbproject/" /> <mkdir dir="${vp.pluginspath}/${project.deployedfolder}/classes"/> <copy todir="${vp.pluginspath}/${project.deployedfolder}/classes"> </copy> <fileset dir="./build/classes"/> <delete dir="${vp.pluginspath}/${project.deployedfolder}/build"/> Si vous utilisez NetBeans, il faut ensuite importer ce fichier dans le script ANT build.xml. <import file="build-vp.xml"/> Puis indiquer au script build.xml quand le script buid-vp.xml doit être déclenché. <target name="-post-compile"> <antcall target="doall"/> </target> Le script doit être appelé après compilation. Page 33 sur 42

7.8 Tests 7.8.1 Tests unitaires Malheureusement, aucun test unitaire n a pu être réalisé. Effectivement, s agissant d un plugin, il n est pas possible de tester l application du faite de la très forte liaison entre le plugin et Visual Paradigm. 7.8.2 Tests par l utilisation Du fait de la nécessité d avoir un référentiel complet ainsi que l environnement pour effectuer des tests, je suis très vite arrivé à la conclusion que je devais créer un deuxième projet me permettant d effectuer différents tests. Voici la procédure mise en place afin d effectuer ces tests : Page 34 sur 42

7.9 Gestion des erreurs 7.9.1 Implémentation de la gestion des messages et logs Après avoir rapidement jeté un œil aux travaux effectués l année précédente, je me suis rapidement rendu compte que le travail [DOC-STB-02] traitait déjà de cette problématique. Tout au long de mon cursus, nous avons appris à créer des éléments réutilisables. Connaissant la qualité du travail effectué par ce Bachelier et après avoir confirmé ceci par ma propre étude, j ai consciemment pris la décision de réutiliser ces différents éléments. Les chapitres ci-dessous reprennent ces différents éléments et expliquent leurs fonctionnements. 7.9.2 Affichage de messages à l utilisateur Fenêtre message L Open API de Visual Paradigm offre la possibilité d envoyer des messages à l utilisateur au travers de la console que l on aperçoit ci-dessous : Pour ce faire, il est nécessaire de faire appel à l élément ViewManage du plugin : ViewManager viewmanager = ApplicationManager.instance().getViewManager(); L objet instancié offre plusieurs méthodes permettant d afficher des messages. La méthode la plus utilisée est : viewmanager.showmessage(string message); Page 35 sur 42

Il est également possible de communiquer avec l utilisateur grâce au framework SWING et AWT. Je n ai pas utilisé ces frameworks pour ce projet, car ceci n était simplement pas le but de celui-ci. Voici un extrait de la documentation officielle de Visual Paradigm qui soutient mes dires [VP-WEB-01]: 7.9.3 Exceptions Voici la description des différentes exceptions mise en place au sein du plugin. Exception Raison Comment la résoudre ConnexionException Vérifier les données de connexion dans le fichier database.properties. FileException NoColumnException Aucune colonne n existe dans une table. Vérifier le chemin d écriture indiqué dans le fichier plugin.properties. Vérifier qu aucune table sans colonne n est présente dans le modèle. NoPkException Pas de clé primaire dans une table. Ajouter une clé primaire à la table. NoRessourceFoundException La ressource n a pas été trouvée. NoStereotypeException Aucune table avec le stéréotype MLD n est présente. Vérifier le nom de la ressource indiquée. Ajouter le stéréotype MLD aux tables voulues. NoTableException Aucune table n est présente dans le MLD. PersistException DatabaseNotSupported La base de données indiquée n est pas reconnue. Vérifier le nom de la base de données entrée dans le fichier Database.properties et que les tests permettant de déterminer la base de données sélectionnée soient correct. Page 36 sur 42

8 Ajout d un nouveau SGBDR Ci-dessous les étapes permettant l extension du plugin à d autres SGBDR. 1. Ajouter l importation de la librairie de connexion à la base de données au dossier Lib du projet. 2. Indiquer au plugin, au travers du fichier plugin.xml, où se trouve la nouvelle librairie à importer. 3. Étendre la classe AbsFactory pour votre SGBDR. Il faut récupérer les valeurs taguées suivantes et en créer une représentation correspondant à ce qui existe dans le SGBDR ajouté (tableau repris du chapitre «Valeurs taguées utilisées). Valeurs taguées PROCEDURE PRE_BEFORE_INS_ROW PRE_BEFORE_INS_STMT PRE_BEFORE_UPD_ROW PRE_BEFORE_UPD_STMT PRE_BEFORE_DEL_ROW PRE_BEFORE_DEL_STMT PRE_AFTER_INS_ROW PRE_AFTER_INS_STMT PRE_AFTER_UPD_ROW PRE_AFTER_UPD_STMT Explications Permet d ajouter une procédure stockée personnalisée. avant une requête d insertion du trigger INSTEAD OF INSERT FOR EACH ROW. avant une requête d insertion du trigger INSTEAD OF INSERT STMT. avant une requête de mise à jour des données du trigger INSTEAD OF UPDATE FOR EACH ROW. avant une requête de mise à jour des données du trigger INSTEAD OF UPDATE STMT. avant une requête de suppression de données du trigger INSTEAD OF DELETE FOR EACH ROW. avant une requête de suppression de données du trigger INSTEAD OF DELETE STMT. avant une requête d insertion du trigger AFTER INSERT FOR EACH ROW. avant une requête d insertion du trigger AFTER INSERT STMT. avant une requête de mise à jour des données du trigger AFTER UPDATE FOR EACH ROW. Page 37 sur 42

avant une requête de mise à jour des données du trigger AFTER UPDATE STMT. PRE_AFTER_DEL_ROW PRE_AFTER_DEL_STMT POST_BEFORE_INS_ROW POST_BEFORE_INS_STMT POST_BEFORE_UPD_ROW avant une requête de suppression de données du trigger AFTER DELETE FOR EACH ROW. avant une requête de suppression de données du trigger AFTER DELETE STMT. après une requête d insertion du trigger INSTEAD OF INSERT FOR EACH ROW. après une requête d insertion du trigger INSTEAD OF INSERT STMT. après une requête de mise à jour des données du trigger INSTEAD OF UPDATE FOR EACH ROW. POST_BEFORE_UPD_STMT après une requête de mise à jour des données du trigger INSTEAD OF UPDATE STMT. POST_BEFORE_DEL_ROW POST_BEFORE_DEL_STMT POST_AFTER_INS_ROW POST_AFTER_INS_STMT POST_AFTER_UPD_ROW POST_AFTER_UPD_STMT POST_AFTER_DEL_ROW POST_AFTER_DEL_STMT après une requête de suppression de données du trigger INSTEAD OF DELETE FOR EACH ROW. après une requête de suppression de données du trigger INSTEAD OF DELETE STMT. après une requête d insertion du trigger AFTER INSERT FOR EACH ROW. après une requête d insertion du trigger AFTER INSERT STMT. après une requête de mise à jour des données du trigger AFTER UPDATE FOR EACH ROW. après une requête de mise à jour des données du trigger AFTER UPDATE STMT. après une requête de suppression de données du trigger AFTER DELETE FOR EACH ROW. après une requête de suppression de données du trigger Page 38 sur 42

AFTER DELETE STMT. 4. Il faut ensuite modifier la méthode gettables de la classe TableFactory du package ch.hearc.ig.generationapistablesqlserver.model afin d y ajouter la prise en charge du nouveau SGBDR. Voici un exemple : if (RessourceBundle.getInstance().getDataBaseRessource().getString("SGBDR").equals("SQL_Server")) { erver")) { /* DataBase Microsoft SQL Server */ SQLServerTable sqlservtable = new SQLServerTable(iModelElement); sqlservtable.retrievealltaggedvalues(imodelelement); return sqlservtable; } else if (RessourceBundle.getInstance().getDataBaseRessource().getString("SGBDR").equals("SQL_S /* DataBase Oracle */ OracleTable oracle = new SQLServerTablei(ModelElement); oracle.retrievealltaggedvalues(imodelelement); return oracle; } else { SGBDR géré."); } throw new DatabaseNotSupported("La valeur de la ressource SGBDR ne correspond à aucun 5. Faites de même pour la méthode get_dao de la classe AbsDAO du package ch.hearc.ig.generationapistablesqlserver.persistence.dao. 6. Il faut ensuite créer une nouvelle extension de la classe AbsDAO propre à votre SGBDR. Deux méthodes sont à implémenter. La première (check_column_audit) permet de vérifier l existence d une colonne dans une table tandis que la seconde (check_table) permet de vérifier l existence d une table. 7. Continuer en créant une nouvelle extension de la classe AbsDataBase du package ch.hearc.ig.generationapistablesqlserver.persistence.database. N oubliez pas de compléter la méthode get_database de la classe abstraite afin qu elle prenne en charge le nouveau SGBDR (comme déjà expliqué au point 4). 8. Nous attaquons ensuite la phase la plus difficile : le package ch.hearc.ig.generationapistablesqlserver.scripts. Effectivement, à l intérieur de celui-ci, il est premièrement nécessaire de compléter les méthodes getscriptfactory, getconcreteprocgenerator, getconcretesqlddlgenerator, getconcretetriggergenerator des classes AbsScriptFactory, AbsProcGenerator, AbsSqlDdlGenerator et AbsTriggerGenerator toujours pour les mêmes raisons. 9. Il faut ensuite étendre les classes AbsProcGenerator, AbsSqlDdlGenerator et AbsTriggerGenerator afin que celle-ci génère les éléments dans un langage propre au SGBDR. Page 39 sur 42

9 Amélioration 9.1 Récupérer une connexion de Visual Paradigm Actuellement, je n ai pas trouvé la solution, si elle existe, afin de récupérer les connexions déjà définies dans Visual Paradigm. Effectivement, présentement il est nécessaire de définir deux fois la connexion : Dans le fichier database.properties : Cette connexion est utilisée afin de générer les différents éléments permettant de mettre en place des APIs de table. Dans Visual Paradigm : Les connexions de Visual Paradigm sont actuellement utilisées notamment pour générer les différents éléments du modèle conceptuel de données. Page 40 sur 42

9.2 Affichage de popup Actuellement, uniquement la zone message est utilisée afin d informer l utilisateur de l avancement de la génération. Il serait tout à fait imaginable d afficher un message, à l aide d un popup, afin bonifier l information à l utilisateur. Effectivement, comme expliqué précédemment, Open API offre la possibilité d afficher des messages à l aide de SWING ou AWT. 9.3 Gérer les modifications incrémentales des APIs de table Ajouter la possibilité de gérer incrémentalement les modifications. 9.4 Revoir la séparation des fichiers de propriétés Arrivé à terme de ce travail, je me suis rendu compte que la séparation des fichiers de propriétés n est pas idéale. Effectivement, ceux-ci mélangent les éléments destinés à l utilisateur final et ceux destinés à un informaticien. Il serait donc bon de revoir la composition de ceux-ci. Page 41 sur 42

10 Conclusion Afin de conclure ce travail, je désire revenir sur le déroulement global de celui-ci et en faire ressortir quelques éléments qui ont retenu particulièrement mon temps et mon attention. Au début de ce travail, j avais connaissance uniquement du monde d Oracle (celui qui m a été enseigné au sein de ces murs). Je pensais donc naïvement que seulement quelques subtils changements apparaitraient entre le monde Oracle et Microsoft. J ai rapidement déchanté. Effectivement, les différences notables qui existent entre ces deux constructeurs ont eu un impact important tout au long du projet. Il a donc fallu que je commence par réaliser les APIs de table «à la main» afin d en comprendre toutes ces difficultés. Tout au long de la création de ces APIs de table à la main, j ai également mené une étude afin d en ressortir les éléments nécessaires à la création de celle-ci. Une fois ces APIs réalisées, il a fallu que je prenne en main l Open API. Ceci c est passé au travers du plugin de génération des APIs de table pour Oracle mais pas uniquement, car il en est rapidement ressorti que ce projet ne correspondait pas à ce que voulais réaliser. J ai donc dû, après discussion avec mon directeur de Bachelor, réaliser mon propre plugin en m inspirant, quelque peu, de ce qui avait déjà été réalisé. Puis vint l étape cruciale du projet : la définition de l architecture logicielle du plugin. Effectivement, outre les analyses de ce qui compose les APIs de table, la mise en place de l architecture logicielle m a causé pas mal de souci. Effectivement, il a fallu que je me repose sur des connaissances à peine acquises en plus de celles de la séparation des couches, des APIs de table pour Oracle, de la responsabilité de chaque classe Bien sûr, tous ces éléments ont été étudiés en classe, mais je n ai encore jamais dû assembler toutes ces «briques» au sein d un projet bien plus vaste qu un simple exercice. Après avoir défini l architecture de mon plugin, tout s est rapidement enchaîné. Je pensais que la programmation même du plugin me prendrait du temps, mais en réalité ce sont toutes les études qui m ont pris environ les trois quarts du temps imparti. Effectivement, la programmation ne pose pas de problème une fois que toutes les réflexions ont été menées. Je tiens quand même à préciser que je n ai pas réussi à poser directement et correctement mon architecture. J ai donc commencé, afin de vérifier certaines parties de mon architecture, à coder. Je me suis ensuite rendu compte que certains éléments n étaient pas corrects et j ai dû revoir ma copie. Mon directeur de travail m a indiqué que ceci était dû à mon manque d expérience. À la fin de ce projet, je peux dire que celui-ci s est correctement déroulé. Bien sûr, je manque cruellement d expérience et heureusement mon directeur de Bachelor m a remis, quand nécessaire, sur les rails. Je le remercie donc pour son encadrement et son soutien tout au long de ce travail. Je remercie également l assistant qui m a été attribué. Effectivement, celui-ci s est montré disponible et a su me porter conseil aux moments opportuns. Page 42 sur 42