diff --git a/src/main/java/fr/inra/po2vocabmanager/MainApp.java b/src/main/java/fr/inra/po2vocabmanager/MainApp.java index 70282848898503734b6e83c8770aa79cdf36f7b7..a9f0022e642cbd483990892719c64a6631f41458 100644 --- a/src/main/java/fr/inra/po2vocabmanager/MainApp.java +++ b/src/main/java/fr/inra/po2vocabmanager/MainApp.java @@ -1282,7 +1282,9 @@ public class MainApp extends Application implements Launcher { // Au prealable : // - le jeu de donnees doit avoir ete publie // - le fichier de contrainte a du etre transmis (download) - + + // Verification qu'un jeu de donnees est bien ouvert, + // et que ce jeu a bien ete publie. ArrayList<String> errorCantStartSValidation = new ArrayList<>(); if(getDataControler().getCurrentData() == null) { errorCantStartSValidation.add("No dataset loaded"); @@ -1295,11 +1297,7 @@ public class MainApp extends Application implements Launcher { } } - - - - // Verification que le fichier de contraintes a bien ete transmis ? - + // Message d'alerte en cas de probleme if (errorCantStartSValidation.size() > 0) { Alert alert = new Alert(AlertType.ERROR); alert.setTitle("Unable to start SHACL validation"); @@ -1368,12 +1366,12 @@ public class MainApp extends Application implements Launcher { long start = System.nanoTime(); String dataName = Tools.normalize(getDataControler().getCurrentData().getProjectFile().getNameProperty().getValue()); + + String ontologyName = ""; + if(ontologyControler != null && ontologyControler.getCurrentOntology() != null) + ontologyName = Tools.normalize(getOntologyControler().getCurrentOntology().getName().get()); + Report r = RDF4JTools.startShaclValidation(dataName); - //try{ - // Thread.sleep(3000); - //} catch (InterruptedException e){ - // e.printStackTrace(); - //} long finish = System.nanoTime(); long timeElapsed = (long)((finish - start)*0.000001); @@ -1429,7 +1427,7 @@ public class MainApp extends Application implements Launcher { }); Tools.delProgress(ProgressPO2.ANALYSE); - } catch (RDFParseException e) { + } catch (Exception 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 6a4704d82ba3fda32250ba688bf6af7d2c5dd538..e7deb82ecdea8c6faf94bec608065a74144a704c 100644 --- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java +++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java @@ -568,27 +568,25 @@ 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 -> { + MenuItem uploadSHACLConstraints = new MenuItem("Upload SHACL"); + uploadSHACLConstraints.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + uploadSHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png"))); + uploadSHACLConstraints.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.setTitle("Choose SHACL Constraints File"); fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Turtle file (*.ttl)", "*.ttl")); - File schaclConstraintsFile = fileChooser.showOpenDialog(MainApp.primaryStage); - if (schaclConstraintsFile != null) { + File shaclConstraintsFile = fileChooser.showOpenDialog(MainApp.primaryStage); + if (shaclConstraintsFile != null) { new Thread(() -> { Platform.runLater(() -> { try { String ID = Tools.normalize(projectFile.getNameProperty().get()); - InputStream stream = new FileInputStream(schaclConstraintsFile); + InputStream stream = new FileInputStream(shaclConstraintsFile); long start = System.nanoTime(); - RDF4JTools.updateShaclGraph(ID, stream); + RDF4JTools.updateDataShaclGraph(ID, stream, "Data"); long finish = System.nanoTime(); long timeElapsed = (long)((finish - start)*0.000001); @@ -616,9 +614,9 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { }); }); - MenuItem downloadSCHACLConstraints = new MenuItem("Download SHACL"); - downloadSCHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png"))); - downloadSCHACLConstraints.setOnAction(event -> { + MenuItem downloadSHACLConstraints = new MenuItem("Download SHACL"); + downloadSHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png"))); + downloadSHACLConstraints.setOnAction(event -> { ProjectFile projectFile = (ProjectFile) item.getFile(); Platform.runLater(() -> { String repositoryID = Tools.normalize(projectFile.getNameProperty().get()); @@ -626,20 +624,20 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { 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) { + File shaclConstraintsFile = fileChooser.showSaveDialog(MainApp.primaryStage); + if (shaclConstraintsFile != null) { new Thread(() -> { Platform.runLater(() -> { try { - OutputStream stream = new FileOutputStream(schaclConstraintsFile); + OutputStream stream = new FileOutputStream(shaclConstraintsFile); - RDF4JTools.downloadShaclGraph(repositoryID, stream); + RDF4JTools.downloadShaclGraph(repositoryID, stream,"Data"); 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("Fichier téléchargé..."); + okImport.setContentText("File downloaded..."); okImport.initModality(Modality.APPLICATION_MODAL); okImport.initOwner(MainApp.primaryStage); okImport.showAndWait(); @@ -656,8 +654,8 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { menu.getItems().add(addProcess); menu.getItems().add(exportProject); menu.getItems().add(importProject); - menu.getItems().add(uploadSCHACLConstraints); - menu.getItems().add(downloadSCHACLConstraints); + menu.getItems().add(uploadSHACLConstraints); + menu.getItems().add(downloadSHACLConstraints); break; case PROCESS: Menu newIti = new Menu("New Itinerary"); diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/VocabTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/VocabTreeCell.java index a96c0514c3c245e1a75ea502b990d7c45742d330..5f1512c21888b6abaeb9a420ae90bd040c921186 100644 --- a/src/main/java/fr/inra/po2vocabmanager/utils/VocabTreeCell.java +++ b/src/main/java/fr/inra/po2vocabmanager/utils/VocabTreeCell.java @@ -19,20 +19,26 @@ package fr.inra.po2vocabmanager.utils; import fr.inra.po2vocabmanager.MainApp; +import fr.inrae.po2engine.externalTools.RDF4JTools; +import fr.inrae.po2engine.model.Ontology; import fr.inrae.po2engine.model.SkosScheme; import fr.inrae.po2engine.model.VocabConcept; +import fr.inrae.po2engine.utils.Tools; import javafx.application.Platform; import javafx.beans.binding.Bindings; import javafx.event.EventHandler; import javafx.scene.control.*; import javafx.scene.control.cell.TextFieldTreeCell; +import javafx.scene.image.ImageView; import javafx.scene.input.ClipboardContent; import javafx.scene.input.Dragboard; import javafx.scene.input.MouseEvent; import javafx.scene.input.TransferMode; import javafx.scene.layout.VBox; +import javafx.stage.FileChooser; import javafx.stage.Modality; +import java.io.*; import java.util.HashMap; import java.util.Map; import java.util.Optional; @@ -178,6 +184,88 @@ public class VocabTreeCell extends TextFieldTreeCell<VocabConcept> { if (empty || item == null) { setText(null); setGraphic(null); + + ContextMenu menu = new ContextMenu(); + + MenuItem uploadSHACLConstraints = new MenuItem("Upload SHACL"); + uploadSHACLConstraints.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + uploadSHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png"))); + uploadSHACLConstraints.setOnAction(event -> { + Ontology onto = MainApp.getOntologyControler().getCurrentOntology(); + Platform.runLater(() -> { + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Choose SHACL Constraints File"); + fileChooser.setInitialFileName("constraints.ttl"); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Turtle file (*.ttl)", "*.ttl")); + File shaclConstraintsFile = fileChooser.showOpenDialog(MainApp.primaryStage); + if (shaclConstraintsFile != null) { + new Thread(() -> { + Platform.runLater(() -> { + try { + String ID = Tools.normalize(onto.getName().get()); + InputStream stream = new FileInputStream(shaclConstraintsFile); + + RDF4JTools.updateOntologyShaclGraph(ID, stream, "Onto"); + + Alert okImport = new Alert(Alert.AlertType.INFORMATION); + okImport.setGraphic(new ImageView(UITools.getImage("resources/images/valid.png"))); + okImport.setHeaderText(null); + okImport.setTitle("Uploading SHACL file"); + okImport.setContentText("File transmitted..."); + okImport.initModality(Modality.APPLICATION_MODAL); + okImport.initOwner(MainApp.primaryStage); + okImport.showAndWait(); + + } catch (IOException ex) { + MainApp.logger.error(ex.getMessage()); + } + }); + }).start(); + }; + }); + }); + + MenuItem downloadSHACLConstraints = new MenuItem("Download SHACL"); + downloadSHACLConstraints.setGraphic(new ImageView(UITools.getImage("resources/images/file-export-16.png"))); + downloadSHACLConstraints.setOnAction(event -> { + Ontology onto = MainApp.getOntologyControler().getCurrentOntology(); + Platform.runLater(() -> { + String ID = Tools.normalize(onto.getName().get()); + FileChooser fileChooser = new FileChooser(); + fileChooser.setTitle("Choose name for SHACL destination constraints file"); + fileChooser.setInitialFileName(ID + "_SHACL_Constraints.ttl"); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Turtle file (*.ttl)", "*.ttl")); + File shaclConstraintsFile = fileChooser.showSaveDialog(MainApp.primaryStage); + if (shaclConstraintsFile != null) { + new Thread(() -> { + Platform.runLater(() -> { + try { + OutputStream stream = new FileOutputStream(shaclConstraintsFile); + + RDF4JTools.downloadShaclGraph(ID, stream, "Onto"); + + 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("File downloaded..."); + okImport.initModality(Modality.APPLICATION_MODAL); + okImport.initOwner(MainApp.primaryStage); + okImport.showAndWait(); + + } catch (IOException ex) { + MainApp.logger.error(ex.getMessage()); + } + }); + }).start(); + }; + }); + }); + + menu.getItems().add(uploadSHACLConstraints); + menu.getItems().add(downloadSHACLConstraints); + + this.setContextMenu(menu); } else { setText(item.toString()); setEditable(false); diff --git a/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java b/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java index 2613c50dcddbc14a54bd64f381a89a8b0a1242ab..a732581e80ae54b7f4b13c0325bb99d9b9f6c8f1 100644 --- a/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java +++ b/src/main/java/fr/inra/po2vocabmanager/view/RootLayoutController.java @@ -65,7 +65,7 @@ public class RootLayoutController { @FXML MenuItem itemPublish; @FXML - MenuItem itemSCHACLValidation; + MenuItem itemSHACLValidation; @FXML MenuItem itemSem; @FXML @@ -101,8 +101,8 @@ public class RootLayoutController { itemOpen.setDisable(true); itemPublish.setDisable(true); itemPublish.setVisible(true); - itemSCHACLValidation.setDisable(true); - itemSCHACLValidation.setVisible(true); + itemSHACLValidation.setDisable(true); + itemSHACLValidation.setVisible(true); itemImportExport.setVisible(true); itemExportOnto.setDisable(true); itemImportOnto.setDisable(true); @@ -135,7 +135,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.onDataViewProperty().not()); + itemSHACLValidation.disableProperty().bind(mainApp.onDataViewProperty().not()); // itemImportExport.visibleProperty().bind(mainApp.onOntologyViewProperty()); itemExportOnto.disableProperty().bind(mainApp.onOntologyViewProperty().not()); diff --git a/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml b/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml index 73754c1296a5a7e4527cc45660fa407c6d86ea53..75dcf39400dd85534a61c60917d1375d993580b3 100644 --- a/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml +++ b/src/main/resources/fr/inra/po2vocabmanager/view/RootLayout.fxml @@ -58,7 +58,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 & Publish" visible="false" /> - <MenuItem fx:id="itemSCHACLValidation" mnemonicParsing="false" onAction="#startSHACLValidation" text="Start SHACL Validation" /> + <MenuItem fx:id="itemSHACLValidation" 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" /> diff --git a/src/main/resources/resources/changelog.txt b/src/main/resources/resources/changelog.txt index 59179ecf706111b01c814f0f46052c4fdc72083d..5b84b9c24a8b81b20d6013bbbe1e6841e2a3f23a 100644 --- a/src/main/resources/resources/changelog.txt +++ b/src/main/resources/resources/changelog.txt @@ -1,3 +1,6 @@ + ------------------ NEXT --------------------- + * Enhancement (PO2-Tools/po2manager#86) : Ajout de la gestion des contraintes shacl sur les ontologies + ------------------ V1.8.6.5 --------------------- * Bug Fix (PO2-Tools/po2manager#109) : L'arbre des concepts n'est pas toujours à jours après des copies / déplacements de concepts * Bug Fix (PO2-Tools/po2-engine#65) : Erreur de type sur certains tableaux lors de l'import d'un projet