From 3ff84db8007840999a2b205a28cb4342cf8c07e1 Mon Sep 17 00:00:00 2001
From: Herve <herve.guillemin@inrae.fr>
Date: Wed, 13 Mar 2024 17:24:13 +0100
Subject: [PATCH 1/3] =?UTF-8?q?Ajout=20du=20code=20(provisoire=20en=20atte?=
 =?UTF-8?q?ndant=20la=20nouvelle=20version=20de=20po2-engine)=20pour=20la?=
 =?UTF-8?q?=20validation=20SHACL,=20le=20d=C3=A9p=C3=B4t=20et=20en=20parti?=
 =?UTF-8?q?e=20le=20t=C3=A9l=C3=A9chargement=20du=20fichier=20de=20contrai?=
 =?UTF-8?q?ntes?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../java/fr/inra/po2vocabmanager/MainApp.java | 107 ++++++++++++++++++
 .../po2vocabmanager/utils/DataTreeCell.java   |  97 ++++++++++++++++
 .../view/RootLayoutController.java            |  10 ++
 src/main/resources/PO2Engine.properties       |   2 +
 .../inra/po2vocabmanager/view/RootLayout.fxml |   8 +-
 5 files changed, 222 insertions(+), 2 deletions(-)

diff --git a/src/main/java/fr/inra/po2vocabmanager/MainApp.java b/src/main/java/fr/inra/po2vocabmanager/MainApp.java
index d3bcff21..694394fc 100644
--- a/src/main/java/fr/inra/po2vocabmanager/MainApp.java
+++ b/src/main/java/fr/inra/po2vocabmanager/MainApp.java
@@ -35,6 +35,7 @@ import fr.inrae.po2engine.model.*;
 import fr.inrae.po2engine.model.dataModel.GeneralFile;
 import fr.inrae.po2engine.model.dataModel.ItineraryFile;
 import fr.inrae.po2engine.utils.ProgressPO2;
+import fr.inrae.po2engine.utils.Report;
 import fr.inrae.po2engine.utils.Tools;
 import javafx.application.Application;
 import javafx.application.Platform;
@@ -82,6 +83,8 @@ import org.update4j.LaunchContext;
 import org.update4j.inject.InjectTarget;
 import org.update4j.service.Launcher;
 
+import static org.junit.jupiter.api.DynamicTest.stream;
+
 import java.io.*;
 import java.nio.charset.StandardCharsets;
 import java.util.*;
@@ -1263,6 +1266,110 @@ public class MainApp extends Application implements Launcher  {
         }
     }
 
