Amélioration de la javadoc

This commit is contained in:
Moncef STITI 2025-03-07 22:13:57 +01:00
parent f1f378d68d
commit 3e9fa75023
11 changed files with 234 additions and 899 deletions

Binary file not shown.

@ -8,7 +8,6 @@ import java.util.ArrayList;
* *
* @author Moncef STITI * @author Moncef STITI
* @version 1.0 * @version 1.0
* @date 03/02/2025
* @see Main * @see Main
*/ */
public class BakeCLI { public class BakeCLI {
@ -26,7 +25,6 @@ public class BakeCLI {
* Constructeur de la classe BakeCLI * Constructeur de la classe BakeCLI
* *
* @param args Les arguments passés en ligne de commande * @param args Les arguments passés en ligne de commande
* @return void
* @see Main * @see Main
*/ */
public BakeCLI(String[] args){ public BakeCLI(String[] args){
@ -58,7 +56,7 @@ public class BakeCLI {
/** /**
* Permet de récupérer les arguments autres que "-d" passés en ligne de commande * Permet de récupérer les arguments autres que "-d" passés en ligne de commande
* @return * @return La liste des arguments
*/ */
public static List<String> getTargets(){ return targets; } public static List<String> getTargets(){ return targets; }
} }

@ -4,36 +4,83 @@ import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
/**
* Moteur principal de l'application Bake.
* Cette classe est responsable de l'orchestration du processus de build
* en utilisant les règles définies dans le fichier Bakefile.
*
* @author Moncef STITI, Yanis HAMOUDI, Louay DARDOURI
* @version 1.0
*/
public class BakeEngine { public class BakeEngine {
/** Analyseur syntaxique du fichier Bakefile */
private BakefileParser parser; private BakefileParser parser;
/** Responsable de la résolution des dépendances entre règles */
private DependencyResolver resolver; private DependencyResolver resolver;
/** Exécuteur des commandes définies dans les règles */
private CommandExecutor executor; private CommandExecutor executor;
/** Map qui stocke toutes les règles indexées par leur nom */
private static Map<String, Rule> ruleMap; private static Map<String, Rule> ruleMap;
/**
* Constructeur qui initialise le moteur Bake.
* Crée un parser pour le fichier "Bakefile" par défaut et initialise le résolveur de dépendances.
*/
public BakeEngine() { public BakeEngine() {
this.parser = new BakefileParser("Bakefile"); this.parser = new BakefileParser("Bakefile");
this.resolver = new DependencyResolver(BakeCLI.isDebug()); this.resolver = new DependencyResolver(BakeCLI.isDebug());
ruleMap = new HashMap<>(); ruleMap = new HashMap<>();
} }
/**
* Vérifie si une règle avec le nom spécifié existe.
*
* @param target Nom de la règle à vérifier
* @return true si la règle existe, false sinon
*/
public static boolean hasRule(String target) { public static boolean hasRule(String target) {
return ruleMap.containsKey(target); return ruleMap.containsKey(target);
} }
/**
* Récupère une règle par son nom.
*
* @param target Nom de la règle à récupérer
* @return La règle correspondante ou null si elle n'existe pas
*/
public static Rule getRule(String target) { public static Rule getRule(String target) {
return ruleMap.get(target); return ruleMap.get(target);
} }
/**
* Exécute le processus de build complet.
* Cette méthode réalise les étapes suivantes :
* <ol>
* <li>Parse le fichier Bakefile</li>
* <li>Construit la carte des règles</li>
* <li>Résout les dépendances entre les règles</li>
* <li>Exécute les règles dans l'ordre déterminé</li>
* </ol>
*/
public void run() { public void run() {
// Analyse le fichier Bakefile pour extraire les règles
List<Rule> rules = parser.parse(); List<Rule> rules = parser.parse();
// Ajoute toutes les règles à la map pour référence rapide
for (Rule rule : rules) { for (Rule rule : rules) {
ruleMap.put(rule.getName(), rule); ruleMap.put(rule.getName(), rule);
} }
// Résout les dépendances pour déterminer l'ordre d'exécution
List<Rule> rulesToBuild = resolver.resolve(rules, BakeCLI.getTargets()); List<Rule> rulesToBuild = resolver.resolve(rules, BakeCLI.getTargets());
this.executor = new CommandExecutor(BakeCLI.isDebug(), resolver.isCircular()); this.executor = new CommandExecutor(BakeCLI.isDebug(), resolver.isCircular());
// Exécute les règles dans l'ordre déterminé
for (Rule rule : rulesToBuild) { for (Rule rule : rulesToBuild) {
executor.execute(rule); executor.execute(rule);
} }

@ -8,6 +8,14 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/**
* Parseur de fichier Bakefile.
* Cette classe est responsable de l'analyse syntaxique du fichier Bakefile
* pour extraire les règles de build, les dépendances et les commandes associées.
*
* @author Moncef STITI, Yanis HAMOUDI, Louay DARDOURI
* @version 1.0
*/
public class BakefileParser { public class BakefileParser {
/** /**
@ -62,11 +70,21 @@ public class BakefileParser {
*/ */
private Map<String, String> variables = new HashMap<>(); private Map<String, String> variables = new HashMap<>();
/**
* Constructeur de la classe BakefileParser.
* @param filename Nom du fichier Bakefile à parser
*/
public BakefileParser(String filename) { public BakefileParser(String filename) {
this.filename = filename; this.filename = filename;
firstTarget = null; firstTarget = null;
} }
/**
* Gérer les lignes de continuation.
* @param lines Liste des lignes du fichier Bakefile
* @param startIndex Index de la première ligne de continuation
* @return La ligne combinée
*/
private String handleContinuationLines(List<String> lines, int startIndex) { private String handleContinuationLines(List<String> lines, int startIndex) {
StringBuilder combinedLine = new StringBuilder(); StringBuilder combinedLine = new StringBuilder();
int i = startIndex; int i = startIndex;
@ -89,6 +107,11 @@ public class BakefileParser {
return combinedLine.toString(); return combinedLine.toString();
} }
/**
* Remplacer les variables dans une chaîne.
* @param input Chaîne à traiter
* @return Chaîne avec les variables remplacées
*/
private String replaceVariables(String input) { private String replaceVariables(String input) {
if (input == null) return null; if (input == null) return null;
@ -126,12 +149,22 @@ public class BakefileParser {
return result.trim(); return result.trim();
} }
/**
* Remplacer les variables dans une liste de chaînes.
* @param items Liste de chaînes à traiter
* @return Liste de chaînes avec les variables remplacées
*/
private List<String> replaceVariablesInList(List<String> items) { private List<String> replaceVariablesInList(List<String> items) {
return items.stream() return items.stream()
.map(this::replaceVariables) .map(this::replaceVariables)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/**
* Découper les dépendances en une liste de chaînes.
* @param depStr Chaîne de dépendances
* @return Liste de dépendances
*/
private List<String> splitDependencies(String depStr) { private List<String> splitDependencies(String depStr) {
if (depStr == null || depStr.trim().isEmpty()) { if (depStr == null || depStr.trim().isEmpty()) {
return new ArrayList<>(); return new ArrayList<>();
@ -144,6 +177,11 @@ public class BakefileParser {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/**
* Découper les cibles en une liste de chaînes.
* @param targetStr Chaîne de cibles
* @return Liste de cibles
*/
private List<String> splitTargets(String targetStr) { private List<String> splitTargets(String targetStr) {
if (targetStr == null || targetStr.trim().isEmpty()) { if (targetStr == null || targetStr.trim().isEmpty()) {
return new ArrayList<>(); return new ArrayList<>();
@ -156,6 +194,10 @@ public class BakefileParser {
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
/**
* Analyser le fichier Bakefile pour extraire les règles de build.
* @return Liste des règles extraites
*/
public List<Rule> parse() { public List<Rule> parse() {
List<Rule> rules = new ArrayList<>(); List<Rule> rules = new ArrayList<>();
Set<String> phonyTargets = new HashSet<>(); Set<String> phonyTargets = new HashSet<>();

@ -3,17 +3,49 @@ package fr.monlouyan.bakefile;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
/**
* Exécuteur des commandes définies dans les règles.
* Cette classe est responsable de l'exécution des commandes définies dans les règles
* du fichier Bakefile.
*
* @author Moncef STITI, Yanis HAMOUDI, Louay DARDOURI
* @version 1.0
*/
public class CommandExecutor { public class CommandExecutor {
/**
* true si le mode debug est activé, false sinon
*/
private boolean debug; private boolean debug;
private boolean needsUpdate = false; // Pour tracker si quelque chose doit être mis à jour
private boolean isCircular = false; // Pour tracker si un cycle a été détecté
private boolean futureTimestampDetected = false; // Pour détecter les timestamps dans le futur
/**
* Pour tracker si quelque chose doit être mis à jour
*/
private boolean needsUpdate = false;
/**
* Pour tracker si un cycle a été détecté
*/
private boolean isCircular = false;
/**
* Pour détecter les timestamps dans le futur
*/
private boolean futureTimestampDetected = false;
/**
* Constructeur de la classe CommandExecutor.
* @param debug true si le mode debug est activé, false sinon
* @param isCircular true si on est en mode circulaire, false sinon
*/
public CommandExecutor(boolean debug, boolean isCircular) { public CommandExecutor(boolean debug, boolean isCircular) {
this.debug = debug; this.debug = debug;
this.isCircular = isCircular; this.isCircular = isCircular;
} }
/**
* Exécute les commandes d'une règle.
* @param rule La règle à exécuter
*/
public void execute(Rule rule) { public void execute(Rule rule) {
// On vérifie d'abord si cette règle a besoin d'être mise à jour // On vérifie d'abord si cette règle a besoin d'être mise à jour
boolean ruleNeedsUpdate = rule.needsUpdate(); boolean ruleNeedsUpdate = rule.needsUpdate();

@ -2,16 +2,40 @@ package fr.monlouyan.bakefile;
import java.util.*; import java.util.*;
/**
* Résolveur de dépendances entre les règles du fichier Bakefile.
* Cette classe est responsable de la résolution des dépendances entre les règles
* pour déterminer l'ordre dans lequel les règles doivent être
*
* @author Moncef STITI, Yanis HAMOUDI, Louay DARDOURI
* @version 1.0
*/
public class DependencyResolver { public class DependencyResolver {
/*** true si le mode debug est activé, false sinon */
private boolean debug; private boolean debug;
/*** Map des règles indexées par leur nom */
private Map<String, Rule> ruleMap; private Map<String, Rule> ruleMap;
/*** true si une dépendance circulaire est détectée, false sinon */
private boolean isCircular; private boolean isCircular;
/**
* Constructeur de la classe DependencyResolver.
* @param debug true si le mode debug est activé, false sinon
*/
public DependencyResolver(boolean debug) { public DependencyResolver(boolean debug) {
this.debug = debug; this.debug = debug;
this.isCircular = false; this.isCircular = false;
} }
/**
* Résout les dépendances entre les règles.
* @param allRules Liste de toutes les règles
* @param requestedRules Liste des règles demandées
* @return Liste
*/
public List<Rule> resolve(List<Rule> allRules, List<String> requestedRules) { public List<Rule> resolve(List<Rule> allRules, List<String> requestedRules) {
List<Rule> rulesToBuild = new ArrayList<>(); List<Rule> rulesToBuild = new ArrayList<>();
ruleMap = new HashMap<>(); ruleMap = new HashMap<>();
@ -64,6 +88,12 @@ public class DependencyResolver {
return rulesToBuild; return rulesToBuild;
} }
/**
* Méthode de tri topologique pour résoudre les dépendances.
* @param ruleName Nom de la règle
* @param processed Set des règles déjà traitées
* @param buildOrder Liste des règles dans l'ordre
*/
private void topologicalSort(String ruleName, Set<String> processed, List<String> buildOrder) { private void topologicalSort(String ruleName, Set<String> processed, List<String> buildOrder) {
if (!ruleMap.containsKey(ruleName) || processed.contains(ruleName)) { if (!ruleMap.containsKey(ruleName) || processed.contains(ruleName)) {
return; return;
@ -85,7 +115,13 @@ public class DependencyResolver {
buildOrder.add(ruleName); buildOrder.add(ruleName);
} }
// La méthode detectCycle avec une modification pour les chemins home /**
* Méthode de détection des cycles dans les dépendances.
* @param ruleName Nom de la règle
* @param visited Set des règles déjà visitées
* @param stack Set des règles en cours de traitement
* @param parent Nom de la règle parente
*/
private void detectCycle(String ruleName, Set<String> visited, Set<String> stack, String parent) { private void detectCycle(String ruleName, Set<String> visited, Set<String> stack, String parent) {
if (stack.contains(ruleName)) { if (stack.contains(ruleName)) {
if (parent != null) { if (parent != null) {
@ -121,6 +157,10 @@ public class DependencyResolver {
} }
} }
/**
* Vérifie si une dépendance circulaire a été détectée.
* @return true si une dépendance circulaire a été détectée, false sinon
*/
public boolean isCircular() { public boolean isCircular() {
return isCircular; return isCircular;
} }

@ -5,15 +5,20 @@ package fr.monlouyan.bakefile;
* *
* @version 1.0 * @version 1.0
* @author Moncef STITI * @author Moncef STITI
* @date 03/02/2025
*/ */
public class Main{ public class Main{
/**
* Constructeur de la classe Main (privé pour empêcher l'instanciation)
*/
private Main() {
// Constructeur inutile
}
/** /**
* Méthode principale du programme * Méthode principale du programme
* *
* @param args Les arguments passés en ligne de commande * @param args Les arguments passés en ligne de commande
* @return void
*/ */
public static void main(String[] args){ public static void main(String[] args){
@SuppressWarnings("unused") @SuppressWarnings("unused")

@ -2,14 +2,36 @@ package fr.monlouyan.bakefile;
import java.io.File; import java.io.File;
import java.util.List; import java.util.List;
import java.util.Date;
/**
* Représente une règle du fichier Bakefile.
* Chaque règle est composée d'un nom, d'une liste de dépendances et d'une liste de commandes.
* Une règle peut être phony, c'est-à-dire qu'elle n'a pas de fichier cible associé.
*
* @author Moncef STITI, Yanis HAMOUDI, Louay DARDOURI
* @version 1.0
*/
public class Rule { public class Rule {
/*** Nom de la règle */
private String name; private String name;
/*** Liste des dépendances de la règle */
private List<String> dependencies; private List<String> dependencies;
/*** Liste des commandes */
private List<String> commands; private List<String> commands;
/*** true si la règle est phony, false sinon */
private boolean isPhony; private boolean isPhony;
/**
* Constructeur de la classe Rule.
* @param name Nom de la règle
* @param dependencies Liste des dépendances
* @param commands Liste des commandes
* @param isPhony true si la règle est phony, false sinon
*/
public Rule(String name, List<String> dependencies, List<String> commands, boolean isPhony) { public Rule(String name, List<String> dependencies, List<String> commands, boolean isPhony) {
this.name = name; this.name = name;
this.dependencies = dependencies; this.dependencies = dependencies;
@ -17,12 +39,40 @@ public class Rule {
this.isPhony = isPhony; this.isPhony = isPhony;
} }
/**
* Récupère le nom de la règle.
* @return Le nom de la règle
*/
public String getName() { return name; } public String getName() { return name; }
/**
* Récupère la liste des dépendances de la règle.
* @return La liste des dépendances
*/
public List<String> getDependencies() { return dependencies; } public List<String> getDependencies() { return dependencies; }
/**
* Récupère la liste des commandes de la règle.
* @return La liste des commandes
*/
public List<String> getCommands() { return commands; } public List<String> getCommands() { return commands; }
/**
* Vérifie si la règle est phony.
* @return true si la règle est phony, false sinon.
*/
public boolean isPhony() { return isPhony; } public boolean isPhony() { return isPhony; }
/**
* Vérifie si la règle est vide (sans dépendances ni commandes).
* @return true si la règle est vide, false sinon
*/
public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); } public boolean isEmpty() { return dependencies.isEmpty() && commands.isEmpty(); }
/**
* Vérifie si la règle doit être mise à jour.
* @return true si la règle doit être mise à jour, false sinon
*/
public boolean needsUpdate() { public boolean needsUpdate() {
if (BakeCLI.isDebug()){ if (BakeCLI.isDebug()){
System.out.println("Debug : Checking if rule " + name + " needs update"); System.out.println("Debug : Checking if rule " + name + " needs update");

@ -6,18 +6,23 @@ import java.util.Date;
/** /**
* Classe utilitaire pour la gestion des timestamps des fichiers. * Classe utilitaire pour la gestion des timestamps des fichiers.
* Dernière modification : 04/02/2025
* *
* @author Moncef STITI, Yanis HAMOUDI * @author Moncef STITI, Yanis HAMOUDI
* @version 1.0 * @version 1.0
* @date 04/02/2025
*/ */
public class TimestampManager { public class TimestampManager {
/**
* Constructeur de TimestampManager.
*/
public TimestampManager() {
// Constructeur inutile
}
/** /**
* Récupère le timestamp d'un fichier. * Récupère le timestamp d'un fichier.
* @param filePath Le chemin du fichier.
* @return Le timestamp du fichier, ou 0 si le fichier n'existe pas. * @return Le timestamp du fichier, ou 0 si le fichier n'existe pas.
* @param file Le fichier
*/ */
public static long getTimestamp(File file) { public static long getTimestamp(File file) {
if (file.exists()) { if (file.exists()) {

File diff suppressed because it is too large Load Diff

Binary file not shown.