:: Enseignements :: ESIPE :: E4INFO :: 2022-2023 :: Java Avancé ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) |
Projet de Java Avancé INFO 2 - 2022
|
Exercice 1 - Clout Metrics
Le but du projet
Clout Metrics est d'écrire une application web qui analyse un
repository
git (par exemple sur github ou gitlab) et affiche différentes métriques et les badges du projet.
L'application
Clout Metrics est composée d'un
back-end écrit en Java offrant
différents services REST permettant d'accéder aux données des métriques et badges d'un projet
et d'un
front-end écrit en JavaScript affichant les métriques sous forme de graphe et autres
gizmos visuels.
L’application doit permettre...
-
... d'ajouter un nouveau repository. Il n'y a pas de notion d'utilisateur, tout le monde peut ajouter un repository
Le repository est alors analysé et les différentes métriques sont calculées. Attention,
comme calculer les différentes métriques peut prendre du temps, il faut que visuellement,
l'utilisateur voit les métriques déjà calculée et celles qui sont en cours de calcul.
-
... de mettre à jour les métriques et badges d'un projet de façon incrémentale, dans ce cas, les métriques
doivent être recalculées par rapport aux nouvelles informations. Attention, le recalcul doit être incrémental,
vous ne devez pas jeter les métriques existantes et tout recalculer, mais mettre à jour les métriques.
-
... d'afficher un tableau de bord avec les différentes métriques pour un repository git ainsi que les badges
associés à chaque auteur.
En termes d'interface graphique, votre application doit être composée de trois écrans :
-
Le premier écran sert d'écran d'accueil et affiche l'ensemble des repositories disponibles. Il doit permettre d'ajouter un nouveau repository ou de mettre à jour un repository ainsi que l'ensemble
des auteurs des différents projets.
Pour cette écran, uniquement les informations essentielles
d'un repository doivent être affichées (au moins : le nom du projet, l'URL du repository git,
la date d'ajout du repository, la date du dernier refresh , si un refresh des métriques est en cours,
avec une barre de progression si possible !) et pour chaque auteur, le nombre de projet auxquels
il a participé ainsi que le projet principal sur lequel il a contribué et
les badges pour ce projet.
-
Un seconde page affiche les métriques du repository et les badges des auteurs sous forme
d'un tableau de bord.
Vous trouverez des exemples visuels de métriques ici :
https://github.com/lowlighter/metrics
-
La troisième page indique, pour un auteur, chaque projet auquel il a contribué avec
les badges pour chaque projet.
Voici la liste des métriques qui vous sont demandées :
-
Le noms des auteurs avec, pour chacun, le nombre de lignes de codes contribuées (cf git blame)
ordonnées du plus gros contributeur au plus petit.
-
Les langages de programmation utilisés, en pourcentage. Pour simplifier, on utilise l'extension du nom
de fichier pour savoir quel est le langage d'un fichier.
-
L'outil de build utilisé : make, ant, maven, gradle, cargo, bazel, sbt, etc...
-
La licence utilisée, en vert si la licence est Open Source.
-
La liste des dépendances externes (au moins pour Java) pour lesquelles il existes une
version plus récente, triées par date de parution des librairies, de la plus ancienne
à la plus récente.
-
Le ratio entre le nombre de lignes de documentation (type javadoc) et le nombre total de lignes de code (commentaire pas de doc exclu).
-
Une métrique intéressante que vous êtes seuls à proposer.
Chaque auteur peut recevoir un ou plusieurs badges indiquant un travail sur une partie particulière du projet.
Voici la liste des badges qui vous sont demandés :
-
Le builder décerné à l'auteur qui à modifié le plus les fichiers de build.
-
Le doc(tor) décerné à l'auteur qui a fait le plus de documentation, en regardant les
fichier .md et commentaires dans le code.
-
Le devops décerné à l'auteur qui à modifié le plus les fichiers d'intégration continue
(en regardant les fichiers des Github Actions, de TravisCI et de Circle CI) ainsi que les fichiers
liés à docker (Dockerfile, docker-compose.yml).
-
L'architect décerné à celui qui a le plus modifié les interfaces et le fichier module-info.java
en Java.
-
et au moins deux autres badges spécifiques à votre projet.
Technologies à utiliser :
-
Vous devez utiliser Maven comme outil de build et IntelliJ comme IDE,
et la version 19 de Java.
-
Pour tester vos services REST, vous pouvez utiliser
Postman
ou tout autre client capables de faire des requêtes REST.
-
Les tests unitaires Java doivent être effectués avec JUnit 5.9.1, vous pouvez vous référer au
guide d'utilisation.
Chaque classe Java doit avoir une classe de test correspondante (pour au moins 80%) du projet.
-
Pour la sérialisation/dé-sérialisation JSON des requêtes, vous utiliserez une API de parsing JSON
Jackson 2.13.4.2
-
Pour l'extraction de "truc"(TM) dans le code source, vous utiliserez des expressions régulières avec le package java.util.regex.
-
Pour s'interfacer avec Git, vous utiliserez Jgit 6.3.0.202209071007-r.
-
Pour discuter avec le resolver de dependency de Maven ,
il y a une API https://maven.apache.org/resolver/ (la version 1.8.2),
ce projet a été commencé par Eclipse puis récupérer par la fondation apache, la doc est toujours sur le site d'Eclipse
sous le nom du projet Aether (wiki.eclipse.org/Aether).
Pour implanter les différents services REST, votre application doit utiliser une des technos (c'est moi qui choisi pas vous) ci-dessous.
Pour le
mapping Object / Relational, c-a-d voir une ligne d'une table de BDD comme un objet Java :
il y a deux implantations, une à base d'Hibernate qui peut être utilisée directement soit par
l'intermédiaire de la spécification JPA (Java Persistance API) ; et une à base de JDBI.
Pour le
front-end web, vous avez besoin d'un
framework graphique
Note : le
front-end doit être "buildé"" aussi en utilisant
Maven (un seul POM pour front et le back)
vous aurez peut-être besoin de plugin Maven specifique pour cela.
Note2: vous avez besoin de
npm pour la partie build mais pas à l'exécution !
Vous pouvez, de plus, utiliser une librairie spéciale pour la gestion des graphes pourvu quelle
soit adaptée à votre
framework (pas de react-graph si vous devez utiliser svelte).
Pour vous aidez à avoir de belles pages, vous allez aussi utiliser une bibliothèque qui vous aide
pour la partie CSS
L'application a besoin d'une base de données mais vu le volume de données, pas forcément d'une
"vraie" base de données ; nous utiliserons donc des bases de données
embedded.
L'intérêt d'une BDD
embedded est qu'elle est prête à l'emploi directement à partir d'un jar.
Il y a deux façons d'accéder à une BDD en Java, en utilisant le
Driver JDBC ou le
DataSource JDBC.
On vous demande d'utiliser le
DataSource car la gestion des connections à la BD est automatique.
Attention, H2 et SQlite peuvent être utilisés aussi comme des BDDs classiques extérieures à l'application,
mais ce n'est pas ce qui nous intéresse ici, on veut la version
embedded !
REST API documentation :
Nous allons documenter l'API REST de votre
back-end en utilisant le format Open API 3.
Note : il y a deux façons d'utiliser Open API, soit on l'utilise comme un générateur qui génère le squelette
de l'API soit dans l'autre sens, on extrait les valeurs des classes Java. On va utiliser la seconde version,
comme cela, la documentation de l'API sera toujours à jour avec le code.
Sécurité :
-
Pas de HTTPS pour ce projet (c'est mal) mais c'est pour vous aider à débugger !
-
Les entrées des services web au niveau de l'URL ou de la partie JSON doivent être validées
et les sorties doivent être "escapées" pour éviter les injections de code.
-
Il n'y a aucune raison que le login/mdp de la BDD soit en dur dans votre code !
Binômes avec les technos qui doivent être utilisées :
-
BABILLON - BELIN
Quarkus Reactive - Quarkus Hibernate with panache - SQLite - Svelte - Bulma
-
BADAROU - COMMUNIAU
Spring Boot MVC - Spring Data JPA - SQLite - Angular - Bootstrap
-
BEAURY - VEXIAU
Spring Boot MVC - Spring Data JPA - H2 - Vuejs - TailWind
-
COSTANDI - DAO
Quarkus - Quarkus JPA - H2 - React - Tailwind
-
DONNE - TOSTAIN
Helidon SE - Helidon DBClient - H2 - Vuejs - Bootstrap
-
HUMBERT - WEISSE
Micronaut - Micronaut JPA - SQLite - React - Bootstrap
-
LATCHOUMAYA - VELU
Spring Boot Reactive - Jdbi - H2 - Angular - Tailwind
-
PEREIRA - ROMAS
Micronaut Reactive - Micronaut JPA - H2 - React - Bulma
-
SNACEL
Helidon Nima - Helidon DBClient - SQLite - Svelet - Tailwind
Calendrier des rendus.
Soutenance intermédiaire (béta) :
Toutes les parties de l'architecture doivent être présentes et pouvoir communiquer entre elles.
Il peut y avoir des bugs, c'est pas grave. Fonctionnellement, seule la partie incrémentale
du calcul des métriques et des badges n'est pas demandée.
Description des tests (TODO !)
Soutenance finale :
TODO !
Pour vous aider, si vous ne respectez pas les indications de "sudden death" suivantes,
votre projet sera considéré comme mort et noté 0.
Pour la partie Java, le programme doit être écrit en utilisant correctement les différents concepts
vus lors du cours de Java Avancé (sous-typage, polymorphisme, lambdas, classes internes,
exceptions, types paramétrés, annotations, collections, entrées/sorties).
-
Votre projet ne doit pas utiliser une technologies qui n'est pas l'une de celles requises pour votre binôme.
-
Il ne doit pas y avoir de warnings lorsque l'on compile avec javac -Xlint:all.
-
Dans un module, les packages d'implantation ne doivent pas être exportés et
requires transitive doit être utilisé là où c'est nécessaire.
-
Il ne doit pas y avoir de raw types, de @SuppressWarning non justifié, de cast non justifié.
-
Le principe d'encapsulation et la programmation par contrat doivent être respectées.
-
Il ne doit pas y avoir de champs ou méthodes protected.
-
Il ne doit pas y avoir d'instanceof/if...else sur des types là où il est possible
d'utiliser le polymorphisme ou le pattern matching.
-
Chaque interface devra être nécessaire.
Une interface possède 0 ou 1 méthode (sinon justifiée).
-
Aucune classe abstraite ne doit être publique ou utilisée comme un type.
-
Chaque méthode devra être appelée (pas de code mort).
-
Aucune méthode ne doit faire plus de 10 lignes sans une vraie justification.
-
Il est interdit d'utiliser des champs statiques typés par un objet (pas de variables globales),
seules les constantes (static final) de type primitif sont autorisées (et utiliser l'injection de dépendance SVP).
-
Le fichier POM.xml ne doit pas contenir de dépendances non listées dans ce document
où ayant une autre version que la version demandée (à part les dépendances de dépendances).
© Université de Marne-la-Vallée