+    public void startSHACLValidation() {
+
+        // Au prealable :
+        // - le jeu de donnees doit avoir ete publie
+        // - le fichier de contrainte a du etre transmis (download)
+        
+        ArrayList<String> errorCantStartSValidation = new ArrayList<>();
+        String dataName = Tools.normalize(getDataControler().getCurrentData().getProjectFile().getNameProperty().getValue());
+
+        // Verification que le jeu de donnees a bien ete publie ?
+        String repoName = RDF4JTools.getRepository(dataName);
+        if (repoName.equals("error"))
+            errorCantStartSValidation.add("First, publish the dataset to validate");
+
+        // Verification que le fichier de contraintes a bien ete transmis ?
+
+        if (errorCantStartSValidation.size() > 0) {
+            Alert alert = new Alert(AlertType.ERROR);
+            alert.setTitle("Unable to start SHACL validation");
+            alert.setHeaderText("Please correct the errors before starting SHACL validation");
+            alert.setContentText(errorCantStartSValidation.stream().map(x -> " - " + x).collect(Collectors.joining("\n")));
+            alert.initOwner(MainApp.primaryStage);
+            alert.initModality(Modality.WINDOW_MODAL);
+            alert.showAndWait();
+            return;
+        }
+
+        // Oblige de faire comme ca en attendant d'utiliser la methode
+        // ajoutee dans po2-engine ()
+        unbindVersion();
+        Thread t = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    Tools.addProgress(ProgressPO2.ANALYSE, "Validating ?");
+                    Tools.updateProgress(ProgressPO2.ANALYSE, "Validating...");
+
+                    long start = System.nanoTime();
+                    Report r = RDF4JTools.startShaclValidation(Tools.normalize(dataName));
+                    //try{
+                    //    Thread.sleep(3000);
+                    //} catch (InterruptedException e){
+                    //    e.printStackTrace();
+                    //}
+                    long finish = System.nanoTime();
+                    long timeElapsed = (long)((finish - start)*0.000001);
+
+                    Platform.runLater(() -> {
+                        Alert SHACLValidationEndMessage = new Alert(AlertType.INFORMATION);
+                        SHACLValidationEndMessage.setResizable(true);
+                        SHACLValidationEndMessage.setTitle("SHACL validation ended");
+                        SHACLValidationEndMessage.setHeaderText("REPORT");
+                        SHACLValidationEndMessage.setContentText("Elapsed time : "
+                            + ((Long)timeElapsed).toString() + " ms\r\n"
+                            + (r.success()
+                            ? "No validation error ?"
+                            : "Validations errors..."));//r.prettyPrintError());
+                        ButtonType saveLog = new ButtonType("Download log file", ButtonData.LEFT);
+                        SHACLValidationEndMessage.getButtonTypes().add(saveLog);
+
+
+                        SHACLValidationEndMessage.getDialogPane().lookupButton(saveLog).addEventFilter(
+                            ActionEvent.ACTION,
+                            event -> {
+                                event.consume();
+                                FileChooser fileChooser = new FileChooser();
+                                fileChooser.setTitle("save log file");
+                                fileChooser.setInitialFileName("results_SHACL_validation.txt");
+                                File fileExport = fileChooser.showSaveDialog(MainApp.primaryStage);
+                                if (fileExport != null) {
+                                    try {
+                                        FileOutputStream fout = new FileOutputStream(fileExport, false);
+                                        org.apache.commons.io.IOUtils.write(r.prettyPrintError(), fout, StandardCharsets.UTF_8);
+                                        fout.close();
+                                    } catch (IOException ex) {
+                                        MainApp.logger.error(ex.getMessage());
+                                    }
+                                }
+                            }
+                        );
+                        SHACLValidationEndMessage.initOwner(MainApp.primaryStage);
+                        SHACLValidationEndMessage.initModality(Modality.WINDOW_MODAL);
+                        SHACLValidationEndMessage.showAndWait();
+                    });
+                                
+                    Tools.delProgress(ProgressPO2.ANALYSE);
+                } catch (/*IOException |*/ RDFParseException e) {
+                    Tools.delProgress(ProgressPO2.ANALYSE);
+                    e.printStackTrace();
+                    Platform.runLater(() -> {
+                        Alert errorSem = new Alert(AlertType.ERROR);
+                        errorSem.setTitle("ERROR");
+                        errorSem.setHeaderText("An error occurred");
+                        errorSem.setContentText("An error occurred. If the problem persist, contact the administrator");
+                        errorSem.initOwner(MainApp.primaryStage);
+                        errorSem.initModality(Modality.WINDOW_MODAL);
+                        errorSem.show();
+                    });
+                }
+            }
+        });
+        t.start();
+    }
+
     public String buildTextLogPublish(Integer niv, JSONArray jsonArray) {
         StringBuilder builder = new StringBuilder();
 
diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
index a81920b0..927d62ca 100644
--- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
+++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
@@ -20,6 +20,7 @@ package fr.inra.po2vocabmanager.utils;
 
 import fr.inra.po2vocabmanager.MainApp;
 import fr.inra.po2vocabmanager.model.DataNode;
+import fr.inrae.po2engine.externalTools.RDF4JTools;
 import fr.inrae.po2engine.model.dataModel.*;
 import fr.inrae.po2engine.utils.ImportReport;
 import fr.inrae.po2engine.utils.Report;
@@ -45,12 +46,21 @@ import org.apache.commons.io.FileUtils;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.eclipse.rdf4j.model.vocabulary.RDF4J;
+import org.eclipse.rdf4j.repository.RepositoryConnection;
+import org.eclipse.rdf4j.repository.manager.RemoteRepositoryManager;
+import org.eclipse.rdf4j.rio.Rio;
 import org.json.JSONArray;
 import org.json.JSONObject;
 
+import static org.junit.jupiter.api.DynamicTest.stream;
+
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -409,9 +419,96 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                         });
                     });
 
