Amélioration de la javadoc
This commit is contained in:
parent
f1f378d68d
commit
3e9fa75023
BIN
bakefile.jar
BIN
bakefile.jar
Binary file not shown.
@ -8,7 +8,6 @@ import java.util.ArrayList;
|
||||
*
|
||||
* @author Moncef STITI
|
||||
* @version 1.0
|
||||
* @date 03/02/2025
|
||||
* @see Main
|
||||
*/
|
||||
public class BakeCLI {
|
||||
@ -26,7 +25,6 @@ public class BakeCLI {
|
||||
* Constructeur de la classe BakeCLI
|
||||
*
|
||||
* @param args Les arguments passés en ligne de commande
|
||||
* @return void
|
||||
* @see Main
|
||||
*/
|
||||
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
|
||||
* @return
|
||||
* @return La liste des arguments
|
||||
*/
|
||||
public static List<String> getTargets(){ return targets; }
|
||||
}
|
||||
|
@ -4,36 +4,83 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
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 {
|
||||
|
||||
/** Analyseur syntaxique du fichier Bakefile */
|
||||
private BakefileParser parser;
|
||||
|
||||
/** Responsable de la résolution des dépendances entre règles */
|
||||
private DependencyResolver resolver;
|
||||
|
||||
/** Exécuteur des commandes définies dans les règles */
|
||||
private CommandExecutor executor;
|
||||
|
||||
/** Map qui stocke toutes les règles indexées par leur nom */
|
||||
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() {
|
||||
this.parser = new BakefileParser("Bakefile");
|
||||
this.resolver = new DependencyResolver(BakeCLI.isDebug());
|
||||
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) {
|
||||
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) {
|
||||
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() {
|
||||
// Analyse le fichier Bakefile pour extraire les règles
|
||||
List<Rule> rules = parser.parse();
|
||||
|
||||
// Ajoute toutes les règles à la map pour référence rapide
|
||||
for (Rule rule : rules) {
|
||||
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());
|
||||
this.executor = new CommandExecutor(BakeCLI.isDebug(), resolver.isCircular());
|
||||
|
||||
|
||||
// Exécute les règles dans l'ordre déterminé
|
||||
for (Rule rule : rulesToBuild) {
|
||||
executor.execute(rule);
|
||||
}
|
||||
|
@ -8,6 +8,14 @@ import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
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 {
|
||||
|
||||
/**
|
||||
@ -62,11 +70,21 @@ public class BakefileParser {
|
||||
*/
|
||||
private Map<String, String> variables = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Constructeur de la classe BakefileParser.
|
||||
* @param filename Nom du fichier Bakefile à parser
|
||||
*/
|
||||
public BakefileParser(String filename) {
|
||||
this.filename = filename;
|
||||
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) {
|
||||
StringBuilder combinedLine = new StringBuilder();
|
||||
int i = startIndex;
|
||||
@ -89,6 +107,11 @@ public class BakefileParser {
|
||||
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) {
|
||||
if (input == null) return null;
|
||||
|
||||
@ -126,12 +149,22 @@ public class BakefileParser {
|
||||
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) {
|
||||
return items.stream()
|
||||
.map(this::replaceVariables)
|
||||
.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) {
|
||||
if (depStr == null || depStr.trim().isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
@ -144,6 +177,11 @@ public class BakefileParser {
|
||||
.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) {
|
||||
if (targetStr == null || targetStr.trim().isEmpty()) {
|
||||
return new ArrayList<>();
|
||||
@ -156,6 +194,10 @@ public class BakefileParser {
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
||||
/**
|
||||
* Analyser le fichier Bakefile pour extraire les règles de build.
|
||||
* @return Liste des règles extraites
|
||||
*/
|
||||
public List<Rule> parse() {
|
||||
List<Rule> rules = new ArrayList<>();
|
||||
Set<String> phonyTargets = new HashSet<>();
|
||||
|
@ -3,17 +3,49 @@ package fr.monlouyan.bakefile;
|
||||
import java.io.File;
|
||||
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 {
|
||||
/**
|
||||
* true si le mode debug est activé, false sinon
|
||||
*/
|
||||
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) {
|
||||
this.debug = debug;
|
||||
this.isCircular = isCircular;
|
||||
}
|
||||
|
||||
/**
|
||||
* Exécute les commandes d'une règle.
|
||||
* @param rule La règle à exécuter
|
||||
*/
|
||||
public void execute(Rule rule) {
|
||||
// On vérifie d'abord si cette règle a besoin d'être mise à jour
|
||||
boolean ruleNeedsUpdate = rule.needsUpdate();
|
||||
|
@ -2,16 +2,40 @@ package fr.monlouyan.bakefile;
|
||||
|
||||
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 {
|
||||
|
||||
/*** true si le mode debug est activé, false sinon */
|
||||
private boolean debug;
|
||||
|
||||
/*** Map des règles indexées par leur nom */
|
||||
private Map<String, Rule> ruleMap;
|
||||
|
||||
/*** true si une dépendance circulaire est détectée, false sinon */
|
||||
private boolean isCircular;
|
||||
|
||||
|
||||
/**
|
||||
* Constructeur de la classe DependencyResolver.
|
||||
* @param debug true si le mode debug est activé, false sinon
|
||||
*/
|
||||
public DependencyResolver(boolean debug) {
|
||||
this.debug = debug;
|
||||
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) {
|
||||
List<Rule> rulesToBuild = new ArrayList<>();
|
||||
ruleMap = new HashMap<>();
|
||||
@ -64,6 +88,12 @@ public class DependencyResolver {
|
||||
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) {
|
||||
if (!ruleMap.containsKey(ruleName) || processed.contains(ruleName)) {
|
||||
return;
|
||||
@ -85,7 +115,13 @@ public class DependencyResolver {
|
||||
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) {
|
||||
if (stack.contains(ruleName)) {
|
||||
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() {
|
||||
return isCircular;
|
||||
}
|
||||
|
@ -5,15 +5,20 @@ package fr.monlouyan.bakefile;
|
||||
*
|
||||
* @version 1.0
|
||||
* @author Moncef STITI
|
||||
* @date 03/02/2025
|
||||
*/
|
||||
public class Main{
|
||||
|
||||
/**
|
||||
* Constructeur de la classe Main (privé pour empêcher l'instanciation)
|
||||
*/
|
||||
private Main() {
|
||||
// Constructeur inutile
|
||||
}
|
||||
|
||||
/**
|
||||
* Méthode principale du programme
|
||||
*
|
||||
* @param args Les arguments passés en ligne de commande
|
||||
* @return void
|
||||
*/
|
||||
public static void main(String[] args){
|
||||
@SuppressWarnings("unused")
|
||||
|
@ -2,14 +2,36 @@ package fr.monlouyan.bakefile;
|
||||
|
||||
import java.io.File;
|
||||
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 {
|
||||
|
||||
/*** Nom de la règle */
|
||||
private String name;
|
||||
|
||||
/*** Liste des dépendances de la règle */
|
||||
private List<String> dependencies;
|
||||
|
||||
/*** Liste des commandes */
|
||||
private List<String> commands;
|
||||
|
||||
/*** true si la règle est phony, false sinon */
|
||||
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) {
|
||||
this.name = name;
|
||||
this.dependencies = dependencies;
|
||||
@ -17,12 +39,40 @@ public class Rule {
|
||||
this.isPhony = isPhony;
|
||||
}
|
||||
|
||||
/**
|
||||
* Récupère le nom de la règle.
|
||||
* @return Le nom de la règle
|
||||
*/
|
||||
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; }
|
||||
|
||||
/**
|
||||
* Récupère la liste des commandes de la règle.
|
||||
* @return La liste des commandes
|
||||
*/
|
||||
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; }
|
||||
|
||||
/**
|
||||
* 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(); }
|
||||
|
||||
/**
|
||||
* 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() {
|
||||
if (BakeCLI.isDebug()){
|
||||
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.
|
||||
* Dernière modification : 04/02/2025
|
||||
*
|
||||
* @author Moncef STITI, Yanis HAMOUDI
|
||||
* @version 1.0
|
||||
* @date 04/02/2025
|
||||
*/
|
||||
public class TimestampManager {
|
||||
|
||||
/**
|
||||
* Constructeur de TimestampManager.
|
||||
*/
|
||||
public TimestampManager() {
|
||||
// Constructeur inutile
|
||||
}
|
||||
|
||||
/**
|
||||
* 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.
|
||||
* @param file Le fichier
|
||||
*/
|
||||
public static long getTimestamp(File file) {
|
||||
if (file.exists()) {
|
||||
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user