diff --git a/ClassificationApp-1.0-shaded.jar b/ClassificationApp-1.0-shaded.jar new file mode 100644 index 0000000000000000000000000000000000000000..c7c6510cc511f309720c05cdbd52b3be4479e88f Binary files /dev/null and b/ClassificationApp-1.0-shaded.jar differ diff --git a/compile.sh b/compile.sh new file mode 100644 index 0000000000000000000000000000000000000000..d0e366ddb5b689d2811fac5e6d1a4af5571e61f6 --- /dev/null +++ b/compile.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# Vérifie si le répertoire contient un projet Maven (pom.xml) +if [ ! -f "pom.xml" ]; then + echo "Erreur : Aucun fichier pom.xml trouvé dans le répertoire actuel." + echo "Veuillez exécuter ce script dans un répertoire Maven valide." + exit 1 +fi + +# Exécute mvn clean +echo "Exécution de 'mvn clean'..." +mvn clean +if [ $? -ne 0 ]; then + echo "Erreur : 'mvn clean' a échoué. Veuillez verifier que maven est bien installé" + exit 1 +fi + +# Exécute mvn install +echo "Exécution de 'mvn install'..." +mvn install +if [ $? -ne 0 ]; then + echo "Erreur : 'mvn install' a échoué. Veuillez verifier que maven est bien installé" + exit 1 +fi + +echo "Build Maven terminé avec succès." \ No newline at end of file diff --git a/pom.xml b/pom.xml index fcff1e2da45ce1213d95d7b937472878250c88bb..5589a043d9678c499592e43f034070cb3e4e9189 100644 --- a/pom.xml +++ b/pom.xml @@ -15,17 +15,11 @@ <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> - <version>3.1</version> + <version>3.8.0</version> <configuration> - <source>11</source> - <target>11</target> + <release>11</release> </configuration> </plugin> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-surefire-plugin</artifactId> - <version>2.22.0</version> - </plugin> <plugin> <groupId>org.openjfx</groupId> <artifactId>javafx-maven-plugin</artifactId> @@ -34,7 +28,33 @@ <mainClass>fr.univlille.sae.classification.Main</mainClass> </configuration> </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-shade-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>shade</goal> + </goals> + <configuration> + <shadedArtifactAttached>true</shadedArtifactAttached> + <transformers> + <transformer implementation= + "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> + <mainClass>fr.univlille.sae.classification.Main</mainClass> + </transformer> + </transformers> + </configuration> + </execution> + </executions> + </plugin> </plugins> + <resources> + <resource> + <directory>res/</directory> + <filtering>true</filtering> + </resource> + </resources> </build> <dependencies> diff --git a/run.sh b/run.sh new file mode 100644 index 0000000000000000000000000000000000000000..1657840a45522cb8d6b2c96af05a253f009a36e1 --- /dev/null +++ b/run.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +# Noms des fichiers à vérifier +fichier1="ClassificationApp-1.0-shaded.jar" +fichier2="target/ClassificationApp-1.0-shaded.jar" + +# Vérifie si le premier fichier existe +if [ -f "$fichier1" ]; then + echo "Execution de $fichier1 ..." + java -jar "$fichier1" +# Sinon, vérifie si le deuxième fichier existe +elif [ -f "$fichier2" ]; then + echo "Execution de $fichier1 ..." + java -jar "$fichier2" +# Si aucun des deux fichiers n'existe, affiche un message d'erreur +else + echo "Erreur : Aucun des fichiers $fichier1 ou $fichier2 n'existe. Veuillez compiler le projet avec le script fournis" +fi \ No newline at end of file diff --git a/src/main/java/fr/univlille/sae/classification/ClassificationApp.java b/src/main/java/fr/univlille/sae/classification/ClassificationApp.java new file mode 100644 index 0000000000000000000000000000000000000000..145eb3a499cc9b13ec62058508c4933b03f4c0b2 --- /dev/null +++ b/src/main/java/fr/univlille/sae/classification/ClassificationApp.java @@ -0,0 +1,28 @@ +package fr.univlille.sae.classification; + +import fr.univlille.sae.classification.model.ClassificationModel; +import fr.univlille.sae.classification.view.MainStageView; +import javafx.application.Application; +import javafx.stage.Stage; + +import java.io.IOException; + +public class ClassificationApp extends Application { + + + public void start(Stage stage) throws IOException { + ClassificationModel model = ClassificationModel.getClassificationModel(); + MainStageView view = new MainStageView(model); + + view.show(); + } + + // Ouvre l'application + public static void main(String[] args) { + Application.launch(args); + } + + + + +} diff --git a/src/main/java/fr/univlille/sae/classification/Main.java b/src/main/java/fr/univlille/sae/classification/Main.java index b6aaee11d0fa8f5860267a74ca592a570c9144b1..c1bafba0e15b9d93c8067cca55fecbe14473c900 100644 --- a/src/main/java/fr/univlille/sae/classification/Main.java +++ b/src/main/java/fr/univlille/sae/classification/Main.java @@ -7,22 +7,8 @@ import javafx.stage.Stage; import java.io.IOException; -public class Main extends Application { - - - public void start(Stage stage) throws IOException { - ClassificationModel model = ClassificationModel.getClassificationModel(); - MainStageView view = new MainStageView(model); - - view.show(); - } - - // Ouvre l'application +public class Main { public static void main(String[] args) { - Application.launch(args); + ClassificationApp.main(args); } - - - - -} +} \ No newline at end of file diff --git a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java index f2b44f3f9084fdd4c70e470e6218c77585849586..01378ad70b54c22989ed3e3c07a18c73dd771f1b 100644 --- a/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java +++ b/src/main/java/fr/univlille/sae/classification/controller/AddDataController.java @@ -3,6 +3,7 @@ package fr.univlille.sae.classification.controller; import fr.univlille.sae.classification.model.ClassificationModel; import fr.univlille.sae.classification.view.MainStageView; import javafx.fxml.FXML; +import javafx.scene.control.Alert; import javafx.scene.control.Spinner; import javafx.scene.control.SpinnerValueFactory; import javafx.stage.Stage; @@ -67,8 +68,15 @@ public class AddDataController { System.out.println("validé"); mainStageView.getController().getClassifyData().setDisable(false); - - ClassificationModel.getClassificationModel().ajouterDonnee(sepalLengthSpinner.getValue(), sepalWidthSpinner.getValue(), petalLengthSpinner.getValue(), petalWidthSpinner.getValue()); + try{ + ClassificationModel.getClassificationModel().ajouterDonnee(sepalLengthSpinner.getValue(), sepalWidthSpinner.getValue(), petalLengthSpinner.getValue(), petalWidthSpinner.getValue()); + }catch (IllegalArgumentException e){ + Alert alert = new Alert(Alert.AlertType.ERROR); + alert.setTitle("Erreur"); + alert.setHeaderText(null); + alert.setContentText(e.getMessage()); + alert.showAndWait(); + } stage.close(); } diff --git a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java index 4e0b3616ec3476f7608b25dbe31ef210e710659c..8f50d456791424e82827e6e4ab66d60c631a7b11 100644 --- a/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java +++ b/src/main/java/fr/univlille/sae/classification/model/ClassificationModel.java @@ -52,8 +52,9 @@ public class ClassificationModel extends Observable { /** * Ajoute un point au nuage de points avec toutes les données de ce point. * @param coords toutes les données du point. + * @throws IllegalArgumentException si le nombre de coordonnées ne correspond pas au type spécifié. */ - public void ajouterDonnee(double... coords) { + public void ajouterDonnee(double... coords) throws IllegalArgumentException { LoadableData newData = PointFactory.createPoint(type, coords); this.dataToClass.add(newData); notifyObservers(newData); diff --git a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java index 0a6c59ed4356e4ad67cd5853d694e1a9b941881a..1e5a6dd0499583ed1f243e5955bb9575ae09e2e7 100644 --- a/src/main/java/fr/univlille/sae/classification/model/PointFactory.java +++ b/src/main/java/fr/univlille/sae/classification/model/PointFactory.java @@ -12,11 +12,10 @@ public class PointFactory { * @return instance de LoadableData correspondant aux coordonnées, ou null en cas d'erreur. * @throws IllegalArgumentException si le nombre de coordonnées ne correspond pas au type spécifié. */ - public static LoadableData createPoint(DataType type, double[] coords) { + public static LoadableData createPoint(DataType type, double[] coords) throws IllegalArgumentException { int size = coords.length; LoadableData data; - try { switch (type) { case IRIS: if (size != 4) { @@ -27,10 +26,7 @@ public class PointFactory { default: throw new IllegalArgumentException("Type de données non supporté : " + type); } - } catch (IllegalArgumentException e) { - System.err.println("Erreur lors de la création du point : " + e.getMessage()); - return null; - } + return data; } diff --git a/src/main/java/fr/univlille/sae/classification/view/AddDataView.java b/src/main/java/fr/univlille/sae/classification/view/AddDataView.java index a220919c3c6efc9973f3338feb81b5a7bfbd76d8..1158acf2c8cf7d18485637dc877b394370dd892a 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AddDataView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AddDataView.java @@ -37,14 +37,9 @@ public class AddDataView { */ public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = null; + URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+File.separator+"add-data-stage.fxml"); + - try { - fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "add-data-stage.fxml").toURI().toURL(); - } catch (IOException e) { - System.out.println("Erreur lors de la création de l'URL du fichier FXML : " + e.getMessage()); - return; - } if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); diff --git a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java index 70aa3ea9d39a7ff8662685c65061da9e49cc1a89..d46a62f48119ce4c4f516684e15ac6d359a3256e 100644 --- a/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java +++ b/src/main/java/fr/univlille/sae/classification/view/AxesSettingsView.java @@ -38,14 +38,8 @@ public class AxesSettingsView { */ public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = null; + URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+File.separator+"axes-settings-stage.fxml"); - try { - fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "axes-settings-stage.fxml").toURI().toURL(); - } catch (IOException e) { - System.out.println("Erreur lors de la création de l'URL du fichier FXML : " + e.getMessage()); - return; - } if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); diff --git a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java index efd846ba40c927472296b3d2108e8379830477a5..09ecf1b5ed907cb2eac5d51ceedf1fdc9181cae7 100644 --- a/src/main/java/fr/univlille/sae/classification/view/DataStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/DataStageView.java @@ -58,7 +58,7 @@ public class DataStageView extends DataVisualizationView implements Observer { FXMLLoader loader = new FXMLLoader(); try { - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "data-view-stage.fxml").toURI().toURL(); + URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+File.separator+"data-view-stage.fxml"); if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); diff --git a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java index 31e19836f488a3d8e8f5615716199c3440273d58..438bba9c5be3c42d8f90c523b642475635a23c30 100644 --- a/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java +++ b/src/main/java/fr/univlille/sae/classification/view/LoadDataView.java @@ -32,14 +32,7 @@ public class LoadDataView { */ public void show() { FXMLLoader loader = new FXMLLoader(); - URL fxmlFileUrl = null; - - try { - fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "load-data-stage.fxml").toURI().toURL(); - } catch (IOException e) { - System.out.println("Erreur lors de la création de l'URL du fichier FXML : " + e.getMessage()); - return; - } + URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+File.separator+"load-data-stage.fxml"); if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); diff --git a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java index bb96b1651bae24ac638216592ef41b60e901633c..829d82ad323d8182ac2e72515b34feee1c112354 100644 --- a/src/main/java/fr/univlille/sae/classification/view/MainStageView.java +++ b/src/main/java/fr/univlille/sae/classification/view/MainStageView.java @@ -58,13 +58,15 @@ public class MainStageView extends DataVisualizationView implements Observer { FXMLLoader loader = new FXMLLoader(); try { - URL fxmlFileUrl = new File(System.getProperty("user.dir") + File.separator + "res" + File.separator + "stages" + File.separator + "main-stage.fxml").toURI().toURL(); + URL fxmlFileUrl = getClass().getClassLoader().getResource("stages"+File.separator+"main-stage.fxml"); if (fxmlFileUrl == null) { System.out.println("Impossible de charger le fichier fxml"); System.exit(-1); } + loader.setLocation(fxmlFileUrl); + root = loader.load(); root.setResizable(false); root.setTitle("SAE3.3 - Logiciel de classification"); diff --git a/src/test/java/fr/univlille/sae/classification/model/ClassificationModelTest.java b/src/test/java/fr/univlille/sae/classification/model/ClassificationModelTest.java index 2b826541a9498a452c76769abc18f666bc30365d..969e7a0e23ce7806f9ced14fbc72872772963e91 100644 --- a/src/test/java/fr/univlille/sae/classification/model/ClassificationModelTest.java +++ b/src/test/java/fr/univlille/sae/classification/model/ClassificationModelTest.java @@ -28,8 +28,8 @@ class ClassificationModelTest { @Test void testAjouterDonnee() { - double[] coords = {5.1, 3.5, 1.4, 0.2}; - model.ajouterDonnee(coords); + + model.ajouterDonnee(5.1, 3.5, 1.4, 0.2); List<LoadableData> dataToClass = model.getDataToClass(); assertEquals(1, dataToClass.size()); @@ -41,21 +41,35 @@ class ClassificationModelTest { Exception exception = assertThrows(IllegalArgumentException.class, () -> { model.ajouterDonnee(5.1); }); - assertEquals(null, exception.getMessage()); + } @Test void testLoadData() throws IOException { File csvTemp = File.createTempFile("test", ".csv"); - String csvTest = "sepal_length,sepal_width,petal_length,petal_width,class\n" + - "5.1,3.5,1.4,0.2,Iris-setosa\n" + - "4.9,3.0,1.4,0.2,Iris-setosa\n"; + String csvTest = "\"sepal.length\",\"sepal.width\",\"petal.length\",\"petal.width\",\"variety\"\n" + + "5.1,3.5,1.4,0.2,\"Setosa\"\n" + + "4.9,3.0,1.4,0.2,\"Setosa\"\n"; Files.write(Paths.get(csvTemp.getAbsolutePath()), csvTest.getBytes()); model.loadData(csvTemp); List<LoadableData> datas = model.getDatas(); assertEquals(2, datas.size()); + + Iris i1 = (Iris) datas.get(0); + assertEquals(5.1, i1.getSepalLength()); + assertEquals(3.5, i1.getSepalWidth()); + assertEquals(1.4, i1.getPetalLength()); + assertEquals(0.2, i1.getPetalWidth()); + assertEquals("Setosa", i1.getClassification()); + + Iris i2 = (Iris) datas.get(1); + assertEquals(4.9, i2.getSepalLength()); + assertEquals(3.0, i2.getSepalWidth()); + assertEquals(1.4, i2.getPetalLength()); + assertEquals(0.2, i2.getPetalWidth()); + assertEquals("Setosa", i1.getClassification()); csvTemp.delete(); }