+                    MenuItem uploadSCHACLConstraints = new MenuItem("Upload SCHACL");
+                    uploadSCHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png")));
+                    uploadSCHACLConstraints.setOnAction(event -> {
+                        ProjectFile projectFile = (ProjectFile) item.getFile();
+                        Platform.runLater(() -> {
+                            FileChooser fileChooser = new FileChooser();
+                            fileChooser.setTitle("Choose SCHACL Constraints File");
+                            fileChooser.setInitialFileName(projectFile.getNameProperty().get()+"_SCHACL_Constraints.xlsx");
+                            //fileChooser.setInitialFileName("shaclConstraints.xlsx");
+                            fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Turtle file (*.ttl)", "*.ttl"));
+                            File schaclConstraintsFile = fileChooser.showOpenDialog(MainApp.primaryStage);
+                            if (schaclConstraintsFile != null) {
+                                new Thread(() -> {
+                                    Platform.runLater(() -> {
+                                        try {
+                                            String ID = projectFile.getNameProperty().get();
+                                            InputStream stream = new FileInputStream(schaclConstraintsFile);
+
+                                            long start = System.nanoTime();
+                                            RDF4JTools.updateShaclGraph(ID, stream);
+                                            long finish = System.nanoTime();
+                                            long timeElapsed = (long)((finish - start)*0.000001);
+                                            
+                                            // Autre option pour mesurer le temps
+                                            //Instant start = Instant.now();    
+                                            //...
+                                            //Instant finish = Instant.now();   
+                                            //long timeElapsed = Duration.between(start, finish).toMillis();
+                                            
+                                            Alert okImport = new Alert(Alert.AlertType.INFORMATION);
+                                            okImport.setGraphic(new ImageView(UITools.getImage("resources/images/valid.png")));
+                                            okImport.setHeaderText(null);
+                                            okImport.setTitle("Uploading duration");
+                                            okImport.setContentText(((Long)timeElapsed).toString() + " ms");
+                                            okImport.initModality(Modality.APPLICATION_MODAL);
+                                            okImport.initOwner(MainApp.primaryStage);
+                                            okImport.showAndWait();
+
+                                        } catch (IOException ex) {
+                                            MainApp.logger.error(ex.getMessage());
+                                        }
+                                    });
+                                }).start();
+                            };
+                        });
+                    });
+
+                    MenuItem downloadSCHACLConstraints = new MenuItem("Download SCHACL");
+                    downloadSCHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png")));
+                    downloadSCHACLConstraints.setOnAction(event -> {
+                        ProjectFile projectFile = (ProjectFile) item.getFile();
+                        Platform.runLater(() -> {
+                            String repositoryID = projectFile.getNameProperty().get();
+                            FileChooser fileChooser = new FileChooser();
+                            fileChooser.setTitle("Choose name for SCHACL Constraints File");
+                            fileChooser.setInitialFileName(repositoryID + "_SCHACL_Constraints.xlsx");
+                            //fileChooser.setInitialFileName("shaclConstraints.xlsx");
+                            fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Turtle file (*.ttl)", "*.ttl"));
+                            File schaclConstraintsFile = fileChooser.showSaveDialog(MainApp.primaryStage);
+                            if (schaclConstraintsFile != null) {
+                                new Thread(() -> {
+                                    Platform.runLater(() -> {
+                                        try {
+                                            OutputStream stream = new FileOutputStream(schaclConstraintsFile);
+                                            
+                                            //RDF4JTools.downloadShaclGraph(repositoryID, stream);
+
+                                            Alert okImport = new Alert(Alert.AlertType.INFORMATION);
+                                            okImport.setGraphic(new ImageView(UITools.getImage("resources/images/valid.png")));
+                                            okImport.setHeaderText(null);
+                                            okImport.setTitle("Downloading SHACL file");
+                                            okImport.setContentText("Pas de téléchargement. En attente de mise à jour de PO2-engine...");
+                                            okImport.initModality(Modality.APPLICATION_MODAL);
+                                            okImport.initOwner(MainApp.primaryStage);
+                                            okImport.showAndWait();
+
+                                        } catch (IOException ex) {
+                                            MainApp.logger.error(ex.getMessage());
+                                        }
+                                    });
+                                }).start();
+                            };
+                        });
+                    });
+
                     menu.getItems().add(addProcess);
                     menu.getItems().add(exportProject);
                     menu.getItems().add(importProject);
