From fa15a250af43f259db8dcfbf8eac2e7cf8260257 Mon Sep 17 00:00:00 2001 From: Alrick Oudot <alrick.oudot@supagro.fr> Date: Tue, 23 Jul 2024 11:26:28 +0200 Subject: [PATCH 1/3] Adding observation import from XLSX for Step and Itinerary --- .../po2vocabmanager/utils/DataTreeCell.java | 88 ++++++++++++++----- 1 file changed, 66 insertions(+), 22 deletions(-) diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java index 7f93baf9..da3f7e67 100644 --- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java +++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java @@ -39,6 +39,7 @@ import javafx.scene.paint.Color; import javafx.scene.text.Text; import javafx.stage.FileChooser; import javafx.stage.Modality; +import javafx.stage.Stage; import javafx.util.Callback; import javafx.util.Pair; import org.apache.commons.codec.digest.DigestUtils; @@ -883,10 +884,7 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { importObs.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); importObs.setOnAction(event -> { ObservationFile file = (ObservationFile) item.getFile(); - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle("Import file"); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)","*.xlsx")); - File fileImport = fileChooser.showOpenDialog(mainApp.primaryStage); + File fileImport = getFile(mainApp.primaryStage); if (fileImport != null) { MainApp.logger.info("start importing file " + fileImport.getName()); // temp obs file @@ -1053,6 +1051,14 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { }); menu.getItems().add(newObs); + MenuItem addNewStepObservationFromCsv = new MenuItem("Import New Observation from CSV"); + addNewStepObservationFromCsv.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation_csv.png"))); + addNewStepObservationFromCsv.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + addNewStepObservationFromCsv.setOnAction(event -> { + newStepObsImport(s); + }); + menu.getItems().add(addNewStepObservationFromCsv); + MenuItem newMix = new MenuItem("Add Composition"); newMix.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/composition.png"))); newMix.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); @@ -1420,6 +1426,15 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { }); + MenuItem addNewItineraryObservationFromCsv = new MenuItem("Import New Observation from CSV"); + addNewItineraryObservationFromCsv.setGraphic(new ImageView(UITools.getImage("resources/images/treeview/observation_csv.png"))); + addNewItineraryObservationFromCsv.disableProperty().bind(Bindings.not(mainApp.getEditProperty())); + addNewItineraryObservationFromCsv.setOnAction(event -> { + ItineraryFile iti = (ItineraryFile) item.getFile(); + newItineraryObsImport(iti); + }); + + menu.getItems().add(addNewItineraryObservationFromCsv); menu.getItems().add(addProcessStep); menu.getItems().add(addProcessStepFromCSV); menu.getItems().add(addProcessExistingStep); @@ -1435,11 +1450,48 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { } } - private static void newStepImport(ItineraryFile iti) { + private void newStepObsImport(StepFile step) { + File fileImport = getFile(MainApp.primaryStage); + if (fileImport == null) { + return; + } + MainApp.logger.info("start importing file " + fileImport.getName()); + Boolean importReport = step.checkImportStepObservationFromXLSX(fileImport); + if(importReport) { + ObservationFile obs = step.importStepObservationFromXLSX(fileImport); + handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), importReport, "File import completed"); + MainApp.getDataControler().selectNode(obs); + } else { + showErrorImportAlert(importReport.toString()); + } + } + + private static void newItineraryObsImport(ItineraryFile iti) { + File fileImport = getFile(MainApp.primaryStage); + if (fileImport == null) { + return; + } + MainApp.logger.info("start importing file " + fileImport.getName()); + Boolean importReport = iti.checkImportItineraryObservationFromXLSX(fileImport); + if(importReport) { + ObservationFile obs = iti.importItineraryObservationFromXLSX(fileImport); + handleInterfaceUpdate(obs.getItineraryFile().getProcessFile(), importReport, importReport.toString()); + MainApp.getDataControler().selectNode(obs); + + } else { + showErrorImportAlert(importReport.toString()); + } + } + + private static File getFile(Stage primaryStage) { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Import file"); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)","*.xlsx")); - File fileImport = fileChooser.showOpenDialog(MainApp.primaryStage); + fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)", "*.xlsx")); + return fileChooser.showOpenDialog(primaryStage); + } + + private static void newStepImport(ItineraryFile iti) { + File fileImport = getFile(MainApp.primaryStage); if (fileImport == null) { return; } @@ -1447,18 +1499,15 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { ImportReport importReport = iti.checkImportStepFromXLSX(fileImport); if(importReport.success()) { StepFile step = iti.importStepFromXLSX(fileImport); - handleInterfaceUpdate(step, importReport.success(), importReport.toString()); + handleInterfaceUpdate(step.getGeneralFile(), importReport.success(), importReport.toString()); } else { showErrorImportAlert(importReport.toString()); } } private static void stepImport(StepFile file, boolean isNewStep) { - FileChooser fileChooser = new FileChooser(); - fileChooser.setTitle("Import file"); - fileChooser.getExtensionFilters().add(new FileChooser.ExtensionFilter("Xlsx files (*.xlsx)","*.xlsx")); - File fileImport = fileChooser.showOpenDialog(MainApp.primaryStage); - if (fileImport != null) { + File fileImport = getFile(MainApp.primaryStage); + if (fileImport != null) { MainApp.logger.info("start importing file " + fileImport.getName()); ImportReport importReport = file.realPreConst(fileImport, isNewStep); if(importReport.success()) { @@ -1546,8 +1595,8 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { if (isNewStep || result.isPresent() && result.get() == importButtonType) { // l'utilisateur valide la la mise à jour Report report = file.constructDataFromImport(fileImport, isNewStep); - handleInterfaceUpdate(file, report.success(), report.toString()); - } else { + handleInterfaceUpdate(file.getGeneralFile(), report.success(), report.toString()); + MainApp.getDataControler().selectNode(file); } } else { @@ -1557,20 +1606,15 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { } } - private static void handleInterfaceUpdate(StepFile file, boolean reportBoolean, String reportString) { + private static void handleInterfaceUpdate(GeneralFile file, boolean reportBoolean, String reportString) { if(reportBoolean) { - updateAndNotifyInterfaceOfModification(file); + MainApp.getDataControler().buildProcessTree(file); showOkImportAlert(); } else { showErrorImportAlert(reportString); } } - private static void updateAndNotifyInterfaceOfModification(StepFile file) { - MainApp.getDataControler().buildProcessTree(file.getGeneralFile()); - MainApp.getDataControler().selectNode(file); - } - private static void showErrorImportAlert(String report) { Alert errorImport = new Alert(Alert.AlertType.ERROR); errorImport.setTitle("Import error"); -- GitLab From 85a7f5761723d75712b25b172b8c4c16567f74e6 Mon Sep 17 00:00:00 2001 From: stephane <stephane.dervaux@inrae.fr> Date: Thu, 25 Jul 2024 13:43:07 +0200 Subject: [PATCH 2/3] =?UTF-8?q?mouve=20the=20uuid=20check=20on=20update=20?= =?UTF-8?q?obs=20into=20PO=C2=B2Engine?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../po2vocabmanager/utils/DataTreeCell.java | 116 ++++++++---------- 1 file changed, 52 insertions(+), 64 deletions(-) diff --git a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java index da3f7e67..46cab511 100644 --- a/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java +++ b/src/main/java/fr/inra/po2vocabmanager/utils/DataTreeCell.java @@ -317,6 +317,23 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { } + private static void newItineraryObsImport(ItineraryFile iti) { + File fileImport = getFile(MainApp.primaryStage); + if (fileImport == null) { + return; + } + MainApp.logger.info("start importing/create file " + fileImport.getName()); + Report r = iti.checkCreateObservationFromXLSX(fileImport); + if(r.success()) { + ObservationFile obs = iti.createObservationFromXLSX(fileImport); + handleInterfaceUpdate(obs.getItineraryFile().getProcessFile(), r.success(), "File import completed"); + MainApp.getDataControler().selectNode(obs); + MainApp.logger.info("import done with sucess"); + } else { + showErrorImportAlert(r.prettyPrintError()); + } + } + @Override public void updateItem(DataNode item, boolean empty) { super.updateItem(item, empty); @@ -443,18 +460,18 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { Alert errorImport = new Alert(Alert.AlertType.INFORMATION); errorImport.setTitle("IMPORT RESULT"); errorImport.setHeaderText("Number of errors by type, complete list of errors, complete list of warning.\n\"Download log file\" for an exhaustive list of warnings and errors.\n\"Download Help file\" for your file with highlighted problematic cells in yellow or orange."); - errorImport.setResizable(true); + errorImport.setResizable(true); //TextArea ta = new TextArea(finalReport.prettyPrintInfos()); TreeItem<String> tiInfos = new TreeItem<String> ("Errors and warnings by categories"); tiInfos.setExpanded(true); tiInfos.getChildren().add(new TreeItem<String> (finalReport.prettyPrintInfos())); - - TreeItem<String> tiErrors = new TreeItem<String> ("List of errors"); + + TreeItem<String> tiErrors = new TreeItem<String> ("List of errors"); tiErrors.setExpanded(false); tiErrors.getChildren().add(new TreeItem<String> (finalReport.prettyPrintError())); - TreeItem<String> tiWarnings = new TreeItem<String> ("List of warning"); + TreeItem<String> tiWarnings = new TreeItem<String> ("List of warning"); tiWarnings.setExpanded(false); tiWarnings.getChildren().add(new TreeItem<String> (finalReport.prettyPrintWarning())); @@ -476,7 +493,7 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { rootItem.getChildren().add(tiErrors); rootItem.getChildren().add(tiWarnings); TreeView<String> tv = new TreeView<String> (rootItem); - tv.showRootProperty().set(false); + tv.showRootProperty().set(false); errorImport.getDialogPane().setContent(tv); ButtonType saveLog = new ButtonType("Download log file", javafx.scene.control.ButtonBar.ButtonData.LEFT); @@ -563,13 +580,13 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { 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 start = Instant.now(); //... - //Instant finish = 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); @@ -604,7 +621,7 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { Platform.runLater(() -> { try { OutputStream stream = new FileOutputStream(schaclConstraintsFile); - + RDF4JTools.downloadShaclGraph(repositoryID, stream); Alert okImport = new Alert(Alert.AlertType.INFORMATION); @@ -886,44 +903,31 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { ObservationFile file = (ObservationFile) item.getFile(); File fileImport = getFile(mainApp.primaryStage); if (fileImport != null) { - MainApp.logger.info("start importing file " + fileImport.getName()); + MainApp.logger.info("start importing/update file " + fileImport.getName()); // temp obs file ObservationFile tempF = null; if(file.getStepFile() != null) { - tempF = new ObservationFile(file.getStepFile()); + Report r = file.getStepFile().checkUpdateObservationFromXLSX(fileImport, file); + if(r.success()) { + file.getStepFile().updateObservationFromXLSX(fileImport, file); + MainApp.getDataControler().refreshTree(); + MainApp.getDataControler().showNodeDetails(file, file); + MainApp.logger.info("import done with sucess"); + } else { + showErrorImportAlert(r.prettyPrintError()); + } } if(file.getItineraryFile() != null) { - tempF = new ObservationFile((file.getItineraryFile())); - } - if(tempF.constructDataFromImport(fileImport)) { - if(tempF.getUuid().equalsIgnoreCase(file.getUuid())) { - // ok on peut importer - if(file.constructDataFromImport(fileImport)) { - // on rachaichi l'arbre - MainApp.getDataControler().refreshTree(); - // on rafraichi l'observation - MainApp.getDataControler().showNodeDetails(file, file); - if(file.getStepFile() != null) { - file.getStepFile().getGeneralFile().getData().setModified(true); - } else { - if(file.getItineraryFile() != null) { - file.getItineraryFile().getProcessFile().getData().setModified(true); - } - } - } + Report r = file.getItineraryFile().checkUpdateObservationFromXLSX(fileImport, file); + if(r.success()) { + file.getItineraryFile().updateObservationFromXLSX(fileImport, file); + MainApp.getDataControler().refreshTree(); + MainApp.getDataControler().showNodeDetails(file, file); + MainApp.logger.info("import done with sucess"); } else { - // error lors de l'import - showErrorImportAlert("Bad UUID file. You are trying to import on a wrong observation file"); + showErrorImportAlert(r.prettyPrintError()); } - } else { - // error lors de l'import - showErrorImportAlert("An error occured. Please check your import file"); } - - if(tempF != null) { - tempF.removeFile(); - } - } }); menu.getItems().add(importObs); @@ -1434,11 +1438,11 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { newItineraryObsImport(iti); }); - menu.getItems().add(addNewItineraryObservationFromCsv); menu.getItems().add(addProcessStep); menu.getItems().add(addProcessStepFromCSV); menu.getItems().add(addProcessExistingStep); menu.getItems().add(newObsIti); + menu.getItems().add(addNewItineraryObservationFromCsv); menu.getItems().add(new SeparatorMenuItem()); menu.getItems().add(delItinerary); break; @@ -1455,31 +1459,15 @@ public class DataTreeCell extends TextFieldTreeCell<DataNode> { if (fileImport == null) { return; } - MainApp.logger.info("start importing file " + fileImport.getName()); - Boolean importReport = step.checkImportStepObservationFromXLSX(fileImport); - if(importReport) { - ObservationFile obs = step.importStepObservationFromXLSX(fileImport); - handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), importReport, "File import completed"); - MainApp.getDataControler().selectNode(obs); - } else { - showErrorImportAlert(importReport.toString()); - } - } - - private static void newItineraryObsImport(ItineraryFile iti) { - File fileImport = getFile(MainApp.primaryStage); - if (fileImport == null) { - return; - } - MainApp.logger.info("start importing file " + fileImport.getName()); - Boolean importReport = iti.checkImportItineraryObservationFromXLSX(fileImport); - if(importReport) { - ObservationFile obs = iti.importItineraryObservationFromXLSX(fileImport); - handleInterfaceUpdate(obs.getItineraryFile().getProcessFile(), importReport, importReport.toString()); + MainApp.logger.info("start importing/create file " + fileImport.getName()); + Report r = step.checkCreateObservationFromXLSX(fileImport); + if(r.success()) { + ObservationFile obs = step.createObservationFromXLSX(fileImport); + handleInterfaceUpdate(obs.getStepFile().getGeneralFile(), r.success(), "File import completed"); MainApp.getDataControler().selectNode(obs); - + MainApp.logger.info("import done with sucess"); } else { - showErrorImportAlert(importReport.toString()); + showErrorImportAlert(r.prettyPrintError()); } } -- GitLab From 86c555e641f0eefcbd8ab1b91fbda6b4119b83a8 Mon Sep 17 00:00:00 2001 From: stephane <stephane.dervaux@inrae.fr> Date: Thu, 25 Jul 2024 14:30:20 +0200 Subject: [PATCH 3/3] add missing obs csv png file --- .../resources/images/treeview/observation_csv.png | Bin 0 -> 740 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/resources/resources/images/treeview/observation_csv.png diff --git a/src/main/resources/resources/images/treeview/observation_csv.png b/src/main/resources/resources/images/treeview/observation_csv.png new file mode 100644 index 0000000000000000000000000000000000000000..d496ff88dae5c5e5ecd4e403e1d19758fb84eba4 GIT binary patch literal 740 zcmV<A0vr8_P)<h;3K|Lk000e1NJLTq000mG000mO1^@s6AM^iV00009a7bBm0001X z0001X0Zw}+2mk;88FWQhbW?9;ba!ELWdL_~cP?peYja~^aAhuUa%Y?FJQ@H10&z)1 zK~y-6eUnQ_)KM74f9LNIl_g`6W|}?dWr>iai%Oe<f-;H-C(2$#R0}l<a)cJ)rlxjj zw8+}@A|{HmNQ%@7dJvRINKm4+u&@%-)JaUg7W4N}nBVHVmvhcN2kw!XF*yF3K$aX8 z0zM!CXainIR9s&ftYVarnc=_Tk8<MYoHpYypwWQ9jd0h5J(U}d_l&%B09^7Bm;4s9 zLuR(gOa~B8U2NX?N#SdyrKQea4)Ustv*hSyglre=Tl2wCUZ{U0$p5&cL~s(ojQr55 z;I$zKZe{^*M<WA-e8C`aJMtt&|3>fu7+f5UJY-dzkMPOb_3&u)uz-js;;s3AWPpJI zYZ}z*8|RriEMT-pvM6yZ0Xa-}*Zz)h_m`0oo&%WJKBj;vKeE}o`|HYjhXf=ldOO0@ zl|9OdnK9*qq;rzIlGaG7lyrMR-qI6q&Q|Yjef<$Lr(BXp(p5=m&h?eSs@kF}ZJi&# zlfK_Kci!d<-<G?D*>ZF%c78%f+Mev#<m`n32{qlT$6>$&<N&!qqes#_ATF~cw<a!i z`s$?Y`KdtVgsGE>PW0}WwJwc`@i8b$JSh(GyRZLj+~TCiZ4E7V%<Pu~!~#?YE^jp> zAMpyXoKt@Kx_hl^XT?CnrDtd27A6*qn>?P@*Pqn$wR6>?UCTNk@_}N3R$!Z%-INry zq9iw_-|I>Crl-8GT3>zv@R-@Q_$4V1Bxmi9##T1oDljL?vk$k8$AB<UN2GyCKo?LC z{B*?uG69>tKHdDa0rS@e+BH~bNh!cgpvlZyBqam0-1BD_BOqgK#qQ<axzkD|3;hA< WCGD<)ynSZ?0000<MNUMnLSTZ`I$7-i literal 0 HcmV?d00001 -- GitLab