diff --git a/2A/Java/tp/tp-temperature b/2A/Java/tp/tp-temperature new file mode 160000 index 0000000..53d3626 --- /dev/null +++ b/2A/Java/tp/tp-temperature @@ -0,0 +1 @@ +Subproject commit 53d3626c450ef57e3c5019145feb31b3b4813946 diff --git a/2A/Java/tp/tp1-intro/.idea/.gitignore b/2A/Java/tp/tp1-intro/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/2A/Java/tp/tp1-intro/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/2A/Java/tp/tp1-intro/.idea/misc.xml b/2A/Java/tp/tp1-intro/.idea/misc.xml new file mode 100644 index 0000000..0c94973 --- /dev/null +++ b/2A/Java/tp/tp1-intro/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp1-intro/.idea/modules.xml b/2A/Java/tp/tp1-intro/.idea/modules.xml new file mode 100644 index 0000000..c341d1f --- /dev/null +++ b/2A/Java/tp/tp1-intro/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp1-intro/.idea/uiDesigner.xml b/2A/Java/tp/tp1-intro/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/2A/Java/tp/tp1-intro/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/Main.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/Main.class new file mode 100644 index 0000000..a2aaa60 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/Main.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/Action.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/Action.class new file mode 100644 index 0000000..1319b49 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/Action.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface$1.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface$1.class new file mode 100644 index 0000000..e4d3a1b Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface$1.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface.class new file mode 100644 index 0000000..055f0a4 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/Afficheur.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/Afficheur.class new file mode 100644 index 0000000..c227260 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/Afficheur.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/AfficheurConsole.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/AfficheurConsole.class new file mode 100644 index 0000000..9c4d06f Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/AfficheurConsole.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/Saisisseur.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/Saisisseur.class new file mode 100644 index 0000000..2590f52 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/Saisisseur.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/SaisisseurConsole.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/SaisisseurConsole.class new file mode 100644 index 0000000..58565c7 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/io/SaisisseurConsole.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/model/Patient.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/model/Patient.class new file mode 100644 index 0000000..5f238c1 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/model/Patient.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/model/Repertoire.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/model/Repertoire.class new file mode 100644 index 0000000..735f523 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/model/Repertoire.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/FilePersistance.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/FilePersistance.class new file mode 100644 index 0000000..b30bac0 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/FilePersistance.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/LoaderPersistance.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/LoaderPersistance.class new file mode 100644 index 0000000..09e721b Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/LoaderPersistance.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/NoopWriterPersistance.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/NoopWriterPersistance.class new file mode 100644 index 0000000..2063557 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/NoopWriterPersistance.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/Persistance.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/Persistance.class new file mode 100644 index 0000000..5dd48c4 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/Persistance.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/StubLoaderPersistance.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/StubLoaderPersistance.class new file mode 100644 index 0000000..8d72667 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/StubLoaderPersistance.class differ diff --git a/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/WriterPersistance.class b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/WriterPersistance.class new file mode 100644 index 0000000..c5d7c76 Binary files /dev/null and b/2A/Java/tp/tp1-intro/out/production/tp1-intro/fr/uca/iut/clfreville2/tp1/persistance/WriterPersistance.class differ diff --git a/2A/Java/tp/tp1-intro/repertoire.txt b/2A/Java/tp/tp1-intro/repertoire.txt new file mode 100644 index 0000000..23c98b0 --- /dev/null +++ b/2A/Java/tp/tp1-intro/repertoire.txt @@ -0,0 +1,2 @@ +Machin Truc +Bidule Machin diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/Main.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/Main.java new file mode 100644 index 0000000..8d3dded --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/Main.java @@ -0,0 +1,21 @@ +package fr.uca.iut.clfreville2.tp1; + +import fr.uca.iut.clfreville2.tp1.cli.CommandLineInterface; +import fr.uca.iut.clfreville2.tp1.io.AfficheurConsole; +import fr.uca.iut.clfreville2.tp1.io.SaisisseurConsole; +import fr.uca.iut.clfreville2.tp1.model.Repertoire; +import fr.uca.iut.clfreville2.tp1.persistance.FilePersistance; +import fr.uca.iut.clfreville2.tp1.persistance.StubLoaderPersistance; + +public final class Main { + + public static void main(String[] args) { + new CommandLineInterface( + new StubLoaderPersistance(), + new FilePersistance(), + new Repertoire(), + new AfficheurConsole(), + new SaisisseurConsole() + ).execute(); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/cli/Action.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/cli/Action.java new file mode 100644 index 0000000..f0382d1 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/cli/Action.java @@ -0,0 +1,21 @@ +package fr.uca.iut.clfreville2.tp1.cli; + +import java.util.Arrays; + +public enum Action { + AJOUTER_PATIENT('a'), + EDITER_PATIENT('e'), + LISTER_PATIENTS('l'), + SUPPRIMER_PATIENT('s'), + QUITTER('q'); + + private final char identificateur; + + Action(char identificateur) { + this.identificateur = identificateur; + } + + public static Action fromIdentificateur(char c) { + return Arrays.stream(values()).filter(a -> a.identificateur == c).findFirst().orElse(null); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface.java new file mode 100644 index 0000000..d5c1ba6 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/cli/CommandLineInterface.java @@ -0,0 +1,80 @@ +package fr.uca.iut.clfreville2.tp1.cli; + +import fr.uca.iut.clfreville2.tp1.io.Afficheur; +import fr.uca.iut.clfreville2.tp1.io.Saisisseur; +import fr.uca.iut.clfreville2.tp1.model.Patient; +import fr.uca.iut.clfreville2.tp1.model.Repertoire; +import fr.uca.iut.clfreville2.tp1.persistance.LoaderPersistance; +import fr.uca.iut.clfreville2.tp1.persistance.WriterPersistance; + +public final class CommandLineInterface { + + private final Repertoire repertoire; + private final Afficheur afficheur; + private final Saisisseur saisisseur; + private final LoaderPersistance loaderPersistance; + private final WriterPersistance writerPersistance; + + public CommandLineInterface(LoaderPersistance loaderPersistance, WriterPersistance writerPersistance, Repertoire repertoire, Afficheur afficheur, Saisisseur saisisseur) { + this.repertoire = repertoire; + this.afficheur = afficheur; + this.saisisseur = saisisseur; + this.loaderPersistance = loaderPersistance; + this.writerPersistance = writerPersistance; + } + + /** + * Exécute l'application en ligne de commande. + */ + public void execute() { + loaderPersistance.lire(repertoire); + afficheur.afficherIntroduction(); + afficheur.afficherDemande("l'action à effectuer"); + Action action; + while ((action = saisisseur.demanderAction()) != Action.QUITTER) { + if (action == null) { + afficheur.afficherErreur("Action inconnue !"); + continue; + } + switch (action) { + case AJOUTER_PATIENT -> gererAjoutPatient(); + case EDITER_PATIENT -> gererModificationPatient(); + case LISTER_PATIENTS -> afficheur.afficherPatients(repertoire); + case SUPPRIMER_PATIENT -> gererSuppressionPatient(); + } + } + writerPersistance.ecrire(repertoire); + } + + private void gererAjoutPatient() { + Patient patient = demanderInfosPatient(); + repertoire.referencerPatient(patient.prenom(), patient.nom()); + afficheur.afficherSucces("Le patient a bien été rajouté."); + } + + private void gererSuppressionPatient() { + Patient patient = demanderInfosPatient(); + if (repertoire.dereferencerPatient(patient.prenom(), patient.nom())) { + afficheur.afficherSucces("Le patient a bien été supprimé."); + } else { + afficheur.afficherErreur("Le patient n'existe pas et ne peut pas être supprimé."); + } + } + + private void gererModificationPatient() { + Patient patient = demanderInfosPatient(); + if (!repertoire.dereferencerPatient(patient.prenom(), patient.nom())) { + afficheur.afficherErreur("Le patient n'existe pas et ne peut pas être édité."); + return; + } + gererAjoutPatient(); + } + + private Patient demanderInfosPatient() { + afficheur.afficherDemande("le prénom du patient"); + String prenom = saisisseur.demandeMot(); + afficheur.afficherDemande("le nom du patient"); + String nom = saisisseur.demandeMot(); + return new Patient(prenom, nom); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/Afficheur.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/Afficheur.java new file mode 100644 index 0000000..28b1ace --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/Afficheur.java @@ -0,0 +1,56 @@ +package fr.uca.iut.clfreville2.tp1.io; + +import fr.uca.iut.clfreville2.tp1.model.Patient; +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +/** + * Affiche des informations à l'écran. + *

+ * Son implémentation principale est {@link AfficheurConsole}. + */ +public interface Afficheur { + + /** + * Affiche le texte présentant les actions réalisables par l'utilisateur. + */ + void afficherIntroduction(); + + /** + * Affiche les informations d'un unique patient. + * + * @param patient Le patient à afficher. + */ + void afficherPatient(Patient patient); + + /** + * Affiche la liste des patients contenus dans un répertoire. + *

+ * Par défaut, affiche un à un les patients. + * + * @param repertoire Le répertoire à utiliser. + */ + default void afficherPatients(Repertoire repertoire) { + repertoire.getPatients().forEach(this::afficherPatient); + } + + /** + * Préparer le texte de demande d'une information à l'utilisateur. + * + * @param objet L'objet de la demande. + */ + void afficherDemande(String objet); + + /** + * Affiche un message de succès. + * + * @param message Le message de succès. + */ + void afficherSucces(String message); + + /** + * Affiche un message d'erreur. + * + * @param message Le message d'erreur. + */ + void afficherErreur(String message); +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/AfficheurConsole.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/AfficheurConsole.java new file mode 100644 index 0000000..bc1d327 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/AfficheurConsole.java @@ -0,0 +1,50 @@ +package fr.uca.iut.clfreville2.tp1.io; + +import fr.uca.iut.clfreville2.tp1.model.Patient; +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +public class AfficheurConsole implements Afficheur { + + private static final String DESCRIPTION_MENU = """ + Système de gestion des patients 3000 + ==================================== + a : Ajouter un nouveau patient + l : Lister les patients + s : Supprimer un patient + q : Quitter + """; + + @Override + public void afficherIntroduction() { + System.out.print(DESCRIPTION_MENU); + } + + @Override + public void afficherPatient(Patient patient) { + System.out.println(patient.designation()); + } + + @Override + public void afficherPatients(Repertoire repertoire) { + if (repertoire.getPatients().isEmpty()) { + System.out.println("Répertoire vide !"); + } else { + Afficheur.super.afficherPatients(repertoire); + } + } + + @Override + public void afficherDemande(String objet) { + System.out.println("Veuillez saisir " + objet + " : "); + } + + @Override + public void afficherSucces(String message) { + System.out.println(message); + } + + @Override + public void afficherErreur(String message) { + System.err.println(message); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/Saisisseur.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/Saisisseur.java new file mode 100644 index 0000000..199bfba --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/Saisisseur.java @@ -0,0 +1,10 @@ +package fr.uca.iut.clfreville2.tp1.io; + +import fr.uca.iut.clfreville2.tp1.cli.Action; + +public interface Saisisseur { + + String demandeMot(); + + Action demanderAction(); +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/SaisisseurConsole.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/SaisisseurConsole.java new file mode 100644 index 0000000..17c9e89 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/io/SaisisseurConsole.java @@ -0,0 +1,42 @@ +package fr.uca.iut.clfreville2.tp1.io; + +import fr.uca.iut.clfreville2.tp1.cli.Action; + +import java.io.InputStream; +import java.io.Reader; +import java.util.Scanner; + +public class SaisisseurConsole implements Saisisseur { + + private final Scanner scanner; + + + public SaisisseurConsole() { + this(System.in); + } + + public SaisisseurConsole(InputStream stream) { + scanner = new Scanner(stream); + } + + public SaisisseurConsole(Reader reader) { + scanner = new Scanner(reader); + } + + @Override + public String demandeMot() { + return scanner.next(); + } + + @Override + public Action demanderAction() { + return switch (scanner.next()) { + case "a" -> Action.AJOUTER_PATIENT; + case "e" -> Action.EDITER_PATIENT; + case "l" -> Action.LISTER_PATIENTS; + case "s" -> Action.SUPPRIMER_PATIENT; + case "q" -> Action.QUITTER; + default -> null; + }; + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/model/Patient.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/model/Patient.java new file mode 100644 index 0000000..154ce2b --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/model/Patient.java @@ -0,0 +1,9 @@ +package fr.uca.iut.clfreville2.tp1.model; + +// Pour les curieux, un record est une classe finale qui contient déjà une redéfinition de equals() et hashCode() +public record Patient(String prenom, String nom) { + + public String designation() { + return prenom + " " + nom.toUpperCase(); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/model/Repertoire.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/model/Repertoire.java new file mode 100644 index 0000000..368db48 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/model/Repertoire.java @@ -0,0 +1,36 @@ +package fr.uca.iut.clfreville2.tp1.model; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +/** + * Le répertoire possède toutes les informations de contact des patients. + */ +public class Repertoire implements Iterable { + + private final List patients = new ArrayList<>(); + + public void referencerPatient(String prenom, String nom) { + patients.add(new Patient(prenom, nom)); + } + + public boolean dereferencerPatient(String prenom, String nom) { + return patients.remove(new Patient(prenom, nom)); + } + + /** + * Récupère l'ensemble des patients répertoriés. + * + * @return Une vue immuable sur les patients. + */ + public List getPatients() { + return Collections.unmodifiableList(patients); + } + + @Override + public Iterator iterator() { + return getPatients().iterator(); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/FilePersistance.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/FilePersistance.java new file mode 100644 index 0000000..1d32d37 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/FilePersistance.java @@ -0,0 +1,46 @@ +package fr.uca.iut.clfreville2.tp1.persistance; + +import fr.uca.iut.clfreville2.tp1.io.Saisisseur; +import fr.uca.iut.clfreville2.tp1.io.SaisisseurConsole; +import fr.uca.iut.clfreville2.tp1.model.Patient; +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +import java.io.*; + +/** + * Une persistance écrivant et lisant un fichier. + */ +public class FilePersistance implements Persistance { + + private final String fileName; + + public FilePersistance() { + this("repertoire.txt"); + } + + public FilePersistance(String fileName) { + this.fileName = fileName; + } + + @Override + public void lire(Repertoire repertoire) { + try (Reader lecteur = new FileReader(fileName)) { + Saisisseur saisisseur = new SaisisseurConsole(lecteur); + repertoire.referencerPatient(saisisseur.demandeMot(), saisisseur.demandeMot()); + } catch (FileNotFoundException ignored) { + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } + + @Override + public void ecrire(Repertoire repertoire) { + try (Writer ecrivain = new FileWriter(fileName)) { + for (Patient patient : repertoire.getPatients()) { + ecrivain.append(patient.nom()).append(" ").append(patient.prenom()).append("\n"); + } + } catch (IOException ex) { + throw new RuntimeException(ex); + } + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/LoaderPersistance.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/LoaderPersistance.java new file mode 100644 index 0000000..aaf180f --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/LoaderPersistance.java @@ -0,0 +1,11 @@ +package fr.uca.iut.clfreville2.tp1.persistance; + +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +/** + * Quelque chose capable de lire des données depuis quelque part et de les référencer dans un répertoire. + */ +public interface LoaderPersistance { + + void lire(Repertoire repertoire); +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/NoopWriterPersistance.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/NoopWriterPersistance.java new file mode 100644 index 0000000..d945d41 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/NoopWriterPersistance.java @@ -0,0 +1,11 @@ +package fr.uca.iut.clfreville2.tp1.persistance; + +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +@SuppressWarnings("unused") // oui, mieux vaut ne pas l'utiliser de toute façon +public class NoopWriterPersistance implements WriterPersistance { + @Override + public void ecrire(Repertoire repertoire) { + // noop + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/Persistance.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/Persistance.java new file mode 100644 index 0000000..66e77f9 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/Persistance.java @@ -0,0 +1,7 @@ +package fr.uca.iut.clfreville2.tp1.persistance; + +/** + * Un groupe de persistance pouvant être à la fois chargée et sauvegardée. + */ +public interface Persistance extends LoaderPersistance, WriterPersistance { +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/StubLoaderPersistance.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/StubLoaderPersistance.java new file mode 100644 index 0000000..5cc5d9d --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/StubLoaderPersistance.java @@ -0,0 +1,12 @@ +package fr.uca.iut.clfreville2.tp1.persistance; + +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +public final class StubLoaderPersistance implements LoaderPersistance { + + @Override + public void lire(Repertoire repertoire) { + repertoire.referencerPatient("Truc", "Machin"); + repertoire.referencerPatient("Machin", "Bidule"); + } +} diff --git a/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/WriterPersistance.java b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/WriterPersistance.java new file mode 100644 index 0000000..17beb04 --- /dev/null +++ b/2A/Java/tp/tp1-intro/src/fr/uca/iut/clfreville2/tp1/persistance/WriterPersistance.java @@ -0,0 +1,11 @@ +package fr.uca.iut.clfreville2.tp1.persistance; + +import fr.uca.iut.clfreville2.tp1.model.Repertoire; + +/** + * Quelque chose capable d'écrire quelque part un répertoire de patients. + */ +public interface WriterPersistance { + + void ecrire(Repertoire repertoire); +} diff --git a/2A/Java/tp/tp1-intro/tp1-intro.iml b/2A/Java/tp/tp1-intro/tp1-intro.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/2A/Java/tp/tp1-intro/tp1-intro.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp2-zoo/.idea/.gitignore b/2A/Java/tp/tp2-zoo/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/2A/Java/tp/tp2-zoo/.idea/misc.xml b/2A/Java/tp/tp2-zoo/.idea/misc.xml new file mode 100644 index 0000000..a346fd7 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp2-zoo/.idea/modules.xml b/2A/Java/tp/tp2-zoo/.idea/modules.xml new file mode 100644 index 0000000..cce7859 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp2-zoo/.idea/uiDesigner.xml b/2A/Java/tp/tp2-zoo/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp2-zoo/animalerie.txt b/2A/Java/tp/tp2-zoo/animalerie.txt new file mode 100644 index 0000000..e716a30 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/animalerie.txt @@ -0,0 +1 @@ +ours bidule 9 oiseau machin SUD 5 --end-- \ No newline at end of file diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/Main.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/Main.class new file mode 100644 index 0000000..9fea7da Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/Main.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/CommandLineInterface.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/CommandLineInterface.class new file mode 100644 index 0000000..6fff573 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/CommandLineInterface.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/AjouterCommande.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/AjouterCommande.class new file mode 100644 index 0000000..1f39de0 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/AjouterCommande.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry$Builder.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry$Builder.class new file mode 100644 index 0000000..4da6a07 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry$Builder.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry.class new file mode 100644 index 0000000..b3b3057 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/Commande.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/Commande.class new file mode 100644 index 0000000..72cb4c2 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/Commande.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl$ThisBuilder.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl$ThisBuilder.class new file mode 100644 index 0000000..62c1135 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl$ThisBuilder.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl.class new file mode 100644 index 0000000..ee0145c Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/ListerCommande.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/ListerCommande.class new file mode 100644 index 0000000..c750812 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/ListerCommande.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/PasserCommande.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/PasserCommande.class new file mode 100644 index 0000000..f00610e Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/cli/cmd/PasserCommande.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory$AnimalSupplier.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory$AnimalSupplier.class new file mode 100644 index 0000000..de76000 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory$AnimalSupplier.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory$Builder.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory$Builder.class new file mode 100644 index 0000000..cd93953 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory$Builder.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory.class new file mode 100644 index 0000000..5b7a880 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl$ThisBuilder.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl$ThisBuilder.class new file mode 100644 index 0000000..d02ead7 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl$ThisBuilder.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl.class new file mode 100644 index 0000000..e9846a1 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/Afficheur.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/Afficheur.class new file mode 100644 index 0000000..22ac1b0 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/Afficheur.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/AfficheurConsole.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/AfficheurConsole.class new file mode 100644 index 0000000..c862188 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/AfficheurConsole.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/AnimalFromUserInputFactory.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/AnimalFromUserInputFactory.class new file mode 100644 index 0000000..d7b456b Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/AnimalFromUserInputFactory.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/NoopAfficheur.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/NoopAfficheur.class new file mode 100644 index 0000000..5cfdc97 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/NoopAfficheur.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/Saisisseur.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/Saisisseur.class new file mode 100644 index 0000000..a7772e6 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/Saisisseur.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/SaisisseurConsole.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/SaisisseurConsole.class new file mode 100644 index 0000000..7c22e42 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/io/SaisisseurConsole.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Animalerie.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Animalerie.class new file mode 100644 index 0000000..eb03b22 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Animalerie.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Climat.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Climat.class new file mode 100644 index 0000000..f285d54 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Climat.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/EtreVivant.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/EtreVivant.class new file mode 100644 index 0000000..ea00165 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/EtreVivant.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Lieu.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Lieu.class new file mode 100644 index 0000000..025e7d8 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/Lieu.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/CapaciteMotrices.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/CapaciteMotrices.class new file mode 100644 index 0000000..e2f9703 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/CapaciteMotrices.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/Hibernateur.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/Hibernateur.class new file mode 100644 index 0000000..e4fcbea Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/Hibernateur.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/Migrateur.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/Migrateur.class new file mode 100644 index 0000000..ec95cb4 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/Migrateur.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/SubitClimat.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/SubitClimat.class new file mode 100644 index 0000000..b5df87a Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/comportement/SubitClimat.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Animal.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Animal.class new file mode 100644 index 0000000..6bbcca1 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Animal.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Oiseau.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Oiseau.class new file mode 100644 index 0000000..13aaa23 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Oiseau.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Ours.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Ours.class new file mode 100644 index 0000000..20c7c29 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/modele/impl/Ours.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/FileReaderPersistance.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/FileReaderPersistance.class new file mode 100644 index 0000000..3b25fe5 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/FileReaderPersistance.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/FileWriterPersistance.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/FileWriterPersistance.class new file mode 100644 index 0000000..1e63e2e Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/FileWriterPersistance.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/ReadPersistance.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/ReadPersistance.class new file mode 100644 index 0000000..4b1a222 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/ReadPersistance.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/StubReadPersistance.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/StubReadPersistance.class new file mode 100644 index 0000000..f8495d0 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/StubReadPersistance.class differ diff --git a/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/WritePersistance.class b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/WritePersistance.class new file mode 100644 index 0000000..d3675d1 Binary files /dev/null and b/2A/Java/tp/tp2-zoo/out/production/tp2-zoo/fr/uca/iut/clfreville2/tp2/persistance/WritePersistance.class differ diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/Main.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/Main.java new file mode 100644 index 0000000..0d27a1a --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/Main.java @@ -0,0 +1,17 @@ +package fr.uca.iut.clfreville2.tp2; + +import fr.uca.iut.clfreville2.tp2.cli.CommandLineInterface; +import fr.uca.iut.clfreville2.tp2.io.*; +import fr.uca.iut.clfreville2.tp2.persistance.FileReaderPersistance; +import fr.uca.iut.clfreville2.tp2.persistance.FileWriterPersistance; + +public final class Main { + + private Main() {} + + public static void main(String[] args) { + Afficheur afficheur = new AfficheurConsole(); + Saisisseur saisisseur = new SaisisseurConsole(); + new CommandLineInterface(afficheur, saisisseur, CommandLineInterface.commandes(), AnimalFromUserInputFactory.create(), new FileReaderPersistance(), new FileWriterPersistance()).executer(); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/CommandLineInterface.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/CommandLineInterface.java new file mode 100644 index 0000000..57120d9 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/CommandLineInterface.java @@ -0,0 +1,89 @@ +package fr.uca.iut.clfreville2.tp2.cli; + +import fr.uca.iut.clfreville2.tp2.cli.cmd.AjouterCommande; +import fr.uca.iut.clfreville2.tp2.cli.cmd.CommandRegistry; +import fr.uca.iut.clfreville2.tp2.cli.cmd.ListerCommande; +import fr.uca.iut.clfreville2.tp2.cli.cmd.PasserCommande; +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.io.Afficheur; +import fr.uca.iut.clfreville2.tp2.io.Saisisseur; +import fr.uca.iut.clfreville2.tp2.modele.Animalerie; +import fr.uca.iut.clfreville2.tp2.persistance.ReadPersistance; +import fr.uca.iut.clfreville2.tp2.persistance.WritePersistance; + +/** + * Une interface en ligne de commande. + */ +public final class CommandLineInterface { + + private final Afficheur afficheur; + private final Saisisseur saisisseur; + private final CommandRegistry commandes; + private final Animalerie animalerie; + private final AnimalFactory animalFactory; + private final ReadPersistance readPersistance; + private final WritePersistance writePersistance; + private boolean quitter; + + public CommandLineInterface(Afficheur afficheur, Saisisseur saisisseur, CommandRegistry commandes, AnimalFactory animalFactory, ReadPersistance readPersistance, WritePersistance writePersistance) { + this.afficheur = afficheur; + this.saisisseur = saisisseur; + this.commandes = commandes; + this.animalerie = new Animalerie(); + this.animalFactory = animalFactory; + this.readPersistance = readPersistance; + this.writePersistance = writePersistance; + } + + /** + * Réalise la boucle principale de l'application. + */ + public void executer() { + readPersistance.lire(animalerie, animalFactory); + while (!quitter) { + commandes.rechercher(saisisseur.lireMot()) + .ifPresentOrElse( + cmd -> cmd.run(this), + () -> afficheur.afficherErreur("Action invalide") + ); + } + writePersistance.ecrire(animalerie, animalFactory); + } + + public Animalerie getAnimalerie() { + return animalerie; + } + + public Afficheur getAfficheur() { + return afficheur; + } + + public Saisisseur getSaisisseur() { + return saisisseur; + } + + public AnimalFactory getAnimalFactory() { + return animalFactory; + } + + /** + * Prépare l'arrêt de l'application. + */ + public void stopper() { + quitter = true; + } + + /** + * Créé le registre des commandes. + * + * @return Un registre complété avec des actions courantes. + */ + public static CommandRegistry commandes() { + CommandRegistry.Builder builder = CommandRegistry.builder(); + builder.enregistrer("quitter", CommandLineInterface::stopper); + builder.enregistrer(ListerCommande.NOM, new ListerCommande()); + builder.enregistrer(AjouterCommande.NOM, new AjouterCommande()); + builder.enregistrer(PasserCommande.NOM, new PasserCommande()); + return builder.construire(); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/AjouterCommande.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/AjouterCommande.java new file mode 100644 index 0000000..bb355f1 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/AjouterCommande.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.tp2.cli.cmd; + +import fr.uca.iut.clfreville2.tp2.cli.CommandLineInterface; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; + +public class AjouterCommande implements Commande { + + public static final String NOM = "ajouter"; + + @Override + public void run(CommandLineInterface cli) { + cli.getAfficheur().afficher("Quel genre d'animal ?"); + String genre = cli.getSaisisseur().lireMot(); + cli.getAfficheur().afficher("Quel est son nom ?"); + Animal animal = cli.getAnimalFactory().creer(genre, cli.getSaisisseur().lireMot(), cli.getAfficheur(), cli.getSaisisseur()); + cli.getAnimalerie().ajouter(animal); + cli.getAfficheur().afficher("Animal rajouté !"); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry.java new file mode 100644 index 0000000..b3493b6 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandRegistry.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.tp2.cli.cmd; + +import java.util.Optional; + +public interface CommandRegistry { + + Optional rechercher(String nom); + + static Builder builder() { + return new CommandeRegistryImpl.ThisBuilder(); + } + + interface Builder { + + void enregistrer(String nom, Commande commande); + + CommandRegistry construire(); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/Commande.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/Commande.java new file mode 100644 index 0000000..e60f884 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/Commande.java @@ -0,0 +1,17 @@ +package fr.uca.iut.clfreville2.tp2.cli.cmd; + +import fr.uca.iut.clfreville2.tp2.cli.CommandLineInterface; + +/** + * Une action réalisable depuis l'interface en ligne de commande. + */ +@FunctionalInterface +public interface Commande { + + /** + * Exécute l'action dans le contexte de la ligne de commande. + * + * @param cli Contexte d'exécution. + */ + void run(CommandLineInterface cli); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl.java new file mode 100644 index 0000000..7e57a84 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/CommandeRegistryImpl.java @@ -0,0 +1,34 @@ +package fr.uca.iut.clfreville2.tp2.cli.cmd; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; + +class CommandeRegistryImpl implements CommandRegistry { + + private final Map commandes; + + private CommandeRegistryImpl(Map commandes) { + this.commandes = commandes; + } + + @Override + public Optional rechercher(String nom) { + return Optional.ofNullable(commandes.get(nom)); + } + + static class ThisBuilder implements Builder { + + private final Map commandes = new HashMap<>(); + + @Override + public void enregistrer(String nom, Commande commande) { + commandes.put(nom, commande); + } + + @Override + public CommandRegistry construire() { + return new CommandeRegistryImpl(commandes); + } + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/ListerCommande.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/ListerCommande.java new file mode 100644 index 0000000..a219c5d --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/ListerCommande.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.tp2.cli.cmd; + +import fr.uca.iut.clfreville2.tp2.cli.CommandLineInterface; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; + +public class ListerCommande implements Commande { + + public static final String NOM = "lister"; + + @Override + public void run(CommandLineInterface cli) { + if (cli.getAnimalerie().estVide()) { + cli.getAfficheur().afficher("Aucun animal"); + } + for (Animal animal : cli.getAnimalerie()) { + cli.getAfficheur().afficher(animal.getPresentation()); + } + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/PasserCommande.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/PasserCommande.java new file mode 100644 index 0000000..4b74c26 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/cli/cmd/PasserCommande.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.tp2.cli.cmd; + +import fr.uca.iut.clfreville2.tp2.cli.CommandLineInterface; +import fr.uca.iut.clfreville2.tp2.modele.Climat; + +import java.util.Arrays; +import java.util.stream.Collectors; + +public class PasserCommande implements Commande { + + public static final String NOM = "passer"; + + @Override + public void run(CommandLineInterface cli) { + cli.getAfficheur().afficher("Quelle saison climatique (" + Arrays.stream(Climat.values()).map(Climat::name).collect(Collectors.joining("/")) + ") ?"); + Climat climat = cli.getSaisisseur().lireClimat(); + cli.getAnimalerie().passer(climat); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory.java new file mode 100644 index 0000000..a560f7e --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/factory/AnimalFactory.java @@ -0,0 +1,84 @@ +package fr.uca.iut.clfreville2.tp2.factory; + +import fr.uca.iut.clfreville2.tp2.io.Afficheur; +import fr.uca.iut.clfreville2.tp2.io.Saisisseur; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; + +/** + * Construit un animal d'après son genre. + * + * @implNote Implémentation principale {@link AnimalFactoryImpl}. + */ +public interface AnimalFactory { + + /** + * Construit un animal d'après son genre et son nom. + *

+ * La factory peut éventuellement utiliser un afficheur et un saisisseur, voir les détails d'implémentations si nécessaire. + * + * @throws IllegalArgumentException Si le genre est inconnu. + */ + Animal creer(String genre, String nom, Afficheur afficheur, Saisisseur saisisseur); + + /** + * Associe à un animal son genre, utilisable pour créer une nouvelle instance du même type. + * + * @param animal L'animal pour lequel rechercher le genre. + * @return Le type de l'animal. + * @throws IllegalArgumentException Si le genre est inconnu. + */ + String trouverGenre(Animal animal); + + /** + * Créé un concepteur vide pour cette factory. + * + * @return Un concepteur vide. + */ + static AnimalFactory.Builder builder() { + return new AnimalFactoryImpl.ThisBuilder(); + } + + /** + * Un concepteur de {@link AnimalFactory}. + *

+ * Une factory est d'abord construite pour un certain nombre d'animaux et est ensuite figée. + */ + interface Builder { + + /** + * Enregistre une façon d'obtenir un animal d'un certain type d'après un genre. + * + * @param genre Le genre (s'il existe déjà, alors la précédente valeur est remplacée). + * @param animalSupplier Le moyen d'obtenir cet animal. + * @param animalType Le type qui sera instancié de l'animal. + * @param Le type de l'animal. + */ + void enregistrer(String genre, AnimalSupplier animalSupplier, Class animalType); + + /** + * Fige le concepteur et créé la factory. + * + * @return Une nouvelle factory. + */ + AnimalFactory construire(); + } + + /** + * Un moyen d'obtenir un animal. + * + * @param Le type final (donc celui qui sera instancié) de l'animal. + */ + @FunctionalInterface + interface AnimalSupplier { + + /** + * Créé l'animal. + * + * @param nom Le nom à attribuer à cet animal. + * @param afficheur L'afficheur à potentiellement utiliser. + * @param saisisseur Le saisisseur à potentiellement utiliser. + * @return Un nouvel animal. + */ + T create(String nom, Afficheur afficheur, Saisisseur saisisseur); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl.java new file mode 100644 index 0000000..7fabe14 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/factory/AnimalFactoryImpl.java @@ -0,0 +1,52 @@ +package fr.uca.iut.clfreville2.tp2.factory; + +import fr.uca.iut.clfreville2.tp2.io.Afficheur; +import fr.uca.iut.clfreville2.tp2.io.Saisisseur; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; + +import java.util.HashMap; +import java.util.Map; + +class AnimalFactoryImpl implements AnimalFactory { + + private final Map> createur; + private final Map, String> decomposeur; + + private AnimalFactoryImpl(Map> createur, Map, String> decomposeur) { + this.createur = new HashMap<>(createur); + this.decomposeur = new HashMap<>(decomposeur); + } + + @Override + public Animal creer(String genre, String nom, Afficheur afficheur, Saisisseur saisisseur) { + return createur.getOrDefault(genre, (a, b, c) -> { + throw new IllegalArgumentException("Genre d'animal inconnu"); + }).create(nom, afficheur, saisisseur); + } + + @Override + public String trouverGenre(Animal animal) { + String name = decomposeur.get(animal.getClass()); + if (name == null) { + throw new IllegalArgumentException("Genre d'animal inconnu"); + } + return name; + } + + static class ThisBuilder implements AnimalFactory.Builder { + + private final Map> createur = new HashMap<>(); + private final Map, String> decomposeur = new HashMap<>(); + + @Override + public void enregistrer(String genre, AnimalSupplier animalSupplier, Class animalType) { + createur.put(genre, animalSupplier); + decomposeur.put(animalType, genre); + } + + @Override + public AnimalFactory construire() { + return new AnimalFactoryImpl(createur, decomposeur); + } + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/Afficheur.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/Afficheur.java new file mode 100644 index 0000000..e7452d1 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/Afficheur.java @@ -0,0 +1,11 @@ +package fr.uca.iut.clfreville2.tp2.io; + +/** + * Quelque chose qui permet de présenter des informations à l'utilisateur. + */ +public interface Afficheur { + + void afficher(String message); + + void afficherErreur(String message); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/AfficheurConsole.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/AfficheurConsole.java new file mode 100644 index 0000000..13582dd --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/AfficheurConsole.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.tp2.io; + +import java.io.PrintStream; + +public class AfficheurConsole implements Afficheur { + + private final PrintStream fluxStandard = System.out; + private final PrintStream fluxErreur = System.err; + + @Override + public void afficher(String message) { + fluxStandard.println(message); + } + + @Override + public void afficherErreur(String message) { + fluxErreur.println(message); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/AnimalFromUserInputFactory.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/AnimalFromUserInputFactory.java new file mode 100644 index 0000000..aefcee9 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/AnimalFromUserInputFactory.java @@ -0,0 +1,29 @@ +package fr.uca.iut.clfreville2.tp2.io; + +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.modele.Lieu; +import fr.uca.iut.clfreville2.tp2.modele.impl.Oiseau; +import fr.uca.iut.clfreville2.tp2.modele.impl.Ours; + +/** + * Fournit une pré-selection d'animaux pour créer une {@link AnimalFactory}. + */ +public final class AnimalFromUserInputFactory { + + private AnimalFromUserInputFactory() {} + + public static AnimalFactory create() { + AnimalFactory.Builder builder = AnimalFactory.builder(); + builder.enregistrer("ours", (nom, afficheur, saisisseur) -> { + afficheur.afficher("Combien de poils ?"); + return new Ours(nom, saisisseur.lireInt()); + }, Ours.class); + builder.enregistrer("oiseau", (nom, afficheur, saisisseur) -> { + afficheur.afficher("Quel lieu actuel ?"); + Lieu lieu = saisisseur.lireLieu(); + afficheur.afficher("Combien de plumes ?"); + return new Oiseau(nom, lieu, saisisseur.lireInt()); + }, Oiseau.class); + return builder.construire(); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/NoopAfficheur.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/NoopAfficheur.java new file mode 100644 index 0000000..274baa1 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/NoopAfficheur.java @@ -0,0 +1,13 @@ +package fr.uca.iut.clfreville2.tp2.io; + +public class NoopAfficheur implements Afficheur { + @Override + public void afficher(String message) { + + } + + @Override + public void afficherErreur(String message) { + + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/Saisisseur.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/Saisisseur.java new file mode 100644 index 0000000..39366f5 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/Saisisseur.java @@ -0,0 +1,18 @@ +package fr.uca.iut.clfreville2.tp2.io; + +import fr.uca.iut.clfreville2.tp2.modele.Climat; +import fr.uca.iut.clfreville2.tp2.modele.Lieu; + +/** + * Quelque chose qui permet de récupérer des informations. + */ +public interface Saisisseur { + + String lireMot(); + + int lireInt(); + + Climat lireClimat(); + + Lieu lireLieu(); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/SaisisseurConsole.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/SaisisseurConsole.java new file mode 100644 index 0000000..1bed5d1 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/io/SaisisseurConsole.java @@ -0,0 +1,44 @@ +package fr.uca.iut.clfreville2.tp2.io; + +import fr.uca.iut.clfreville2.tp2.modele.Climat; +import fr.uca.iut.clfreville2.tp2.modele.Lieu; + +import java.io.Reader; +import java.util.Scanner; + +public class SaisisseurConsole implements Saisisseur { + + private final Scanner scanner; + + public SaisisseurConsole(Reader reader) { + scanner = new Scanner(reader); + } + + public SaisisseurConsole() { + this.scanner = new Scanner(System.in); + } + + @Override + public String lireMot() { + return scanner.next(); + } + + @Override + public int lireInt() { + return scanner.nextInt(); + } + + @Override + public Climat lireClimat() { + return lireEnum(Climat.class); + } + + @Override + public Lieu lireLieu() { + return lireEnum(Lieu.class); + } + + private > E lireEnum(Class enumClass) { + return Enum.valueOf(enumClass, lireMot()); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Animalerie.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Animalerie.java new file mode 100644 index 0000000..878a506 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Animalerie.java @@ -0,0 +1,36 @@ +package fr.uca.iut.clfreville2.tp2.modele; + +import fr.uca.iut.clfreville2.tp2.modele.comportement.SubitClimat; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +public class Animalerie implements SubitClimat, Iterable { + + private final List animaux = new ArrayList<>(); + + public List getAnimaux() { + return Collections.unmodifiableList(animaux); + } + + public void ajouter(Animal animal) { + animaux.add(animal); + } + + public boolean estVide() { + return animaux.isEmpty(); + } + + @Override + public void passer(Climat climat) { + animaux.forEach(a -> a.passer(climat)); + } + + @Override + public Iterator iterator() { + return getAnimaux().iterator(); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Climat.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Climat.java new file mode 100644 index 0000000..b0266f3 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Climat.java @@ -0,0 +1,9 @@ +package fr.uca.iut.clfreville2.tp2.modele; + +public enum Climat { + + ETE, + AUTOMNE, + HIVER, + PRINTEMPS +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/EtreVivant.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/EtreVivant.java new file mode 100644 index 0000000..c8fba2f --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/EtreVivant.java @@ -0,0 +1,8 @@ +package fr.uca.iut.clfreville2.tp2.modele; + +import fr.uca.iut.clfreville2.tp2.modele.comportement.SubitClimat; + +public interface EtreVivant extends SubitClimat { + + String getPresentation(); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Lieu.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Lieu.java new file mode 100644 index 0000000..481b83d --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/Lieu.java @@ -0,0 +1,7 @@ +package fr.uca.iut.clfreville2.tp2.modele; + +public enum Lieu { + + NORD, + SUD +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/CapaciteMotrices.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/CapaciteMotrices.java new file mode 100644 index 0000000..f640efe --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/CapaciteMotrices.java @@ -0,0 +1,8 @@ +package fr.uca.iut.clfreville2.tp2.modele.comportement; + +import fr.uca.iut.clfreville2.tp2.modele.Lieu; + +public interface CapaciteMotrices { + + void setLieu(Lieu lieu); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/Hibernateur.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/Hibernateur.java new file mode 100644 index 0000000..dfef44b --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/Hibernateur.java @@ -0,0 +1,22 @@ +package fr.uca.iut.clfreville2.tp2.modele.comportement; + +import fr.uca.iut.clfreville2.tp2.modele.Climat; + +/** + * Ce qui hiberne pour s'adapter au changement de climat. + */ +public interface Hibernateur extends SubitClimat { + + @Override + default void passer(Climat climat) { + if (climat == Climat.HIVER) { + hiberner(); + } else { + reveiller(); + } + } + + void hiberner(); + + void reveiller(); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/Migrateur.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/Migrateur.java new file mode 100644 index 0000000..dc1694b --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/Migrateur.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.tp2.modele.comportement; + +import fr.uca.iut.clfreville2.tp2.modele.Climat; +import fr.uca.iut.clfreville2.tp2.modele.Lieu; + +/** + * Ce qui migre pour s'adapter au changement de climat. + */ +public interface Migrateur extends CapaciteMotrices, SubitClimat { + + @Override + default void passer(Climat climat) { + if (climat == Climat.AUTOMNE || climat == Climat.HIVER) { + setLieu(Lieu.SUD); + } else { + setLieu(Lieu.NORD); + } + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/SubitClimat.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/SubitClimat.java new file mode 100644 index 0000000..9705d33 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/comportement/SubitClimat.java @@ -0,0 +1,8 @@ +package fr.uca.iut.clfreville2.tp2.modele.comportement; + +import fr.uca.iut.clfreville2.tp2.modele.Climat; + +public interface SubitClimat { + + void passer(Climat climat); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Animal.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Animal.java new file mode 100644 index 0000000..b6d9789 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Animal.java @@ -0,0 +1,34 @@ +package fr.uca.iut.clfreville2.tp2.modele.impl; + +import fr.uca.iut.clfreville2.tp2.modele.EtreVivant; +import fr.uca.iut.clfreville2.tp2.modele.Lieu; +import fr.uca.iut.clfreville2.tp2.modele.comportement.CapaciteMotrices; + +/** + * Une base d'animal. + *

+ * La classe est scellée pour prévenir de tout héritage supplémentaire. + */ +public sealed abstract class Animal implements EtreVivant, CapaciteMotrices permits Oiseau, Ours { + + private final String nom; + private Lieu lieu; + + public Animal(String nom, Lieu lieu) { + this.nom = nom; + this.lieu = lieu; + } + + public String getNom() { + return nom; + } + + public Lieu getLieu() { + return lieu; + } + + @Override + public void setLieu(Lieu lieu) { + this.lieu = lieu; + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Oiseau.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Oiseau.java new file mode 100644 index 0000000..fe6171c --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Oiseau.java @@ -0,0 +1,23 @@ +package fr.uca.iut.clfreville2.tp2.modele.impl; + +import fr.uca.iut.clfreville2.tp2.modele.Lieu; +import fr.uca.iut.clfreville2.tp2.modele.comportement.Migrateur; + +public final class Oiseau extends Animal implements Migrateur { + + private final int nbPlumes; + + public Oiseau(String nom, Lieu lieu, int nbPlumes) { + super(nom, lieu); + this.nbPlumes = nbPlumes; + } + + public int getNbPlumes() { + return nbPlumes; + } + + @Override + public String getPresentation() { + return getNom() + " vole dans la région du " + getLieu().name() + " avec " + nbPlumes + " plumes"; + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Ours.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Ours.java new file mode 100644 index 0000000..79bfa73 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/modele/impl/Ours.java @@ -0,0 +1,34 @@ +package fr.uca.iut.clfreville2.tp2.modele.impl; + +import fr.uca.iut.clfreville2.tp2.modele.Lieu; +import fr.uca.iut.clfreville2.tp2.modele.comportement.Hibernateur; + +public final class Ours extends Animal implements Hibernateur { + + private final int nbPoils; + private boolean hiberne; + + public Ours(String nom, int nbPoils) { + super(nom, Lieu.NORD); + this.nbPoils = nbPoils; + } + + @Override + public String getPresentation() { + return getNom() + (hiberne ? " hiberne " : " pêche ") + "et a " + nbPoils + " poils."; + } + + public int getNbPoils() { + return nbPoils; + } + + @Override + public void hiberner() { + this.hiberne = true; + } + + @Override + public void reveiller() { + this.hiberne = false; + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/FileReaderPersistance.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/FileReaderPersistance.java new file mode 100644 index 0000000..4a82385 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/FileReaderPersistance.java @@ -0,0 +1,46 @@ +package fr.uca.iut.clfreville2.tp2.persistance; + +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.io.Afficheur; +import fr.uca.iut.clfreville2.tp2.io.NoopAfficheur; +import fr.uca.iut.clfreville2.tp2.io.Saisisseur; +import fr.uca.iut.clfreville2.tp2.io.SaisisseurConsole; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; +import fr.uca.iut.clfreville2.tp2.modele.Animalerie; + +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; + +public class FileReaderPersistance implements ReadPersistance { + + private final String filename; + + public FileReaderPersistance(String filename) { + this.filename = filename; + } + + public FileReaderPersistance() { + this("animalerie.txt"); + } + + @Override + public void lire(Animalerie animalerie, AnimalFactory factory) { + try (Reader reader = new FileReader(filename)) { + // Plutôt que d'implémenter une nouvelle factory pour créer les animaux, + // je réutilise la factory existante en masquant tous les messages affichés. + Afficheur afficheur = new NoopAfficheur(); + Saisisseur saisisseur = new SaisisseurConsole(reader); + String genre; + while (!(genre = saisisseur.lireMot()).equals("--end--")) { + String nom = saisisseur.lireMot(); + Animal animal = factory.creer(genre, nom, afficheur, saisisseur); + animalerie.ajouter(animal); + } + } catch (FileNotFoundException ignored) { + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/FileWriterPersistance.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/FileWriterPersistance.java new file mode 100644 index 0000000..ec4d64e --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/FileWriterPersistance.java @@ -0,0 +1,57 @@ +package fr.uca.iut.clfreville2.tp2.persistance; + +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.modele.impl.Animal; +import fr.uca.iut.clfreville2.tp2.modele.Animalerie; +import fr.uca.iut.clfreville2.tp2.modele.impl.Oiseau; +import fr.uca.iut.clfreville2.tp2.modele.impl.Ours; + +import java.io.FileWriter; +import java.io.IOException; +import java.io.Writer; + +/** + * Une persistance écrivant dans un fichier. + */ +public class FileWriterPersistance implements WritePersistance { + + private final String filename; + + public FileWriterPersistance(String filename) { + this.filename = filename; + } + + public FileWriterPersistance() { + this("animalerie.txt"); + } + + @Override + public void ecrire(Animalerie animalerie, AnimalFactory factory) { + try (Writer writer = new FileWriter(filename)) { + for (Animal animal : animalerie) { + // Écrit l'information du type instancié de l'animal + writer.write(factory.trouverGenre(animal)); + writer.write(' '); + + // Écrit les informations généralistes de l'animal + writer.write(animal.getNom()); + writer.write(' '); + + // Pour écrire les informations spécifiques à un animal, il va falloir instanceof pour récupérer le type instancié + // Plutôt qu'un enchaînement de conditions, j'utilise ici la feature preview Java 17 du pattern matching pour les switch + switch (animal) { + case Oiseau oiseau -> { + writer.write(oiseau.getLieu().name()); + writer.write(' '); + writer.write(Integer.toString(oiseau.getNbPlumes())); + } + case Ours ours -> writer.write(Integer.toString(ours.getNbPoils())); + } + writer.write(' '); + } + writer.write("--end--"); + } catch (IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/ReadPersistance.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/ReadPersistance.java new file mode 100644 index 0000000..2c2e3ea --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/ReadPersistance.java @@ -0,0 +1,12 @@ +package fr.uca.iut.clfreville2.tp2.persistance; + +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.modele.Animalerie; + +/** + * Quelque chose qui permet de lire des données persistées. + */ +public interface ReadPersistance { + + void lire(Animalerie animalerie, AnimalFactory factory); +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/StubReadPersistance.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/StubReadPersistance.java new file mode 100644 index 0000000..a7327f4 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/StubReadPersistance.java @@ -0,0 +1,14 @@ +package fr.uca.iut.clfreville2.tp2.persistance; + +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.modele.Animalerie; +import fr.uca.iut.clfreville2.tp2.modele.Lieu; +import fr.uca.iut.clfreville2.tp2.modele.impl.Oiseau; + +public class StubReadPersistance implements ReadPersistance { + @Override + public void lire(Animalerie animalerie, AnimalFactory factory) { + animalerie.ajouter(new Oiseau("pivert", Lieu.NORD, 5)); + animalerie.ajouter(new Oiseau("colibri", Lieu.NORD, 4)); + } +} diff --git a/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/WritePersistance.java b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/WritePersistance.java new file mode 100644 index 0000000..6af97b0 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/src/fr/uca/iut/clfreville2/tp2/persistance/WritePersistance.java @@ -0,0 +1,12 @@ +package fr.uca.iut.clfreville2.tp2.persistance; + +import fr.uca.iut.clfreville2.tp2.factory.AnimalFactory; +import fr.uca.iut.clfreville2.tp2.modele.Animalerie; + +/** + * Quelque chose qui permet d'écrire une animalerie pour la persister. + */ +public interface WritePersistance { + + void ecrire(Animalerie animalerie, AnimalFactory factory); +} diff --git a/2A/Java/tp/tp2-zoo/tp2-zoo.iml b/2A/Java/tp/tp2-zoo/tp2-zoo.iml new file mode 100644 index 0000000..8cb7438 --- /dev/null +++ b/2A/Java/tp/tp2-zoo/tp2-zoo.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp3-vehicules/.idea/.gitignore b/2A/Java/tp/tp3-vehicules/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/2A/Java/tp/tp3-vehicules/.idea/misc.xml b/2A/Java/tp/tp3-vehicules/.idea/misc.xml new file mode 100644 index 0000000..a346fd7 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp3-vehicules/.idea/modules.xml b/2A/Java/tp/tp3-vehicules/.idea/modules.xml new file mode 100644 index 0000000..38d3733 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp3-vehicules/.idea/uiDesigner.xml b/2A/Java/tp/tp3-vehicules/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp3-vehicules/garage.bin b/2A/Java/tp/tp3-vehicules/garage.bin new file mode 100644 index 0000000..294a6e2 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/garage.bin differ diff --git a/2A/Java/tp/tp3-vehicules/garage.txt b/2A/Java/tp/tp3-vehicules/garage.txt new file mode 100644 index 0000000..725d0e7 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/garage.txt @@ -0,0 +1,3 @@ +camion 9 +voiture 4 +camionnette diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/Main.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/Main.class new file mode 100644 index 0000000..2697c38 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/Main.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/cli/CommandLineInterface.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/cli/CommandLineInterface.class new file mode 100644 index 0000000..1c4fadc Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/cli/CommandLineInterface.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactory$Builder.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactory$Builder.class new file mode 100644 index 0000000..dac569f Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactory$Builder.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactory.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactory.class new file mode 100644 index 0000000..4c30049 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactory.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl$ThisBuilder.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl$ThisBuilder.class new file mode 100644 index 0000000..22b645c Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl$ThisBuilder.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl.class new file mode 100644 index 0000000..62a594e Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory$Builder.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory$Builder.class new file mode 100644 index 0000000..805c4b0 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory$Builder.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory$Context.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory$Context.class new file mode 100644 index 0000000..810a0e2 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory$Context.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory.class new file mode 100644 index 0000000..d6f7d74 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl$1.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl$1.class new file mode 100644 index 0000000..4de982d Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl$1.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl$ThisBuilder.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl$ThisBuilder.class new file mode 100644 index 0000000..a59ef4b Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl$ThisBuilder.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl.class new file mode 100644 index 0000000..b379574 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/Afficheur.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/Afficheur.class new file mode 100644 index 0000000..8e36c77 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/Afficheur.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/AfficheurConsole.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/AfficheurConsole.class new file mode 100644 index 0000000..3329895 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/AfficheurConsole.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/NoopAfficheur.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/NoopAfficheur.class new file mode 100644 index 0000000..b700f7d Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/NoopAfficheur.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/Saisisseur.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/Saisisseur.class new file mode 100644 index 0000000..d25accd Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/Saisisseur.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/SaisisseurConsole.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/SaisisseurConsole.class new file mode 100644 index 0000000..901020a Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/io/SaisisseurConsole.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Camion.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Camion.class new file mode 100644 index 0000000..f0018d2 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Camion.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Camionnette.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Camionnette.class new file mode 100644 index 0000000..bfae8ab Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Camionnette.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Garage.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Garage.class new file mode 100644 index 0000000..a0ec7f2 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Garage.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Vehicule.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Vehicule.class new file mode 100644 index 0000000..8f6de82 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Vehicule.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Voiture.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Voiture.class new file mode 100644 index 0000000..f1835fe Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/modele/Voiture.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/BinaryFilePersistance.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/BinaryFilePersistance.class new file mode 100644 index 0000000..4b5de87 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/BinaryFilePersistance.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/ChargeurGarage.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/ChargeurGarage.class new file mode 100644 index 0000000..075edc1 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/ChargeurGarage.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/NoopSauveurGarage.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/NoopSauveurGarage.class new file mode 100644 index 0000000..dae1a65 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/NoopSauveurGarage.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/SauveurGarage.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/SauveurGarage.class new file mode 100644 index 0000000..1dd45ef Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/SauveurGarage.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/StubChargeurGarage.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/StubChargeurGarage.class new file mode 100644 index 0000000..2b8826a Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/StubChargeurGarage.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/TextFileGaragePersistance.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/TextFileGaragePersistance.class new file mode 100644 index 0000000..ed4a345 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/TextFileGaragePersistance.class differ diff --git a/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/TsvFilePersistance.class b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/TsvFilePersistance.class new file mode 100644 index 0000000..f93d033 Binary files /dev/null and b/2A/Java/tp/tp3-vehicules/out/production/tp3-vehicules/fr/uca/iut/clfreville2/tp3/persistance/TsvFilePersistance.class differ diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/Main.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/Main.java new file mode 100644 index 0000000..489cae8 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/Main.java @@ -0,0 +1,71 @@ +package fr.uca.iut.clfreville2.tp3; + +import fr.uca.iut.clfreville2.tp3.cli.CommandLineInterface; +import fr.uca.iut.clfreville2.tp3.factory.ActionFactory; +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.io.Afficheur; +import fr.uca.iut.clfreville2.tp3.io.AfficheurConsole; +import fr.uca.iut.clfreville2.tp3.modele.Camion; +import fr.uca.iut.clfreville2.tp3.modele.Camionnette; +import fr.uca.iut.clfreville2.tp3.modele.Voiture; +import fr.uca.iut.clfreville2.tp3.persistance.*; + +public final class Main { + + public static void main(String[] args) { + Afficheur afficheur = new AfficheurConsole(); + + var chargeurs = chargeurs(); + if (args.length < 2 || args[0].equals("help")) { + afficheur.afficher("Choisissez votre cocktail: "); + afficheur.afficher("Chargeurs disponibles : " + String.join(", ", chargeurs.actions())); // Idem pour les sauveurs, mais le switch est beau + return; + } + + ChargeurGarage chargeur = chargeur(args[0], chargeurs, afficheur); + SauveurGarage sauveur = sauveur(args[1], afficheur); + new CommandLineInterface(chargeur, sauveur, factory()).executer(); + } + + private static ChargeurGarage chargeur(String choix, ActionFactory factory, Afficheur afficheur) { + try { + return factory.create(choix); + } catch (IllegalArgumentException ex) { + afficheur.afficherErreur("Choix inconnu !"); + System.exit(1); + } + return null; + } + + private static SauveurGarage sauveur(String choix, Afficheur afficheur) { + return switch (choix) { + case "noop" -> new NoopSauveurGarage(); + case "texte" -> new TextFileGaragePersistance(); + case "binaire" -> new BinaryFilePersistance(); + case "tsv" -> new TsvFilePersistance(); + default -> { + afficheur.afficherErreur("Choix inconnu !"); + System.exit(1); + yield null; + } + }; + } + + private static VehiculeFactory factory() { + var builder = VehiculeFactory.builder(); + builder.referencer("camion", (ctx) -> new Camion(ctx.getSaisisseur().demanderInt()), Camion.class); + builder.referencer("camionnette", (ctx) -> new Camionnette(), Camionnette.class); + builder.referencer("voiture", (ctx) -> new Voiture(ctx.getSaisisseur().demanderInt()), Voiture.class); + return builder.construire(); + } + + + private static ActionFactory chargeurs() { + ActionFactory.Builder builder = ActionFactory.builder(); + builder.enregistrer("stub", StubChargeurGarage::new); + builder.enregistrer("texte", TextFileGaragePersistance::new); + builder.enregistrer("tsv", TsvFilePersistance::new); + builder.enregistrer("binaire", BinaryFilePersistance::new); + return builder.construire(); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/cli/CommandLineInterface.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/cli/CommandLineInterface.java new file mode 100644 index 0000000..ca1fe1c --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/cli/CommandLineInterface.java @@ -0,0 +1,35 @@ +package fr.uca.iut.clfreville2.tp3.cli; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.modele.Garage; +import fr.uca.iut.clfreville2.tp3.persistance.ChargeurGarage; +import fr.uca.iut.clfreville2.tp3.persistance.SauveurGarage; + +public final class CommandLineInterface { + + private final ChargeurGarage chargeur; + private final SauveurGarage sauveur; + private final VehiculeFactory factory; + + public CommandLineInterface(ChargeurGarage chargeur, SauveurGarage sauveur, VehiculeFactory factory) { + this.chargeur = chargeur; + this.sauveur = sauveur; + this.factory = factory; + } + + public void executer() { + Garage garage = new Garage(); + try { + chargeur.charger(garage, factory); + } catch (java.io.IOException e) { + throw new RuntimeException(e); + } + /*while (true) { + }*/ + try { + sauveur.sauver(garage, factory); + } catch (java.io.IOException e) { + throw new RuntimeException(e); + } + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/ActionFactory.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/ActionFactory.java new file mode 100644 index 0000000..2db8d5e --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/ActionFactory.java @@ -0,0 +1,22 @@ +package fr.uca.iut.clfreville2.tp3.factory; + +import java.util.Set; +import java.util.function.Supplier; + +public interface ActionFactory { + + T create(String type); + + Set actions(); + + static Builder builder() { + return new ActionFactoryImpl.ThisBuilder<>(); + } + + interface Builder { + + void enregistrer(String type, Supplier supplier); + + ActionFactory construire(); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl.java new file mode 100644 index 0000000..8fbf25d --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/ActionFactoryImpl.java @@ -0,0 +1,42 @@ +package fr.uca.iut.clfreville2.tp3.factory; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.Supplier; + +class ActionFactoryImpl implements ActionFactory { + + private final Map> suppliers; + + public ActionFactoryImpl(Map> suppliers) { + this.suppliers = suppliers; + } + + @Override + public T create(String type) { + return suppliers.getOrDefault(type, () -> { + throw new IllegalArgumentException("type inconnu"); + }).get(); + } + + @Override + public Set actions() { + return suppliers.keySet(); + } + + static class ThisBuilder implements Builder { + private final Map> suppliers = new HashMap<>(); + + + @Override + public void enregistrer(String type, Supplier supplier) { + suppliers.put(type, supplier); + } + + @Override + public ActionFactory construire() { + return new ActionFactoryImpl<>(suppliers); + } + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory.java new file mode 100644 index 0000000..131ddb9 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactory.java @@ -0,0 +1,29 @@ +package fr.uca.iut.clfreville2.tp3.factory; + +import fr.uca.iut.clfreville2.tp3.io.Afficheur; +import fr.uca.iut.clfreville2.tp3.io.Saisisseur; +import fr.uca.iut.clfreville2.tp3.modele.Vehicule; + +import java.util.function.Function; + +public interface VehiculeFactory { + + String nommer(Vehicule vehicule); + + T creer(String type, Afficheur afficheur, Saisisseur saisisseur); + + static Builder builder() { + return new VehiculeFactoryImpl.ThisBuilder(); + } + + interface Builder { + void referencer(String type, Function supplier, Class vehicule); + + VehiculeFactory construire(); + } + + interface Context { + Afficheur getAfficheur(); + Saisisseur getSaisisseur(); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl.java new file mode 100644 index 0000000..0431a51 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/factory/VehiculeFactoryImpl.java @@ -0,0 +1,70 @@ +package fr.uca.iut.clfreville2.tp3.factory; + +import fr.uca.iut.clfreville2.tp3.io.Afficheur; +import fr.uca.iut.clfreville2.tp3.io.Saisisseur; +import fr.uca.iut.clfreville2.tp3.modele.Vehicule; + +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.function.Function; + +import static java.util.Objects.requireNonNull; + +class VehiculeFactoryImpl implements VehiculeFactory { + + private final Map> registre; + private final Map, String> noms; + + private VehiculeFactoryImpl(Map> registre, Map, String> noms) { + this.registre = registre; + this.noms = noms; + } + + @Override + public String nommer(Vehicule vehicule) { + return requireNonNull(noms.get(vehicule.getClass()), "type de véhicule inconnu au bataillon"); + } + + @SuppressWarnings("unchecked") + @Override + public T creer(String type, Afficheur afficheur, Saisisseur saisisseur) { + Vehicule vehicule = requireNonNull(registre.get(type), "type").apply(new Context() { + @Override + public Afficheur getAfficheur() { + return afficheur; + } + + @Override + public Saisisseur getSaisisseur() { + return saisisseur; + } + }); + return (T) vehicule; + /* if (null instanceof T) { + + } + if (vehicule instanceof T) { // trop beau pour être vrai + return (T) vehicule; + }*/ + //T.class.cast(vehicule); + //throw new IllegalStateException("dommage"); + } + + public static class ThisBuilder implements Builder { + + private final Map> registre = new HashMap<>(); + private final Map, String> noms = new HashMap<>(); + + @Override + public void referencer(String type, Function supplier, Class vehicule) { + registre.put(type, supplier); + noms.put(vehicule, type); + } + + @Override + public VehiculeFactory construire() { + return new VehiculeFactoryImpl(Collections.unmodifiableMap(registre), Collections.unmodifiableMap(noms)); + } + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/Afficheur.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/Afficheur.java new file mode 100644 index 0000000..b0cc4c1 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/Afficheur.java @@ -0,0 +1,8 @@ +package fr.uca.iut.clfreville2.tp3.io; + +public interface Afficheur { + + void afficher(String message); + + void afficherErreur(String message); +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/AfficheurConsole.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/AfficheurConsole.java new file mode 100644 index 0000000..2772668 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/AfficheurConsole.java @@ -0,0 +1,28 @@ +package fr.uca.iut.clfreville2.tp3.io; + +import java.io.PrintStream; + +public class AfficheurConsole implements Afficheur { + + private final PrintStream out; + private final PrintStream err; + + public AfficheurConsole(PrintStream out, PrintStream err) { + this.out = out; + this.err = err; + } + + public AfficheurConsole() { + this(System.out, System.err); + } + + @Override + public void afficher(String message) { + out.println(message); + } + + @Override + public void afficherErreur(String message) { + err.println(message); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/NoopAfficheur.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/NoopAfficheur.java new file mode 100644 index 0000000..dc4cdd7 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/NoopAfficheur.java @@ -0,0 +1,13 @@ +package fr.uca.iut.clfreville2.tp3.io; + +public class NoopAfficheur implements Afficheur { + @Override + public void afficher(String message) { + + } + + @Override + public void afficherErreur(String message) { + + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/Saisisseur.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/Saisisseur.java new file mode 100644 index 0000000..34a7123 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/Saisisseur.java @@ -0,0 +1,8 @@ +package fr.uca.iut.clfreville2.tp3.io; + +public interface Saisisseur { + + String demanderMot(); + + int demanderInt(); +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/SaisisseurConsole.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/SaisisseurConsole.java new file mode 100644 index 0000000..7984042 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/io/SaisisseurConsole.java @@ -0,0 +1,36 @@ +package fr.uca.iut.clfreville2.tp3.io; + +import java.io.InputStream; +import java.io.Reader; +import java.util.Scanner; + +public class SaisisseurConsole implements Saisisseur { + + private final Scanner scanner; + + public SaisisseurConsole(InputStream stream) { + this.scanner = new Scanner(stream); + } + + public SaisisseurConsole(Reader lecteur) { + this.scanner = new Scanner(lecteur); + } + + public SaisisseurConsole(String lecteur) { + this.scanner = new Scanner(lecteur); + } + + public SaisisseurConsole() { + this(System.in); + } + + @Override + public String demanderMot() { + return scanner.next(); + } + + @Override + public int demanderInt() { + return scanner.nextInt(); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Camion.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Camion.java new file mode 100644 index 0000000..ecb9ec8 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Camion.java @@ -0,0 +1,9 @@ +package fr.uca.iut.clfreville2.tp3.modele; + +public record Camion(int capacite) implements Vehicule { + public Camion { + if (capacite < 0) { + throw new IllegalArgumentException("Capacité invalide!"); + } + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Camionnette.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Camionnette.java new file mode 100644 index 0000000..564bde1 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Camionnette.java @@ -0,0 +1,5 @@ +package fr.uca.iut.clfreville2.tp3.modele; + +public record Camionnette() implements Vehicule { + +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Garage.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Garage.java new file mode 100644 index 0000000..ef49b8a --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Garage.java @@ -0,0 +1,25 @@ +package fr.uca.iut.clfreville2.tp3.modele; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; + +public class Garage implements Iterable, Serializable { + + private final List vehicules = new ArrayList<>(); + + public List getVehicules() { + return Collections.unmodifiableList(vehicules); + } + + @Override + public Iterator iterator() { + return getVehicules().iterator(); + } + + public void referencer(Vehicule vehicule) { + vehicules.add(vehicule); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Vehicule.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Vehicule.java new file mode 100644 index 0000000..9266bec --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Vehicule.java @@ -0,0 +1,6 @@ +package fr.uca.iut.clfreville2.tp3.modele; + +import java.io.Serializable; + +public interface Vehicule extends Serializable { +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Voiture.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Voiture.java new file mode 100644 index 0000000..30276e8 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/modele/Voiture.java @@ -0,0 +1,10 @@ +package fr.uca.iut.clfreville2.tp3.modele; + +public record Voiture(int passagers) implements Vehicule { + + public Voiture { + if (passagers < 0) { + throw new IllegalArgumentException("Nombre de passagers invalide!"); + } + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/BinaryFilePersistance.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/BinaryFilePersistance.java new file mode 100644 index 0000000..e9f75f0 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/BinaryFilePersistance.java @@ -0,0 +1,48 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.modele.Garage; + +import java.io.*; +import java.nio.file.Path; + +public class BinaryFilePersistance implements ChargeurGarage, SauveurGarage { + private static final Path CHEMIN_FICHIER_DEFAUT = Path.of("garage.bin"); + + private final Path path; + + public BinaryFilePersistance(Path path) { + this.path = path; + } + + public BinaryFilePersistance() { + this(CHEMIN_FICHIER_DEFAUT); + } + + @Override + public void charger(Garage garage, VehiculeFactory factory) throws IOException { + try (InputStream lecteur = new FileInputStream(path.toFile()); + ObjectInputStream lecteurObjet = new ObjectInputStream(lecteur)) { + Object object = lecteurObjet.readObject(); + if (object instanceof Garage g) { + g.iterator().forEachRemaining(garage::referencer); + } + } catch (FileNotFoundException ignored) { + } catch (ClassNotFoundException ex) { + sneakyThrow(ex); + } + } + + @Override + public void sauver(Garage garage, VehiculeFactory factory) throws IOException { + try (OutputStream sortie = new FileOutputStream(path.toFile()); + ObjectOutputStream sortieObjet = new ObjectOutputStream(sortie)) { + sortieObjet.writeObject(garage); + } catch (FileNotFoundException ignored) { + } + } + + public static void sneakyThrow(Throwable e) throws E { + throw (E) e; + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/ChargeurGarage.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/ChargeurGarage.java new file mode 100644 index 0000000..6d4fa0f --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/ChargeurGarage.java @@ -0,0 +1,12 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.modele.Garage; + +import java.io.IOException; + +@FunctionalInterface +public interface ChargeurGarage { + + void charger(Garage garage, VehiculeFactory factory) throws IOException; +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/NoopSauveurGarage.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/NoopSauveurGarage.java new file mode 100644 index 0000000..84cedf4 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/NoopSauveurGarage.java @@ -0,0 +1,13 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.modele.Garage; + +import java.io.IOException; + +public class NoopSauveurGarage implements SauveurGarage { + @Override + public void sauver(Garage garage, VehiculeFactory factory) throws IOException { + // noop + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/SauveurGarage.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/SauveurGarage.java new file mode 100644 index 0000000..0e8c751 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/SauveurGarage.java @@ -0,0 +1,12 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.modele.Garage; + +import java.io.IOException; + +@FunctionalInterface +public interface SauveurGarage { + + void sauver(Garage garage, VehiculeFactory factory) throws IOException; +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/StubChargeurGarage.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/StubChargeurGarage.java new file mode 100644 index 0000000..fdede3d --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/StubChargeurGarage.java @@ -0,0 +1,18 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.modele.Camion; +import fr.uca.iut.clfreville2.tp3.modele.Camionnette; +import fr.uca.iut.clfreville2.tp3.modele.Garage; +import fr.uca.iut.clfreville2.tp3.modele.Voiture; + +import java.io.IOException; + +public class StubChargeurGarage implements ChargeurGarage { + @Override + public void charger(Garage garage, VehiculeFactory factory) throws IOException { + garage.referencer(new Camion(9)); + garage.referencer(new Voiture(4)); + garage.referencer(new Camionnette()); + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/TextFileGaragePersistance.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/TextFileGaragePersistance.java new file mode 100644 index 0000000..06d8cd9 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/TextFileGaragePersistance.java @@ -0,0 +1,63 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import fr.uca.iut.clfreville2.tp3.factory.VehiculeFactory; +import fr.uca.iut.clfreville2.tp3.io.NoopAfficheur; +import fr.uca.iut.clfreville2.tp3.io.Saisisseur; +import fr.uca.iut.clfreville2.tp3.io.SaisisseurConsole; +import fr.uca.iut.clfreville2.tp3.modele.Camion; +import fr.uca.iut.clfreville2.tp3.modele.Garage; +import fr.uca.iut.clfreville2.tp3.modele.Vehicule; +import fr.uca.iut.clfreville2.tp3.modele.Voiture; + +import java.io.*; +import java.nio.file.Path; + +public class TextFileGaragePersistance implements SauveurGarage, ChargeurGarage { + + private static final Path CHEMIN_FICHIER_DEFAUT = Path.of("garage.txt"); + + private final Path path; + + public TextFileGaragePersistance(Path path) { + this.path = path; + } + + public TextFileGaragePersistance() { + this(CHEMIN_FICHIER_DEFAUT); + } + + @Override + public void charger(Garage garage, VehiculeFactory factory) throws IOException { + try (Reader lecteur = new FileReader(path.toFile()); + BufferedReader lecteurBuf = new BufferedReader(lecteur)) { + String line; + while ((line = lecteurBuf.readLine()) != null) { + Saisisseur saisisseur = new SaisisseurConsole(line); + Vehicule vehicule = factory.creer(saisisseur.demanderMot(), new NoopAfficheur(), saisisseur); + garage.referencer(vehicule); + } + } catch (FileNotFoundException ignored) { + } + } + + @Override + public void sauver(Garage garage, VehiculeFactory factory) throws IOException { + char separateur = getSeparateur(); + try (Writer writer = new FileWriter(path.toFile())) { + for (Vehicule vehicule : garage) { + writer.append(factory.nommer(vehicule)).append(separateur); + switch (vehicule) { + case Camion camion -> writer.append(Integer.toString(camion.capacite())); + case Voiture voiture -> writer.append(Integer.toString(voiture.passagers())); + default -> { /* Je suis un cas potentiellement oublié */ } + } + writer.append('\n'); + } + } catch (FileNotFoundException ignored) { + } + } + + public char getSeparateur() { + return ' '; + } +} diff --git a/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/TsvFilePersistance.java b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/TsvFilePersistance.java new file mode 100644 index 0000000..2188bba --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/src/fr/uca/iut/clfreville2/tp3/persistance/TsvFilePersistance.java @@ -0,0 +1,21 @@ +package fr.uca.iut.clfreville2.tp3.persistance; + +import java.nio.file.Path; + +public class TsvFilePersistance extends TextFileGaragePersistance { + + private static final Path CHEMIN_FICHIER_DEFAUT = Path.of("garage.csv"); + + public TsvFilePersistance(Path path) { + super(path); + } + + public TsvFilePersistance() { + super(CHEMIN_FICHIER_DEFAUT); + } + + @Override + public char getSeparateur() { + return '\t'; + } +} diff --git a/2A/Java/tp/tp3-vehicules/tp3-vehicules.iml b/2A/Java/tp/tp3-vehicules/tp3-vehicules.iml new file mode 100644 index 0000000..8cb7438 --- /dev/null +++ b/2A/Java/tp/tp3-vehicules/tp3-vehicules.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp4-fichier/.idea/.gitignore b/2A/Java/tp/tp4-fichier/.idea/.gitignore new file mode 100644 index 0000000..26d3352 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/.idea/.gitignore @@ -0,0 +1,3 @@ +# Default ignored files +/shelf/ +/workspace.xml diff --git a/2A/Java/tp/tp4-fichier/.idea/misc.xml b/2A/Java/tp/tp4-fichier/.idea/misc.xml new file mode 100644 index 0000000..a346fd7 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/.idea/misc.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp4-fichier/.idea/modules.xml b/2A/Java/tp/tp4-fichier/.idea/modules.xml new file mode 100644 index 0000000..5e24095 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp4-fichier/.idea/uiDesigner.xml b/2A/Java/tp/tp4-fichier/.idea/uiDesigner.xml new file mode 100644 index 0000000..2b63946 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/.idea/uiDesigner.xml @@ -0,0 +1,124 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/io/Dump$Visitor.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/io/Dump$Visitor.class new file mode 100644 index 0000000..e2ecd73 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/io/Dump$Visitor.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/io/Dump.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/io/Dump.class new file mode 100644 index 0000000..9a389c7 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/io/Dump.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/ConsoleStream.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/ConsoleStream.class new file mode 100644 index 0000000..3a87cd9 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/ConsoleStream.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Directory.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Directory.class new file mode 100644 index 0000000..62e1f51 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Directory.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/File.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/File.class new file mode 100644 index 0000000..4ea9643 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/File.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Inode.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Inode.class new file mode 100644 index 0000000..bcc12e6 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Inode.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Partition.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Partition.class new file mode 100644 index 0000000..b0dd38b Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Partition.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Permissible.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Permissible.class new file mode 100644 index 0000000..a64d7c1 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Permissible.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Permissions.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Permissions.class new file mode 100644 index 0000000..cdc234b Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/Permissions.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/WritableStream.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/WritableStream.class new file mode 100644 index 0000000..a6c5166 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/model/WritableStream.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/visitor/InodeVisitor.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/visitor/InodeVisitor.class new file mode 100644 index 0000000..8f6e842 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/sgf/visitor/InodeVisitor.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/CommandInput.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/CommandInput.class new file mode 100644 index 0000000..81730cc Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/CommandInput.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/FileCommandInput.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/FileCommandInput.class new file mode 100644 index 0000000..292f441 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/FileCommandInput.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/Main.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/Main.class new file mode 100644 index 0000000..803680e Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/Main.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/Shell.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/Shell.class new file mode 100644 index 0000000..186b04d Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/Shell.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/UserCommandInput.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/UserCommandInput.class new file mode 100644 index 0000000..7a266a2 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/UserCommandInput.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/Command.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/Command.class new file mode 100644 index 0000000..ebf2353 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/Command.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/DumpCommand.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/DumpCommand.class new file mode 100644 index 0000000..7edb028 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/DumpCommand.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/LsRCommand$Visitor.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/LsRCommand$Visitor.class new file mode 100644 index 0000000..abbfa48 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/LsRCommand$Visitor.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/LsRCommand.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/LsRCommand.class new file mode 100644 index 0000000..1d05617 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/LsRCommand.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/StatCommand.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/StatCommand.class new file mode 100644 index 0000000..c731207 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/command/StatCommand.class differ diff --git a/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/model/ExecutionContext.class b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/model/ExecutionContext.class new file mode 100644 index 0000000..a41a897 Binary files /dev/null and b/2A/Java/tp/tp4-fichier/out/production/tp4-fichier/fr/uca/iut/clfreville2/shell/model/ExecutionContext.class differ diff --git a/2A/Java/tp/tp4-fichier/shell.sh b/2A/Java/tp/tp4-fichier/shell.sh new file mode 100644 index 0000000..14649bf --- /dev/null +++ b/2A/Java/tp/tp4-fichier/shell.sh @@ -0,0 +1,2 @@ +lsR +stat courses/algo2 \ No newline at end of file diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/io/Dump.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/io/Dump.java new file mode 100644 index 0000000..9e42e79 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/io/Dump.java @@ -0,0 +1,73 @@ +package fr.uca.iut.clfreville2.sgf.io; + +import fr.uca.iut.clfreville2.sgf.model.Directory; +import fr.uca.iut.clfreville2.sgf.model.File; +import fr.uca.iut.clfreville2.sgf.model.Inode; +import fr.uca.iut.clfreville2.sgf.visitor.InodeVisitor; + +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +public class Dump { + + private final Inode node; + private final Path path; + + public Dump(Inode node, Path path) { + this.node = node; + this.path = path; + } + + public Dump(Inode node) { + this(node, Path.of(System.getProperty("user.home"))); + } + + public void dump() throws IOException { + Visitor visitor = new Visitor(this.path); + this.node.visit(visitor); + if (visitor.throwable != null) { + throw visitor.throwable; + } + } + + private static class Visitor implements InodeVisitor { + + private Path current; + private IOException throwable; + + public Visitor(Path current) { + this.current = current; + } + + @Override + public void visitFile(File file) { + try (FileOutputStream stream = new FileOutputStream(current.resolve(file.name()).toFile())) { + for (byte c : file.content()) { + stream.write(c); + } + } catch (IOException e) { + this.throwable = e; + } + } + + @Override + public void visitDirectory(Directory directory) { + try { + Path previous = this.current; + this.current = this.current.resolve(directory.name()); + Files.createDirectory(this.current); + for (Inode child : directory) { + child.visit(this); + if (this.throwable != null) { + break; + } + } + this.current = previous; + } catch (IOException e) { + this.throwable = e; + } + } + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/ConsoleStream.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/ConsoleStream.java new file mode 100644 index 0000000..59054d3 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/ConsoleStream.java @@ -0,0 +1,30 @@ +package fr.uca.iut.clfreville2.sgf.model; + +import java.io.PrintStream; + +public class ConsoleStream implements WritableStream { + + private final PrintStream stream; + + public ConsoleStream(PrintStream stream) { + this.stream = stream; + } + + public static ConsoleStream stdout() { + return new ConsoleStream(System.out); + } + + public static ConsoleStream stderr() { + return new ConsoleStream(System.err); + } + + @Override + public void write(char c) { + stream.print(c); + } + + @Override + public void write(String str) { + stream.print(str); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Directory.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Directory.java new file mode 100644 index 0000000..8a97bc6 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Directory.java @@ -0,0 +1,48 @@ +package fr.uca.iut.clfreville2.sgf.model; + +import fr.uca.iut.clfreville2.sgf.visitor.InodeVisitor; + +import java.util.Iterator; +import java.util.Map; +import java.util.TreeMap; + +public class Directory extends Inode implements Iterable { + + private static final int DEFAULT_PERMISSIONS = 755; + + private final Map children = new TreeMap<>(); + + public Directory(String filename) { + super(filename, DEFAULT_PERMISSIONS); + } + + public Inode get(String filename) { + return children.get(filename); + } + + public void add(Inode node) { + if (children.putIfAbsent(node.name(), node) != null) { + throw new IllegalArgumentException("This directory already contains the file " + node.name()); + } + } + + @Override + public void visit(InodeVisitor visitor) { + visitor.visitDirectory(this); + } + + @Override + public int size() { + return children.size() + 1; + } + + @Override + public Iterator iterator() { + return children.values().iterator(); + } + + @Override + public String toString() { + return "Directory " + name() + " (" + Integer.toOctalString(permissions()) + ") created on " + creationDate(); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/File.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/File.java new file mode 100644 index 0000000..41c30bf --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/File.java @@ -0,0 +1,53 @@ +package fr.uca.iut.clfreville2.sgf.model; + +import fr.uca.iut.clfreville2.sgf.visitor.InodeVisitor; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class File extends Inode implements WritableStream { + + private static final int DEFAULT_PERMISSIONS = 644; + + private final List content = new ArrayList<>(); + + public File(String filename) { + super(filename, DEFAULT_PERMISSIONS); + } + + public List content() { + return Collections.unmodifiableList(this.content); + } + + public void clear() { + content.clear(); + } + + @Override + public void write(char c) { + content.add((byte) c); + } + + @Override + public void write(String str) { + for (char c : str.toCharArray()) { + content.add((byte) c); + } + } + + @Override + public void visit(InodeVisitor visitor) { + visitor.visitFile(this); + } + + @Override + public int size() { + return content.size(); + } + + @Override + public String toString() { + return "TextFile " + name() + " (" + Integer.toOctalString(permissions()) + ") created on " + creationDate(); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Inode.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Inode.java new file mode 100644 index 0000000..608ad4e --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Inode.java @@ -0,0 +1,59 @@ +package fr.uca.iut.clfreville2.sgf.model; + +import fr.uca.iut.clfreville2.sgf.visitor.InodeVisitor; + +import java.time.LocalDateTime; + +public abstract class Inode implements Permissible { + + private String name; + private int permissions; + private LocalDateTime creationDate; + private LocalDateTime modificationDate; + private LocalDateTime accessDate; + + public Inode(String name, int permissions) { + this.name = name; + this.permissions = permissions; + this.creationDate = LocalDateTime.now(); + this.modificationDate = LocalDateTime.now(); + this.accessDate = LocalDateTime.now(); + } + + public abstract void visit(InodeVisitor visitor); + + public abstract int size(); + + public LocalDateTime creationDate() { + return this.creationDate; + } + + public LocalDateTime modificationDate() { + return this.modificationDate; + } + + public void setModificationDate(LocalDateTime modificationDate) { + this.modificationDate = modificationDate; + } + + public LocalDateTime accessDate() { + return this.accessDate; + } + + public void setAccessDate(LocalDateTime accessDate) { + this.accessDate = accessDate; + } + + public String name() { + return name; + } + + @Override + public int permissions() { + return this.permissions; + } + + public void setPermissions(int permissions) { + this.permissions = permissions; + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Partition.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Partition.java new file mode 100644 index 0000000..1cfbffc --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Partition.java @@ -0,0 +1,19 @@ +package fr.uca.iut.clfreville2.sgf.model; + +public record Partition(Inode root) { + public Inode resolve(Directory cwd, String s) { + String[] parts = s.split("/"); + Inode dest = cwd; + for (String part : parts) { + if (dest instanceof Directory dir) { + dest = dir.get(part); + if (dest == null) { + throw new IllegalArgumentException("Inode inconnu !"); + } + } else { + throw new IllegalArgumentException("N'est pas un dossier !"); + } + } + return dest; + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Permissible.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Permissible.java new file mode 100644 index 0000000..472e687 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Permissible.java @@ -0,0 +1,6 @@ +package fr.uca.iut.clfreville2.sgf.model; + +public interface Permissible { + + int permissions(); +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Permissions.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Permissions.java new file mode 100644 index 0000000..5ad34bd --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/Permissions.java @@ -0,0 +1,14 @@ +package fr.uca.iut.clfreville2.sgf.model; + +public final class Permissions { + + private Permissions() {} + + public static final int READ = 1 << 2; + public static final int WRITE = 1 << 1; + public static final int EXECUTE = 1 << 0; + + public static final int USER_SHIFT = 6; + public static final int GROUP_SHIFT = 3; + public static final int OTHERS_SHIFT = 0; +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/WritableStream.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/WritableStream.java new file mode 100644 index 0000000..0f57ded --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/model/WritableStream.java @@ -0,0 +1,8 @@ +package fr.uca.iut.clfreville2.sgf.model; + +public interface WritableStream { + + void write(char c); + + void write(String str); +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/visitor/InodeVisitor.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/visitor/InodeVisitor.java new file mode 100644 index 0000000..cb8b917 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/sgf/visitor/InodeVisitor.java @@ -0,0 +1,11 @@ +package fr.uca.iut.clfreville2.sgf.visitor; + +import fr.uca.iut.clfreville2.sgf.model.Directory; +import fr.uca.iut.clfreville2.sgf.model.File; + +public interface InodeVisitor { + + void visitFile(File file); + + void visitDirectory(Directory directory); +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/CommandInput.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/CommandInput.java new file mode 100644 index 0000000..dec617f --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/CommandInput.java @@ -0,0 +1,6 @@ +package fr.uca.iut.clfreville2.shell; + +public interface CommandInput { + + String ask(); +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/FileCommandInput.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/FileCommandInput.java new file mode 100644 index 0000000..54dab79 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/FileCommandInput.java @@ -0,0 +1,24 @@ +package fr.uca.iut.clfreville2.shell; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Deque; +import java.util.LinkedList; + +public class FileCommandInput implements CommandInput { + + private final Deque commands; + + public FileCommandInput(Path path) throws IOException { + this.commands = new LinkedList<>(Files.readAllLines(path)); + } + + @Override + public String ask() { + if (this.commands.isEmpty()) { + return null; + } + return this.commands.pollFirst(); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/Main.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/Main.java new file mode 100644 index 0000000..77b6375 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/Main.java @@ -0,0 +1,33 @@ +package fr.uca.iut.clfreville2.shell; + +import fr.uca.iut.clfreville2.sgf.model.Directory; +import fr.uca.iut.clfreville2.sgf.model.File; +import fr.uca.iut.clfreville2.sgf.model.Partition; +import fr.uca.iut.clfreville2.shell.command.StatCommand; +import fr.uca.iut.clfreville2.shell.command.DumpCommand; +import fr.uca.iut.clfreville2.shell.command.LsRCommand; + +import java.io.IOException; +import java.nio.file.Path; + +public final class Main { + + public static void main(String[] args) throws IOException { + Directory root = new Directory("root"); + Directory courses = new Directory("courses"); + Directory algo = new Directory("algo2"); + algo.add(new File("list.c")); + algo.add(new File("stack.c")); + root.add(new File("Matrix.txt")); + root.add(courses); + courses.add(algo); + courses.add(new Directory("java")); + Partition p = new Partition(root); + + Shell shell = new Shell(p, root, new FileCommandInput(Path.of("shell.sh"))); + shell.register("lsR", new LsRCommand()); + shell.register("dump", new DumpCommand()); + shell.register("stat", new StatCommand()); + shell.execute(); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/Shell.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/Shell.java new file mode 100644 index 0000000..7891ccf --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/Shell.java @@ -0,0 +1,49 @@ +package fr.uca.iut.clfreville2.shell; + +import fr.uca.iut.clfreville2.sgf.model.ConsoleStream; +import fr.uca.iut.clfreville2.sgf.model.Directory; +import fr.uca.iut.clfreville2.sgf.model.Partition; +import fr.uca.iut.clfreville2.sgf.model.WritableStream; +import fr.uca.iut.clfreville2.shell.command.Command; +import fr.uca.iut.clfreville2.shell.model.ExecutionContext; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class Shell { + + private final Partition partition; + private final Map commands = new HashMap<>(); + private final WritableStream stdout = ConsoleStream.stdout(); + private final WritableStream stderr = ConsoleStream.stderr(); + private Directory currentWorkingDirectory; + private final CommandInput input; + + public Shell(Partition partition, Directory currentWorkingDirectory, CommandInput input) { + this.partition = partition; + this.currentWorkingDirectory = currentWorkingDirectory; + this.input = input; + } + + public void register(String name, Command command) { + this.commands.put(name, command); + } + + public void execute(String rawCommand) { + List args = List.of(rawCommand.split(" ")); + Command command = this.commands.get(args.get(0)); + if (command == null) { + stderr.write("Commande inconnue!\n"); + } else { + command.execute(new ExecutionContext(this.partition, this.currentWorkingDirectory, this.stdout, this.stderr, args)); + } + } + + public void execute() { + String raw; + while ((raw = input.ask()) != null) { + execute(raw); + } + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/UserCommandInput.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/UserCommandInput.java new file mode 100644 index 0000000..343fbb6 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/UserCommandInput.java @@ -0,0 +1,12 @@ +package fr.uca.iut.clfreville2.shell; + +import java.util.Scanner; + +public class UserCommandInput implements CommandInput { + + private final Scanner scanner = new Scanner(System.in); + + public String ask() { + return this.scanner.nextLine(); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/Command.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/Command.java new file mode 100644 index 0000000..bf6b4e7 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/Command.java @@ -0,0 +1,9 @@ +package fr.uca.iut.clfreville2.shell.command; + +import fr.uca.iut.clfreville2.shell.model.ExecutionContext; + +@FunctionalInterface +public interface Command { + + void execute(ExecutionContext ctx); +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/DumpCommand.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/DumpCommand.java new file mode 100644 index 0000000..43e0f68 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/DumpCommand.java @@ -0,0 +1,18 @@ +package fr.uca.iut.clfreville2.shell.command; + +import fr.uca.iut.clfreville2.sgf.io.Dump; +import fr.uca.iut.clfreville2.shell.model.ExecutionContext; + +import java.io.IOException; + +public class DumpCommand implements Command { + @Override + public void execute(ExecutionContext ctx) { + try { + new Dump(ctx.cwd()).dump(); + ctx.stdout().write("Le fichier a bien été écrit.\n"); + } catch (IOException e) { + ctx.stderr().write("Le fichier n'a pas pu être écrit (" + e.getClass().getSimpleName() + ": " + e.getMessage() + ").\n"); + } + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/LsRCommand.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/LsRCommand.java new file mode 100644 index 0000000..77d371c --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/LsRCommand.java @@ -0,0 +1,53 @@ +package fr.uca.iut.clfreville2.shell.command; + +import fr.uca.iut.clfreville2.sgf.model.Directory; +import fr.uca.iut.clfreville2.sgf.model.File; +import fr.uca.iut.clfreville2.sgf.model.Inode; +import fr.uca.iut.clfreville2.sgf.model.WritableStream; +import fr.uca.iut.clfreville2.sgf.visitor.InodeVisitor; +import fr.uca.iut.clfreville2.shell.model.ExecutionContext; + +import java.util.Arrays; + +public class LsRCommand implements Command { + + @Override + public void execute(ExecutionContext ctx) { + ctx.cwd().visit(new Visitor(ctx.stdout())); + } + + private static class Visitor implements InodeVisitor { + + private final WritableStream stdout; + private int offset = 0; + + public Visitor(WritableStream stdout) { + this.stdout = stdout; + } + + @Override + public void visitFile(File file) { + shift(); + this.stdout.write(file + "\n"); + } + + @Override + public void visitDirectory(Directory directory) { + shift(); + this.stdout.write("Directory [" + directory.name() + "] content:\n"); + this.offset += 2; + for (Inode child : directory) { + child.visit(this); + } + this.offset -= 2; + shift(); + this.stdout.write("----\n"); + } + + private void shift() { + for (int i = 0; i < this.offset; i++) { + this.stdout.write(' '); + } + } + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/StatCommand.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/StatCommand.java new file mode 100644 index 0000000..1f6f4cc --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/command/StatCommand.java @@ -0,0 +1,22 @@ +package fr.uca.iut.clfreville2.shell.command; + +import fr.uca.iut.clfreville2.sgf.model.Inode; +import fr.uca.iut.clfreville2.shell.model.ExecutionContext; + +public class StatCommand implements Command { + @Override + public void execute(ExecutionContext ctx) { + Inode target; + if (ctx.args().size() < 2) { + target = ctx.cwd(); + } else { + try { + target = ctx.partition().resolve(ctx.cwd(), ctx.args().get(1)); + } catch (IllegalArgumentException e) { + ctx.stderr().write(e.getMessage()); + return; + } + } + ctx.stdout().write(Integer.toString(target.size())); + } +} diff --git a/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/model/ExecutionContext.java b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/model/ExecutionContext.java new file mode 100644 index 0000000..7f9ce10 --- /dev/null +++ b/2A/Java/tp/tp4-fichier/src/fr/uca/iut/clfreville2/shell/model/ExecutionContext.java @@ -0,0 +1,10 @@ +package fr.uca.iut.clfreville2.shell.model; + +import fr.uca.iut.clfreville2.sgf.model.Directory; +import fr.uca.iut.clfreville2.sgf.model.Partition; +import fr.uca.iut.clfreville2.sgf.model.WritableStream; + +import java.util.List; + +public record ExecutionContext(Partition partition, Directory cwd, WritableStream stdout, WritableStream stderr, List args) { +} diff --git a/2A/Java/tp/tp4-fichier/tp4-fichier.iml b/2A/Java/tp/tp4-fichier/tp4-fichier.iml new file mode 100644 index 0000000..c90834f --- /dev/null +++ b/2A/Java/tp/tp4-fichier/tp4-fichier.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file