package fr.monlouyan.bakefile; import java.io.File; import java.util.List; /** * Représente une règle dans un fichier Bakefile * Dernière modification : 04/02/2025 * * @author Moncef STITI, Yanis HAMOUDI * @version 1.0 * @date 04/02/2025 */ public class Rule { /** * Nom de la règle */ private String name; /** * Liste des dépendances de la règle */ private List dependencies; /** * Liste des commandes de la règle (actions à exécuter) */ private List commands; /** * Indique si la règle est une règle phony */ private boolean isPhony; /** * Constructeur de la classe Rule * @param name Nom de la règle * @param dependencies Liste des dépendances de la règle * @param commands Liste des commandes de la règle à exécuter * @param isPhony Si la règle est une règle phony ou non */ public Rule(String name, List dependencies, List commands, boolean isPhony) { this.name = name; this.dependencies = dependencies; this.commands = commands; this.isPhony = isPhony; } /** * Permet de récupérer le nom de la règle * @return Le nom de la règle */ public String getName() { return name; } /** * Permet de récupérer les dépendances de la règle * @return La liste des dépendances de la règle */ public List getDependencies() { return dependencies; } /** * Permet de récupérer les commandes de la règle * @return La liste des commandes de la règle */ public List getCommands() { return commands; } /** * Permet de savoir si la règle est une règle phony * @return true si la règle est une règle phony, false sinon */ public boolean isPhony() { return isPhony; } /** * Permet de savoir 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(); } /** * Détermine si la règle doit être mise à jour. * Une règle doit être mise à jour si l'un de ses fichiers de sortie est plus ancien qu'un de ses fichiers de dépendance. * De plus, les règles phony sont toujours mises à 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"); } if (isPhony) { if (BakeCLI.isDebug()) { System.out.println("Debug : Rule " + name + " is phony, always needs update"); } return true; // Les règles phony sont toujours mises à jour } File targetFile = new File(name); if (BakeCLI.isDebug()){ System.out.println("Debug : Checking if target file " + name + " exist and is up to date"); } long targetTimestamp = targetFile.exists() ? TimestampManager.getTimestamp(targetFile) : 0; if (BakeCLI.isDebug()) { System.out.println("Debug : Target file '" + name + "' last modified at " + TimestampManager.formatTimestamp(targetTimestamp)); } for (String dependency : dependencies) { File depFile = new File(dependency); long depTimestamp = depFile.exists() ? TimestampManager.getTimestamp(depFile) : 0; if (BakeCLI.isDebug()) { System.out.println("Debug : Dependency '" + dependency + "' last modified at " + TimestampManager.formatTimestamp(depTimestamp)); } boolean hasRule = BakeEngine.hasRule(dependency); if (!depFile.exists() && !dependency.isEmpty() && !hasRule) { System.out.println("bake: *** No rule to make target '" + dependency + "', needed by '" + name + "'. Stop."); System.exit(1); } if (depFile.exists() && TimestampManager.getTimestamp(depFile) > targetTimestamp) { if (BakeCLI.isDebug()) { System.out.println("Debug : Dependency " + dependency + " is newer than target file " + name + ", needs update"); } return true; } } return false; } }