+                    menu.getItems().add(uploadSCHACLConstraints);
+                    menu.getItems().add(downloadSCHACLConstraints);
                     break;
                 case PROCESS:
                     MenuItem addItinerary = new MenuItem("New Itinerary");
diff --git a/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java b/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java
index 4f88c908..6732c937 100644
--- a/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java
+++ b/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java
@@ -62,6 +62,8 @@ public class RootLayoutController {
     @FXML
     MenuItem itemPublish;
     @FXML
+    MenuItem itemSCHACLValidation;
+    @FXML
     MenuItem itemSem;
     @FXML
     MenuItem itemReadMode;
@@ -90,6 +92,8 @@ public class RootLayoutController {
         itemOpen.setDisable(true);
         itemPublish.setDisable(true);
         itemPublish.setVisible(true);
+        //itemSCHACLValidation.setDisable(true);
+        itemSCHACLValidation.setVisible(true);
         itemImportExport.setVisible(false);
         itemExportOnto.setDisable(true);
         itemImportOnto.setDisable(true);
@@ -119,6 +123,8 @@ public class RootLayoutController {
         itemPublish.textProperty().bind(Bindings.when(mainApp.onOntologyViewProperty()).then("Semantize & Publish ontology").otherwise("Semantize & Publish data"));
         itemPublish.disableProperty().bind(mainApp.getEditProperty().not());
 
+        //itemSCHACLValidation.disableProperty().bind(mainApp.getEditProperty().not());
+
         itemImportExport.visibleProperty().bind(mainApp.onOntologyViewProperty());
         itemExportOnto.disableProperty().bind(mainApp.onOntologyViewProperty().not());
         itemImportOnto.disableProperty().bind(mainApp.onOntologyViewProperty().not().or(mainApp.getEditProperty().not()));
@@ -349,6 +355,10 @@ public class RootLayoutController {
         mainApp.semantize();
     }
 
+    public void startSHACLValidation() {
+        mainApp.startSHACLValidation();
+    }
+
     /**
      * Function Call on search click or CTRL+F
      */
diff --git a/src/main/resources/PO2Engine.properties b/src/main/resources/PO2Engine.properties
index f850efa8..79ed2093 100644
--- a/src/main/resources/PO2Engine.properties
+++ b/src/main/resources/PO2Engine.properties
@@ -16,6 +16,8 @@
 # SPDX-License-Identifier: MIT
 #
 
+# Serveur de test : icotest.iate.inra.fr
+# Serveur de production : quantum.mia-ps.inrae.fr
 server.host=quantum.mia-ps.inrae.fr
 
 nextCloud.listFile.login=listFiles
diff --git a/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml b/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml
index 213578d0..7bb1b2b9 100644
--- a/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml
+++ b/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml
@@ -18,10 +18,13 @@
   ~ SPDX-License-Identifier: MIT
   -->
 
-<?import javafx.scene.control.*?>
+<?import javafx.scene.control.Menu?>
+<?import javafx.scene.control.MenuBar?>
+<?import javafx.scene.control.MenuItem?>
 <?import javafx.scene.input.KeyCodeCombination?>
 <?import javafx.scene.layout.BorderPane?>
-<BorderPane xmlns:fx="http://javafx.com/fxml/1" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="700.0" prefWidth="1300.0" xmlns="http://javafx.com/javafx/10.0.1" fx:controller="fr.inra.po2vocabmanager.view.RootLayoutController">
+
+<BorderPane maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="700.0" prefWidth="1300.0" xmlns="http://javafx.com/javafx/21" xmlns:fx="http://javafx.com/fxml/1" fx:controller="fr.inra.po2vocabmanager.view.RootLayoutController">
     <top>
         <MenuBar BorderPane.alignment="CENTER">
             <menus>
@@ -53,6 +56,7 @@
                   <MenuItem fx:id="itemReadMode" mnemonicParsing="false" onAction="#enterWriteMode" text="Read Mode" />
                   <MenuItem fx:id="addConceptScheme" mnemonicParsing="false" onAction="#newConceptScheme" text="New Concept Scheme" />
                   <MenuItem fx:id="itemPublish" mnemonicParsing="false" onAction="#publish" text="Semantize &amp; Publish" visible="false" />
+                  <MenuItem fx:id="itemSCHACLValidation" mnemonicParsing="false" onAction="#startSHACLValidation" text="Start SHACL Validation" />
                   <Menu fx:id="itemImportExport" mnemonicParsing="false" text="Import/Export" visible="false">
                     <items>
                       <MenuItem fx:id="itemImportOnto" mnemonicParsing="false" onAction="#importOnto" text="Import" />
-- 
GitLab


From 96d056a037fa5e3f71c67c1ed6b0ab16521f2cf8 Mon Sep 17 00:00:00 2001
From: Herve <herve.guillemin@inrae.fr>
Date: Fri, 15 Mar 2024 17:06:36 +0100
Subject: [PATCH 2/3] Fin du menu download SHACL et modification du menu
 startShaclValidation

---
 .../java/fr/inra/po2vocabmanager/MainApp.java | 105 +++++++++++++-----
 .../po2vocabmanager/utils/DataTreeCell.java   |  11 +-
 .../view/RootLayoutController.java            |   4 +-
 3 files changed, 84 insertions(+), 36 deletions(-)

diff --git a/src/main/java/fr/inra/po2vocabmanager/MainApp.java b/src/main/java/fr/inra/po2vocabmanager/MainApp.java
index 694394fc..17fb91f8 100644
--- a/src/main/java/fr/inra/po2vocabmanager/MainApp.java
+++ b/src/main/java/fr/inra/po2vocabmanager/MainApp.java
@@ -1293,8 +1293,53 @@ public class MainApp extends Application implements Launcher  {
             return;
         }
 
-        // Oblige de faire comme ca en attendant d'utiliser la methode
-        // ajoutee dans po2-engine ()
+        // Option 1
+        /*
+        unbindVersion();
+        Thread t = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    JSONObject listMessages ;
+                    listMessages = getDataControler().getCurrentData().startShaclValidation();
+
+                    if (listMessages.getJSONArray("error").length() > 0) {
+                        // Validation KO.
+                        Alert KOVal = new Alert(AlertType.ERROR);
+                        KOVal.setResizable(true);
+                        KOVal.setTitle("Validation Errors");
+                        KOVal.setHeaderText("An error occured");
+                        KOVal.setContentText(listMessages.getJSONArray("error").toString());
+                        KOVal.initOwner(MainApp.primaryStage);
+                        KOVal.initModality(Modality.WINDOW_MODAL);
+                        KOVal.show();
+                    } else {
+                        Alert OKVal = new Alert(AlertType.INFORMATION);
+                        OKVal.setResizable(true);
+                        OKVal.setTitle("Success");
+                        OKVal.setHeaderText("Validation successfull");
+                        OKVal.initOwner(MainApp.primaryStage);
+                        OKVal.initModality(Modality.WINDOW_MODAL);
+                        OKVal.show();
+                    }
+
+                } catch (IOException | RDFParseException e) {
+                    e.printStackTrace();
+                    Platform.runLater(() -> {
+                        Alert errorSem = new Alert(AlertType.ERROR);
+                        errorSem.setTitle("ERROR");
+                        errorSem.setHeaderText("An error occurred");
+                        errorSem.setContentText("An error occurred. If the problem persist, contact the administrator");
+                        errorSem.initOwner(MainApp.primaryStage);
+                        errorSem.initModality(Modality.WINDOW_MODAL);
+                        errorSem.show();
+                    });
+                }
+            }
+        });
+        t.start();*/
+        
+        // Option 2
         unbindVersion();
         Thread t = new Thread(new Runnable() {
             @Override
@@ -1318,41 +1363,45 @@ public class MainApp extends Application implements Launcher  {
                         SHACLValidationEndMessage.setResizable(true);
                         SHACLValidationEndMessage.setTitle("SHACL validation ended");
                         SHACLValidationEndMessage.setHeaderText("REPORT");
-                        SHACLValidationEndMessage.setContentText("Elapsed time : "
+                        if (r.success()) {
+                            SHACLValidationEndMessage.setContentText("Elapsed time : "
                             + ((Long)timeElapsed).toString() + " ms\r\n"
-                            + (r.success()
-                            ? "No validation error ?"
-                            : "Validations errors..."));//r.prettyPrintError());
-                        ButtonType saveLog = new ButtonType("Download log file", ButtonData.LEFT);
-                        SHACLValidationEndMessage.getButtonTypes().add(saveLog);
-
-
-                        SHACLValidationEndMessage.getDialogPane().lookupButton(saveLog).addEventFilter(
-                            ActionEvent.ACTION,
-                            event -> {
-                                event.consume();
-                                FileChooser fileChooser = new FileChooser();
-                                fileChooser.setTitle("save log file");
-                                fileChooser.setInitialFileName("results_SHACL_validation.txt");
-                                File fileExport = fileChooser.showSaveDialog(MainApp.primaryStage);
-                                if (fileExport != null) {
-                                    try {
-                                        FileOutputStream fout = new FileOutputStream(fileExport, false);
-                                        org.apache.commons.io.IOUtils.write(r.prettyPrintError(), fout, StandardCharsets.UTF_8);
-                                        fout.close();
-                                    } catch (IOException ex) {
-                                        MainApp.logger.error(ex.getMessage());
+                            + "No validation error ?");
+                        }
+                        else {
+                            SHACLValidationEndMessage.setContentText("Elapsed time : "
+                            + ((Long)timeElapsed).toString() + " ms\r\n"
+                            + "Validations errors...");//r.prettyPrintError());
+                            ButtonType saveLog = new ButtonType("Download log file", ButtonData.LEFT);
+                            SHACLValidationEndMessage.getButtonTypes().add(saveLog);
+                            SHACLValidationEndMessage.getDialogPane().lookupButton(saveLog).addEventFilter(
+                                ActionEvent.ACTION,
+                                event -> {
+                                    event.consume();
+                                    FileChooser fileChooser = new FileChooser();
+                                    fileChooser.setTitle("save log file");
+                                    fileChooser.setInitialFileName("results_SHACL_validation.txt");
+                                    File fileExport = fileChooser.showSaveDialog(MainApp.primaryStage);
+                                    if (fileExport != null) {
+                                        try {
+                                            FileOutputStream fout = new FileOutputStream(fileExport, false);
+                                            org.apache.commons.io.IOUtils.write(r.prettyPrintError(), fout, StandardCharsets.UTF_8);
+                                            fout.close();
+                                        } catch (IOException ex) {
+                                            MainApp.logger.error(ex.getMessage());
+                                        }
                                     }
                                 }
-                            }
-                        );
+                            );
+                        }
+
                         SHACLValidationEndMessage.initOwner(MainApp.primaryStage);
                         SHACLValidationEndMessage.initModality(Modality.WINDOW_MODAL);
                         SHACLValidationEndMessage.showAndWait();
                     });
                                 
                     Tools.delProgress(ProgressPO2.ANALYSE);
-                } catch (/*IOException |*/ RDFParseException e) {
+                } catch (RDFParseException e) {
                     Tools.delProgress(ProgressPO2.ANALYSE);
                     e.printStackTrace();
                     Platform.runLater(() -> {
diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
index 20837e53..7163fd2c 100644
--- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
+++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
@@ -492,16 +492,15 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                         });
                     });
 
-                    MenuItem downloadSCHACLConstraints = new MenuItem("Download SCHACL");
+                    MenuItem downloadSCHACLConstraints = new MenuItem("Download SHACL");
                     downloadSCHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png")));
                     downloadSCHACLConstraints.setOnAction(event -> {
                         ProjectFile projectFile = (ProjectFile) item.getFile();
                         Platform.runLater(() -> {
                             String repositoryID = projectFile.getNameProperty().get();
                             FileChooser fileChooser = new FileChooser();
-                            fileChooser.setTitle("Choose name for SCHACL Constraints File");
-                            fileChooser.setInitialFileName(repositoryID + "_SCHACL_Constraints.xlsx");
-                            //fileChooser.setInitialFileName("shaclConstraints.xlsx");
+                            fileChooser.setTitle("Choose name for SHACL Constraints File");
+                            fileChooser.setInitialFileName(repositoryID + "_SHACL_Constraints.ttl");
                             fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Turtle file (*.ttl)", "*.ttl"));
                             File schaclConstraintsFile = fileChooser.showSaveDialog(MainApp.primaryStage);
                             if (schaclConstraintsFile != null) {
@@ -510,13 +509,13 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                                         try {
                                             OutputStream stream = new FileOutputStream(schaclConstraintsFile);
                                             
-                                            //RDF4JTools.downloadShaclGraph(repositoryID, stream);
+                                            RDF4JTools.downloadShaclGraph(repositoryID, stream);
 
                                             Alert okImport = new Alert(Alert.AlertType.INFORMATION);
                                             okImport.setGraphic(new ImageView(UITools.getImage("resources/images/valid.png")));
                                             okImport.setHeaderText(null);
                                             okImport.setTitle("Downloading SHACL file");
-                                            okImport.setContentText("Pas de téléchargement. En attente de mise à jour de PO2-engine...");
+                                            okImport.setContentText("Fichier téléchargé...");
                                             okImport.initModality(Modality.APPLICATION_MODAL);
                                             okImport.initOwner(MainApp.primaryStage);
                                             okImport.showAndWait();
diff --git a/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java b/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java
index 925f4331..b2bc6372 100644
--- a/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java
+++ b/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java
@@ -92,7 +92,7 @@ public class RootLayoutController {
         itemOpen.setDisable(true);
         itemPublish.setDisable(true);
         itemPublish.setVisible(true);
-        //itemSCHACLValidation.setDisable(true);
+        itemSCHACLValidation.setDisable(true);
         itemSCHACLValidation.setVisible(true);
         itemImportExport.setVisible(false);
         itemExportOnto.setDisable(true);
@@ -123,7 +123,7 @@ public class RootLayoutController {
         itemPublish.textProperty().bind(Bindings.when(mainApp.onOntologyViewProperty()).then("Semantize & Publish ontology").otherwise("Semantize & Publish data"));
         itemPublish.disableProperty().bind(mainApp.getEditProperty().not());
 
-        //itemSCHACLValidation.disableProperty().bind(mainApp.getEditProperty().not());
+        itemSCHACLValidation.disableProperty().bind(Bindings.when(mainApp.fileNameProperty().isEqualTo("")).then(true).otherwise(false));
 
         itemImportExport.visibleProperty().bind(mainApp.onOntologyViewProperty());
         itemExportOnto.disableProperty().bind(mainApp.onOntologyViewProperty().not());
-- 
GitLab


From 5988f13c30a2918efc13aae42b05e2c0a7d97cbe Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Dervaux?= <stephane.dervaux@inrae.fr>
Date: Mon, 18 Mar 2024 15:56:05 +0100
Subject: [PATCH 3/3] add constraint on upload shacl (only in edition mode)

---
 .../inra/po2vocabmanager/utils/DataTreeCell.java   | 14 ++------------
 1 file changed, 2 insertions(+), 12 deletions(-)

diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
index 7163fd2c..75db53d5 100644
--- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
+++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java
@@ -46,22 +46,11 @@ import org.apache.commons.io.FileUtils;
 import org.apache.poi.xssf.usermodel.XSSFRow;
 import org.apache.poi.xssf.usermodel.XSSFSheet;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
-import org.eclipse.rdf4j.model.vocabulary.RDF4J;
-import org.eclipse.rdf4j.repository.RepositoryConnection;
-import org.eclipse.rdf4j.repository.manager.RemoteRepositoryManager;
-import org.eclipse.rdf4j.rio.Rio;
 import org.controlsfx.control.CheckTreeView;
 import org.json.JSONArray;
 import org.json.JSONObject;
 
-import static org.junit.jupiter.api.DynamicTest.stream;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
+import java.io.*;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -446,6 +435,7 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> {
                     });
 
                     MenuItem uploadSCHACLConstraints = new MenuItem("Upload SCHACL");
+                    uploadSCHACLConstraints.disableProperty().bind(Bindings.not(mainApp.getEditProperty()));
                     uploadSCHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png")));
                     uploadSCHACLConstraints.setOnAction(event -> {
                         ProjectFile projectFile = (ProjectFile) item.getFile();
-- 
GitLab