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