diff --git a/.classpath b/.classpath index 1f3a0f9..1e64e60 100644 --- a/.classpath +++ b/.classpath @@ -6,5 +6,52 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ECOLIISO.batch b/ECOLIISO.batch new file mode 100644 index 0000000..c597512 Binary files /dev/null and b/ECOLIISO.batch differ diff --git a/ECOLIISO.cfg b/ECOLIISO.cfg new file mode 100644 index 0000000..65e499b Binary files /dev/null and b/ECOLIISO.cfg differ diff --git a/ECOLIISO.dat b/ECOLIISO.dat new file mode 100644 index 0000000..665a849 Binary files /dev/null and b/ECOLIISO.dat differ diff --git a/ECOLIISO.meta b/ECOLIISO.meta new file mode 100644 index 0000000..73d8c23 --- /dev/null +++ b/ECOLIISO.meta @@ -0,0 +1,16 @@ +RecordId +SampleId +DateOfSampling +DateOfReceiptSourceLab +DateOfReceiptReferenceLab +Gender=M,F,UNK +Age +AgeMonth +SampleOrigin +Specimen +PlaceOfResidence +Imported=Y,N,UNK +ProbableCountryOfInfection +Serotype +WgsProtocol=MISEQ_2X300,MISEQ_2x250,MISEQ_2X150,NEXTSEQ_2X150,HISEQ_2X100,MINISEQ_2X150,IONTORRENT +WgsAssembler=SPADES,VELVET,MAP_TO_LOCI1 \ No newline at end of file diff --git a/ERC000028.txt b/ERC000028.txt new file mode 100644 index 0000000..0e365c1 --- /dev/null +++ b/ERC000028.txt @@ -0,0 +1,7 @@ +serovar +collected_by +collection_date +country +host_associated +specific_host +host_disease_status \ No newline at end of file diff --git a/ERC000028b.txt b/ERC000028b.txt new file mode 100644 index 0000000..4b9a898 --- /dev/null +++ b/ERC000028b.txt @@ -0,0 +1,8 @@ +serovar +collected_by +collection_date +country +host_associated +specific_host +host_disease_status +test diff --git a/ERC000044.txt b/ERC000044.txt new file mode 100644 index 0000000..ef7728e --- /dev/null +++ b/ERC000044.txt @@ -0,0 +1,4 @@ +collection_date +collected_by +geographic location (country and/or sea) +host scientific name \ No newline at end of file diff --git a/ERC000045.txt b/ERC000045.txt new file mode 100644 index 0000000..2f801c8 --- /dev/null +++ b/ERC000045.txt @@ -0,0 +1,2 @@ +collection_date +isolation_source \ No newline at end of file diff --git a/LISTISO.batch b/LISTISO.batch new file mode 100644 index 0000000..cbd3bb4 Binary files /dev/null and b/LISTISO.batch differ diff --git a/LISTISO.cfg b/LISTISO.cfg new file mode 100644 index 0000000..cebf739 Binary files /dev/null and b/LISTISO.cfg differ diff --git a/LISTISO.dat b/LISTISO.dat new file mode 100644 index 0000000..061ca12 Binary files /dev/null and b/LISTISO.dat differ diff --git a/LISTISO.meta b/LISTISO.meta new file mode 100644 index 0000000..4e9875c --- /dev/null +++ b/LISTISO.meta @@ -0,0 +1,15 @@ +RecordId +SampleId +DateOfSampling +DateOfReceiptSourceLab +DateOfReceiptReferenceLab +Gender=M,F,UNK +Age +AgeMonth +SampleOrigin +Specimen +PlaceOfResidence +Imported=Y,N,UNK +ProbableCountryOfInfection +WgsProtocol=MISEQ_2X300,MISEQ_2x250,MISEQ_2X150,NEXTSEQ_2X150,HISEQ_2X100,MINISEQ_2X150,IONTORRENT +WgsAssembler=SPADES,VELVET,MAP_TO_LOCI1 \ No newline at end of file diff --git a/SALMISO.batch b/SALMISO.batch new file mode 100644 index 0000000..c597512 Binary files /dev/null and b/SALMISO.batch differ diff --git a/SALMISO.cfg b/SALMISO.cfg new file mode 100644 index 0000000..3f43da5 Binary files /dev/null and b/SALMISO.cfg differ diff --git a/SALMISO.dat b/SALMISO.dat new file mode 100644 index 0000000..c5f1937 Binary files /dev/null and b/SALMISO.dat differ diff --git a/SALMISO.meta b/SALMISO.meta new file mode 100644 index 0000000..41b38c0 --- /dev/null +++ b/SALMISO.meta @@ -0,0 +1,16 @@ +RecordId +SampleId +DateOfSampling +DateOfReceiptSourceLab +DateOfReceiptReferenceLab +Gender=M,F,UNK +Age +AgeMonth +SampleOrigin +Specimen +PlaceOfResidence +Imported +ProbableCountryOfInfection +Serotype +WgsProtocol=MISEQ_2X300,MISEQ_2x250,MISEQ_2X150,NEXTSEQ_2X150,HISEQ_2X100,MINISEQ_2X150,IONTORRENT +WgsAssembler=SPADES,VELVET,MAP_TO_LOCI1 diff --git a/TESSy b/TESSy new file mode 100644 index 0000000..745c145 --- /dev/null +++ b/TESSy @@ -0,0 +1,8 @@ +DateUsedForStatistics +ReportingCountry +Gender +Age +Imported +DateOfSampling +DateOfReceiptReferenceLab +ProbableCountryOfInfection diff --git a/TessyIsolate.zip b/TessyIsolate.zip new file mode 100644 index 0000000..d387ed1 Binary files /dev/null and b/TessyIsolate.zip differ diff --git a/bin/eu/europa/ecdc/enauploader/CsvOutputHandler.class b/bin/eu/europa/ecdc/enauploader/CsvOutputHandler.class new file mode 100644 index 0000000..704ff21 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/CsvOutputHandler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ENAUtils.class b/bin/eu/europa/ecdc/enauploader/ENAUtils.class index 11d269c..32fb3fe 100644 Binary files a/bin/eu/europa/ecdc/enauploader/ENAUtils.class and b/bin/eu/europa/ecdc/enauploader/ENAUtils.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI$1.class b/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI$1.class new file mode 100644 index 0000000..a6da526 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI$2.class b/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI$2.class new file mode 100644 index 0000000..f97fa4e Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI$2.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI.class b/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI.class new file mode 100644 index 0000000..e8e1100 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ENAuploaderGUI.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ENAuploaderMain.class b/bin/eu/europa/ecdc/enauploader/ENAuploaderMain.class index 02a0152..905f5dc 100644 Binary files a/bin/eu/europa/ecdc/enauploader/ENAuploaderMain.class and b/bin/eu/europa/ecdc/enauploader/ENAuploaderMain.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcAutomationWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcAutomationWorker.class new file mode 100644 index 0000000..a08b089 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcAutomationWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcFullUploadWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcFullUploadWorker.class new file mode 100644 index 0000000..4741fe5 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcFullUploadWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcImportWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcImportWorker.class new file mode 100644 index 0000000..610fbbe Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcImportWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcJob.class b/bin/eu/europa/ecdc/enauploader/EcdcJob.class new file mode 100644 index 0000000..bf87d59 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcJob.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcJobHandler.class b/bin/eu/europa/ecdc/enauploader/EcdcJobHandler.class new file mode 100644 index 0000000..fea33ac Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcJobHandler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcJobPanel.class b/bin/eu/europa/ecdc/enauploader/EcdcJobPanel.class new file mode 100644 index 0000000..37fe948 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcJobPanel.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcLinkWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcLinkWorker.class new file mode 100644 index 0000000..320d937 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcLinkWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcSftpUploadWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcSftpUploadWorker.class new file mode 100644 index 0000000..0786645 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcSftpUploadWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcTessyApprovalWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcTessyApprovalWorker.class new file mode 100644 index 0000000..2c0756e Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcTessyApprovalWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcTessyCreateAndTestWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcTessyCreateAndTestWorker.class new file mode 100644 index 0000000..a609491 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcTessyCreateAndTestWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcTessyRejectWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcTessyRejectWorker.class new file mode 100644 index 0000000..5912caf Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcTessyRejectWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcTessyUploadWorker.class b/bin/eu/europa/ecdc/enauploader/EcdcTessyUploadWorker.class new file mode 100644 index 0000000..d24b19b Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcTessyUploadWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$1.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$1.class new file mode 100644 index 0000000..25cc53b Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$10$1.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$10$1.class new file mode 100644 index 0000000..fa03cb3 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$10$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$10.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$10.class new file mode 100644 index 0000000..fab918d Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$10.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$2.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$2.class new file mode 100644 index 0000000..7701fa9 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$2.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$3.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$3.class new file mode 100644 index 0000000..bb1be76 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$3.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$4.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$4.class new file mode 100644 index 0000000..7599b7b Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$4.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$5$1.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$5$1.class new file mode 100644 index 0000000..829c7fa Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$5$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$5.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$5.class new file mode 100644 index 0000000..4daf6a8 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$5.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$6.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$6.class new file mode 100644 index 0000000..07c431f Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$6.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$7.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$7.class new file mode 100644 index 0000000..8ba344d Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$7.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$8.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$8.class new file mode 100644 index 0000000..450bb62 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$8.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$9$1.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$9$1.class new file mode 100644 index 0000000..0848ae3 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$9$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$9.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$9.class new file mode 100644 index 0000000..aad0f5f Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI$9.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI.class b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI.class new file mode 100644 index 0000000..f28840e Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUploaderGUI.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUtils$1.class b/bin/eu/europa/ecdc/enauploader/EcdcUtils$1.class new file mode 100644 index 0000000..0551c66 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUtils$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUtils$2.class b/bin/eu/europa/ecdc/enauploader/EcdcUtils$2.class new file mode 100644 index 0000000..d2e3b6a Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUtils$2.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EcdcUtils.class b/bin/eu/europa/ecdc/enauploader/EcdcUtils.class new file mode 100644 index 0000000..fd86e07 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EcdcUtils.class differ diff --git a/bin/eu/europa/ecdc/enauploader/EnaSubmissionWorker.class b/bin/eu/europa/ecdc/enauploader/EnaSubmissionWorker.class new file mode 100644 index 0000000..a970ff2 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/EnaSubmissionWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ExcelAdapter.class b/bin/eu/europa/ecdc/enauploader/ExcelAdapter.class new file mode 100644 index 0000000..627056b Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ExcelAdapter.class differ diff --git a/bin/eu/europa/ecdc/enauploader/Experiment.class b/bin/eu/europa/ecdc/enauploader/Experiment.class index 2322dfa..e22a169 100644 Binary files a/bin/eu/europa/ecdc/enauploader/Experiment.class and b/bin/eu/europa/ecdc/enauploader/Experiment.class differ diff --git a/bin/eu/europa/ecdc/enauploader/GhostEntryCreator.class b/bin/eu/europa/ecdc/enauploader/GhostEntryCreator.class new file mode 100644 index 0000000..d3800cc Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/GhostEntryCreator.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportConfig.class b/bin/eu/europa/ecdc/enauploader/ImportConfig.class new file mode 100644 index 0000000..a9f2cd9 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportConfig.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportConfigGUI.class b/bin/eu/europa/ecdc/enauploader/ImportConfigGUI.class new file mode 100644 index 0000000..d63cddc Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportConfigGUI.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportConfigHandler.class b/bin/eu/europa/ecdc/enauploader/ImportConfigHandler.class new file mode 100644 index 0000000..b6c3056 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportConfigHandler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportMapPanel$1.class b/bin/eu/europa/ecdc/enauploader/ImportMapPanel$1.class new file mode 100644 index 0000000..7b7e113 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportMapPanel$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportMapPanel$2.class b/bin/eu/europa/ecdc/enauploader/ImportMapPanel$2.class new file mode 100644 index 0000000..a344dcc Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportMapPanel$2.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportMapPanel$3.class b/bin/eu/europa/ecdc/enauploader/ImportMapPanel$3.class new file mode 100644 index 0000000..ad19a83 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportMapPanel$3.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportMapPanel.class b/bin/eu/europa/ecdc/enauploader/ImportMapPanel.class new file mode 100644 index 0000000..c2fdaad Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportMapPanel.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportScheduler.class b/bin/eu/europa/ecdc/enauploader/ImportScheduler.class new file mode 100644 index 0000000..20b8aa6 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportScheduler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportSqlAuth.class b/bin/eu/europa/ecdc/enauploader/ImportSqlAuth.class new file mode 100644 index 0000000..d0df92a Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportSqlAuth.class differ diff --git a/bin/eu/europa/ecdc/enauploader/ImportTools.class b/bin/eu/europa/ecdc/enauploader/ImportTools.class new file mode 100644 index 0000000..17838ad Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/ImportTools.class differ diff --git a/bin/eu/europa/ecdc/enauploader/JCIFSEngine.class b/bin/eu/europa/ecdc/enauploader/JCIFSEngine.class new file mode 100644 index 0000000..033ae05 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/JCIFSEngine.class differ diff --git a/bin/eu/europa/ecdc/enauploader/JCIFSNTLMSchemeFactory.class b/bin/eu/europa/ecdc/enauploader/JCIFSNTLMSchemeFactory.class new file mode 100644 index 0000000..ee44a69 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/JCIFSNTLMSchemeFactory.class differ diff --git a/bin/eu/europa/ecdc/enauploader/JTableOutputHandler.class b/bin/eu/europa/ecdc/enauploader/JTableOutputHandler.class new file mode 100644 index 0000000..5154036 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/JTableOutputHandler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/JTextActionArea.class b/bin/eu/europa/ecdc/enauploader/JTextActionArea.class new file mode 100644 index 0000000..c4d8936 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/JTextActionArea.class differ diff --git a/bin/eu/europa/ecdc/enauploader/OutputHandler.class b/bin/eu/europa/ecdc/enauploader/OutputHandler.class new file mode 100644 index 0000000..abb0406 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/OutputHandler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/Run.class b/bin/eu/europa/ecdc/enauploader/Run.class index fab20cf..f3f58c4 100644 Binary files a/bin/eu/europa/ecdc/enauploader/Run.class and b/bin/eu/europa/ecdc/enauploader/Run.class differ diff --git a/bin/eu/europa/ecdc/enauploader/Submission.class b/bin/eu/europa/ecdc/enauploader/Submission.class index dfc2c98..ddc6e1a 100644 Binary files a/bin/eu/europa/ecdc/enauploader/Submission.class and b/bin/eu/europa/ecdc/enauploader/Submission.class differ diff --git a/bin/eu/europa/ecdc/enauploader/SubmissionWorker.class b/bin/eu/europa/ecdc/enauploader/SubmissionWorker.class new file mode 100644 index 0000000..30e4427 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/SubmissionWorker.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyBatch.class b/bin/eu/europa/ecdc/enauploader/TessyBatch.class new file mode 100644 index 0000000..0ffd90c Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyBatch.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyCredentials.class b/bin/eu/europa/ecdc/enauploader/TessyCredentials.class new file mode 100644 index 0000000..0d7b9e6 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyCredentials.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyIsolate$1.class b/bin/eu/europa/ecdc/enauploader/TessyIsolate$1.class new file mode 100644 index 0000000..dc835a9 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyIsolate$1.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyIsolate$DefaultTrustManager.class b/bin/eu/europa/ecdc/enauploader/TessyIsolate$DefaultTrustManager.class new file mode 100644 index 0000000..3d6459c Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyIsolate$DefaultTrustManager.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyIsolate.class b/bin/eu/europa/ecdc/enauploader/TessyIsolate.class new file mode 100644 index 0000000..927dfff Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyIsolate.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyUploader$DefaultTrustManager.class b/bin/eu/europa/ecdc/enauploader/TessyUploader$DefaultTrustManager.class new file mode 100644 index 0000000..ca3e335 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyUploader$DefaultTrustManager.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyUploader.class b/bin/eu/europa/ecdc/enauploader/TessyUploader.class new file mode 100644 index 0000000..1000be4 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyUploader.class differ diff --git a/bin/eu/europa/ecdc/enauploader/TessyValidationResult.class b/bin/eu/europa/ecdc/enauploader/TessyValidationResult.class new file mode 100644 index 0000000..41b452e Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/TessyValidationResult.class differ diff --git a/bin/eu/europa/ecdc/enauploader/UploadConfig.class b/bin/eu/europa/ecdc/enauploader/UploadConfig.class new file mode 100644 index 0000000..7dfa864 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/UploadConfig.class differ diff --git a/bin/eu/europa/ecdc/enauploader/UploadConfigGUI.class b/bin/eu/europa/ecdc/enauploader/UploadConfigGUI.class new file mode 100644 index 0000000..21bc1b2 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/UploadConfigGUI.class differ diff --git a/bin/eu/europa/ecdc/enauploader/UploadConfigHandler.class b/bin/eu/europa/ecdc/enauploader/UploadConfigHandler.class new file mode 100644 index 0000000..210931a Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/UploadConfigHandler.class differ diff --git a/bin/eu/europa/ecdc/enauploader/media/ECDC.png b/bin/eu/europa/ecdc/enauploader/media/ECDC.png new file mode 100644 index 0000000..d7a5918 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/media/ECDC.png differ diff --git a/bin/eu/europa/ecdc/enauploader/media/ECDC2.png b/bin/eu/europa/ecdc/enauploader/media/ECDC2.png new file mode 100644 index 0000000..2bd4fd0 Binary files /dev/null and b/bin/eu/europa/ecdc/enauploader/media/ECDC2.png differ diff --git a/checklist.txt b/checklist.txt new file mode 100644 index 0000000..8595181 --- /dev/null +++ b/checklist.txt @@ -0,0 +1 @@ +ERC000028 \ No newline at end of file diff --git a/doc/eu/europa/ecdc/enauploader/TessyBatch.html b/doc/eu/europa/ecdc/enauploader/TessyBatch.html new file mode 100644 index 0000000..7d26a65 --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/TessyBatch.html @@ -0,0 +1,377 @@ + + + + + +TessyBatch + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ +

Class TessyBatch

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • eu.europa.ecdc.enauploader.TessyBatch
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class TessyBatch
    +extends java.lang.Object
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        main

        +
        public static void main​(java.lang.String[] args)
        +
      • +
      + + + +
        +
      • +

        addIsolate

        +
        public void addIsolate​(TessyIsolate iso)
        +
      • +
      + + + +
        +
      • +

        setTessyCredentials

        +
        public void setTessyCredentials​(TessyCredentials c)
        +
      • +
      + + + + + + + +
        +
      • +

        reject

        +
        public void reject​()
        +
      • +
      + + + +
        +
      • +

        approve

        +
        public boolean approve​()
        +
      • +
      + + + +
        +
      • +

        upload

        +
        public boolean upload​()
        +
      • +
      + + + +
        +
      • +

        getValidation

        +
        public java.util.HashMap<java.lang.String,TessyValidationResult> getValidation​()
        +
      • +
      + + + +
        +
      • +

        checkValidation

        +
        public boolean checkValidation​()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/TessyCredentials.html b/doc/eu/europa/ecdc/enauploader/TessyCredentials.html new file mode 100644 index 0000000..0884d4c --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/TessyCredentials.html @@ -0,0 +1,391 @@ + + + + + +TessyCredentials + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ +

Class TessyCredentials

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • eu.europa.ecdc.enauploader.TessyCredentials
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class TessyCredentials
    +extends java.lang.Object
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      java.lang.StringgetDomain​() 
      java.lang.StringgetHostname​() 
      java.lang.StringgetPassword​() 
      java.lang.StringgetTarget​() 
      java.lang.StringgetUsername​() 
      voidsetDomain​(java.lang.String domain) 
      voidsetHostname​(java.lang.String hostname) 
      voidsetPassword​(java.lang.String password) 
      voidsetTarget​(java.lang.String target) 
      voidsetUsername​(java.lang.String username) 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        getUsername

        +
        public java.lang.String getUsername​()
        +
      • +
      + + + +
        +
      • +

        setUsername

        +
        public void setUsername​(java.lang.String username)
        +
      • +
      + + + +
        +
      • +

        getPassword

        +
        public java.lang.String getPassword​()
        +
      • +
      + + + +
        +
      • +

        setPassword

        +
        public void setPassword​(java.lang.String password)
        +
      • +
      + + + +
        +
      • +

        getDomain

        +
        public java.lang.String getDomain​()
        +
      • +
      + + + +
        +
      • +

        setDomain

        +
        public void setDomain​(java.lang.String domain)
        +
      • +
      + + + +
        +
      • +

        getHostname

        +
        public java.lang.String getHostname​()
        +
      • +
      + + + +
        +
      • +

        setHostname

        +
        public void setHostname​(java.lang.String hostname)
        +
      • +
      + + + +
        +
      • +

        getTarget

        +
        public java.lang.String getTarget​()
        +
      • +
      + + + +
        +
      • +

        setTarget

        +
        public void setTarget​(java.lang.String target)
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/TessyIsolate.DefaultTrustManager.html b/doc/eu/europa/ecdc/enauploader/TessyIsolate.DefaultTrustManager.html new file mode 100644 index 0000000..fe08fff --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/TessyIsolate.DefaultTrustManager.html @@ -0,0 +1,360 @@ + + + + + +TessyIsolate.DefaultTrustManager + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ +

Class TessyIsolate.DefaultTrustManager

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • eu.europa.ecdc.enauploader.TessyIsolate.DefaultTrustManager
    • +
    +
  • +
+
+
    +
  • +
    +
    All Implemented Interfaces:
    +
    javax.net.ssl.TrustManager, javax.net.ssl.X509TrustManager
    +
    +
    +
    Enclosing class:
    +
    TessyIsolate
    +
    +
    +
    +
    public static class TessyIsolate.DefaultTrustManager
    +extends java.lang.Object
    +implements javax.net.ssl.X509TrustManager
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      DefaultTrustManager​() 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidcheckClientTrusted​(java.security.cert.X509Certificate[] arg0, + java.lang.String arg1) 
      voidcheckServerTrusted​(java.security.cert.X509Certificate[] arg0, + java.lang.String arg1) 
      java.security.cert.X509Certificate[]getAcceptedIssuers​() 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        DefaultTrustManager

        +
        public DefaultTrustManager​()
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        checkClientTrusted

        +
        public void checkClientTrusted​(java.security.cert.X509Certificate[] arg0,
        +                               java.lang.String arg1)
        +                        throws java.security.cert.CertificateException
        +
        +
        Specified by:
        +
        checkClientTrusted in interface javax.net.ssl.X509TrustManager
        +
        Throws:
        +
        java.security.cert.CertificateException
        +
        +
      • +
      + + + +
        +
      • +

        checkServerTrusted

        +
        public void checkServerTrusted​(java.security.cert.X509Certificate[] arg0,
        +                               java.lang.String arg1)
        +                        throws java.security.cert.CertificateException
        +
        +
        Specified by:
        +
        checkServerTrusted in interface javax.net.ssl.X509TrustManager
        +
        Throws:
        +
        java.security.cert.CertificateException
        +
        +
      • +
      + + + +
        +
      • +

        getAcceptedIssuers

        +
        public java.security.cert.X509Certificate[] getAcceptedIssuers​()
        +
        +
        Specified by:
        +
        getAcceptedIssuers in interface javax.net.ssl.X509TrustManager
        +
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/TessyIsolate.html b/doc/eu/europa/ecdc/enauploader/TessyIsolate.html new file mode 100644 index 0000000..74da5d4 --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/TessyIsolate.html @@ -0,0 +1,428 @@ + + + + + +TessyIsolate + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ +

Class TessyIsolate

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • eu.europa.ecdc.enauploader.TessyIsolate
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class TessyIsolate
    +extends java.lang.Object
    +
  • +
+
+
+ +
+
+
    +
  • + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        setBatchId

        +
        public void setBatchId​(java.lang.String id)
        +
      • +
      + + + +
        +
      • +

        setField

        +
        public void setField​(java.lang.String key,
        +                     java.lang.String value)
        +
      • +
      + + + +
        +
      • +

        removeField

        +
        public void removeField​(java.lang.String key)
        +
      • +
      + + + +
        +
      • +

        getRecordId

        +
        public java.lang.String getRecordId​()
        +
      • +
      + + + + + + + + + + + +
        +
      • +

        reject

        +
        public void reject​()
        +
      • +
      + + + +
        +
      • +

        approve

        +
        public boolean approve​()
        +
      • +
      + + + +
        +
      • +

        upload

        +
        public boolean upload​()
        +
      • +
      + + + +
        +
      • +

        checkValidation

        +
        public boolean checkValidation​()
        +
      • +
      + + + +
        +
      • +

        generateIsolateXml

        +
        public java.util.ArrayList<java.lang.String> generateIsolateXml​()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/TessyValidationResult.html b/doc/eu/europa/ecdc/enauploader/TessyValidationResult.html new file mode 100644 index 0000000..93491a8 --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/TessyValidationResult.html @@ -0,0 +1,469 @@ + + + + + +TessyValidationResult + + + + + + + + + + + + + + +
+ + + + +
+ + + +
+ +

Class TessyValidationResult

+
+
+
    +
  • java.lang.Object
  • +
  • +
      +
    • eu.europa.ecdc.enauploader.TessyValidationResult
    • +
    +
  • +
+
+
    +
  • +
    +
    +
    public class TessyValidationResult
    +extends java.lang.Object
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Summary

      + + + + + + + + + + +
      Constructors 
      ConstructorDescription
      TessyValidationResult​(java.lang.String resultString) 
      +
    • +
    + +
      +
    • + + +

      Method Summary

      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
      All Methods Instance Methods Concrete Methods 
      Modifier and TypeMethodDescription
      voidaddError​(java.lang.String e) 
      voidaddRemark​(java.lang.String e) 
      voidaddWarning​(java.lang.String e) 
      intgetErrorNum​() 
      java.util.ArrayList<java.lang.String>getErrors​() 
      java.lang.StringgetGuid​() 
      intgetRemarkNum​() 
      java.util.ArrayList<java.lang.String>getRemarks​() 
      intgetWarningNum​() 
      java.util.ArrayList<java.lang.String>getWarnings​() 
      booleanpass​() 
      voidsetGuid​(java.lang.String g) 
      voidsetPass​(boolean b) 
      +
        +
      • + + +

        Methods inherited from class java.lang.Object

        +equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
      • +
      +
    • +
    +
  • +
+
+
+
    +
  • + +
      +
    • + + +

      Constructor Detail

      + + + +
        +
      • +

        TessyValidationResult

        +
        public TessyValidationResult​(java.lang.String resultString)
        +
      • +
      +
    • +
    + +
      +
    • + + +

      Method Detail

      + + + +
        +
      • +

        addError

        +
        public void addError​(java.lang.String e)
        +
      • +
      + + + +
        +
      • +

        addWarning

        +
        public void addWarning​(java.lang.String e)
        +
      • +
      + + + +
        +
      • +

        addRemark

        +
        public void addRemark​(java.lang.String e)
        +
      • +
      + + + +
        +
      • +

        setGuid

        +
        public void setGuid​(java.lang.String g)
        +
      • +
      + + + +
        +
      • +

        getGuid

        +
        public java.lang.String getGuid​()
        +
      • +
      + + + +
        +
      • +

        getErrorNum

        +
        public int getErrorNum​()
        +
      • +
      + + + +
        +
      • +

        getWarningNum

        +
        public int getWarningNum​()
        +
      • +
      + + + +
        +
      • +

        getRemarkNum

        +
        public int getRemarkNum​()
        +
      • +
      + + + +
        +
      • +

        getRemarks

        +
        public java.util.ArrayList<java.lang.String> getRemarks​()
        +
      • +
      + + + +
        +
      • +

        getWarnings

        +
        public java.util.ArrayList<java.lang.String> getWarnings​()
        +
      • +
      + + + +
        +
      • +

        getErrors

        +
        public java.util.ArrayList<java.lang.String> getErrors​()
        +
      • +
      + + + +
        +
      • +

        setPass

        +
        public void setPass​(boolean b)
        +
      • +
      + + + +
        +
      • +

        pass

        +
        public boolean pass​()
        +
      • +
      +
    • +
    +
  • +
+
+
+ + + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/class-use/TessyBatch.html b/doc/eu/europa/ecdc/enauploader/class-use/TessyBatch.html new file mode 100644 index 0000000..4ba8456 --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/class-use/TessyBatch.html @@ -0,0 +1,150 @@ + + + + + +Uses of Class eu.europa.ecdc.enauploader.TessyBatch + + + + + + + + + + + + + + +
+ + + + +
+ + +
+

Uses of Class
eu.europa.ecdc.enauploader.TessyBatch

+
+
No usage of eu.europa.ecdc.enauploader.TessyBatch
+ + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/class-use/TessyCredentials.html b/doc/eu/europa/ecdc/enauploader/class-use/TessyCredentials.html new file mode 100644 index 0000000..c74dc6e --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/class-use/TessyCredentials.html @@ -0,0 +1,177 @@ + + + + + +Uses of Class eu.europa.ecdc.enauploader.TessyCredentials + + + + + + + + + + + + + + +
+ + + + +
+ + +
+

Uses of Class
eu.europa.ecdc.enauploader.TessyCredentials

+
+
+ +
+ + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/class-use/TessyIsolate.DefaultTrustManager.html b/doc/eu/europa/ecdc/enauploader/class-use/TessyIsolate.DefaultTrustManager.html new file mode 100644 index 0000000..0197f5a --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/class-use/TessyIsolate.DefaultTrustManager.html @@ -0,0 +1,150 @@ + + + + + +Uses of Class eu.europa.ecdc.enauploader.TessyIsolate.DefaultTrustManager + + + + + + + + + + + + + + +
+ + + + +
+ + +
+

Uses of Class
eu.europa.ecdc.enauploader.TessyIsolate.DefaultTrustManager

+
+
No usage of eu.europa.ecdc.enauploader.TessyIsolate.DefaultTrustManager
+ + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/class-use/TessyIsolate.html b/doc/eu/europa/ecdc/enauploader/class-use/TessyIsolate.html new file mode 100644 index 0000000..95bb1a1 --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/class-use/TessyIsolate.html @@ -0,0 +1,177 @@ + + + + + +Uses of Class eu.europa.ecdc.enauploader.TessyIsolate + + + + + + + + + + + + + + +
+ + + + +
+ + +
+

Uses of Class
eu.europa.ecdc.enauploader.TessyIsolate

+
+
+ +
+ + + + + + diff --git a/doc/eu/europa/ecdc/enauploader/class-use/TessyValidationResult.html b/doc/eu/europa/ecdc/enauploader/class-use/TessyValidationResult.html new file mode 100644 index 0000000..4833c70 --- /dev/null +++ b/doc/eu/europa/ecdc/enauploader/class-use/TessyValidationResult.html @@ -0,0 +1,202 @@ + + + + + +Uses of Class eu.europa.ecdc.enauploader.TessyValidationResult + + + + + + + + + + + + + + +
+ + + + +
+ + +
+

Uses of Class
eu.europa.ecdc.enauploader.TessyValidationResult

+
+
+ +
+ + + + + + diff --git a/doc/help-doc.html b/doc/help-doc.html new file mode 100644 index 0000000..eae10aa --- /dev/null +++ b/doc/help-doc.html @@ -0,0 +1,251 @@ + + + + + +API Help + + + + + + + + + + + + + + +
+ + + + +
+ + +
+

How This API Document Is Organized

+
This API (Application Programming Interface) document has pages corresponding to the items in the navigation bar, described as follows.
+
+
+
    +
  • +

    Package

    +

    Each package has a page that contains a list of its classes and interfaces, with a summary for each. This page can contain six categories:

    +
      +
    • Interfaces (italic)
    • +
    • Classes
    • +
    • Enums
    • +
    • Exceptions
    • +
    • Errors
    • +
    • Annotation Types
    • +
    +
  • +
  • +

    Class/Interface

    +

    Each class, interface, nested class and nested interface has its own separate page. Each of these pages has three sections consisting of a class/interface description, summary tables, and detailed member descriptions:

    +
      +
    • Class inheritance diagram
    • +
    • Direct Subclasses
    • +
    • All Known Subinterfaces
    • +
    • All Known Implementing Classes
    • +
    • Class/interface declaration
    • +
    • Class/interface description
    • +
    +
      +
    • Nested Class Summary
    • +
    • Field Summary
    • +
    • Constructor Summary
    • +
    • Method Summary
    • +
    +
      +
    • Field Detail
    • +
    • Constructor Detail
    • +
    • Method Detail
    • +
    +

    Each summary entry contains the first sentence from the detailed description for that item. The summary entries are alphabetical, while the detailed descriptions are in the order they appear in the source code. This preserves the logical groupings established by the programmer.

    +
  • +
  • +

    Annotation Type

    +

    Each annotation type has its own separate page with the following sections:

    +
      +
    • Annotation Type declaration
    • +
    • Annotation Type description
    • +
    • Required Element Summary
    • +
    • Optional Element Summary
    • +
    • Element Detail
    • +
    +
  • +
  • +

    Enum

    +

    Each enum has its own separate page with the following sections:

    +
      +
    • Enum declaration
    • +
    • Enum description
    • +
    • Enum Constant Summary
    • +
    • Enum Constant Detail
    • +
    +
  • +
  • +

    Use

    +

    Each documented package, class and interface has its own Use page. This page describes what packages, classes, methods, constructors and fields use any part of the given class or package. Given a class or interface A, its Use page includes subclasses of A, fields declared as A, methods that return A, and methods and constructors with parameters of type A. You can access this page by first going to the package, class or interface, then clicking on the "Use" link in the navigation bar.

    +
  • +
  • +

    Tree (Class Hierarchy)

    +

    There is a Class Hierarchy page for all packages, plus a hierarchy for each package. Each hierarchy page contains a list of classes and a list of interfaces. The classes are organized by inheritance structure starting with java.lang.Object. The interfaces do not inherit from java.lang.Object.

    +
      +
    • When viewing the Overview page, clicking on "Tree" displays the hierarchy for all packages.
    • +
    • When viewing a particular package, class or interface page, clicking "Tree" displays the hierarchy for only that package.
    • +
    +
  • +
  • +

    Deprecated API

    +

    The Deprecated API page lists all of the API that have been deprecated. A deprecated API is not recommended for use, generally due to improvements, and a replacement API is usually given. Deprecated APIs may be removed in future implementations.

    +
  • +
  • +

    Index

    +

    The Index contains an alphabetic list of all classes, interfaces, constructors, methods, and fields.

    +
  • +
  • +

    Prev/Next

    +

    These links take you to the next or previous class, interface, package, or related page.

    +
  • +
  • +

    Frames/No Frames

    +

    These links show and hide the HTML frames. All pages are available with or without frames.

    +
  • +
  • +

    All Classes

    +

    The All Classes link shows all classes and interfaces except non-static nested types.

    +
  • +
  • +

    Serialized Form

    +

    Each serializable or externalizable class has a description of its serialization fields and methods. This information is of interest to re-implementors, not to developers using the API. While there is no link in the navigation bar, you can get to this information by going to any serialized class and clicking "Serialized Form" in the "See also" section of the class description.

    +
  • +
  • +

    Constant Field Values

    +

    The Constant Field Values page lists the static final fields and their values.

    +
  • +
+This help file applies to API documentation generated using the standard doclet.
+ + + + + + diff --git a/doc/resources/glass.png b/doc/resources/glass.png new file mode 100644 index 0000000..a7f591f Binary files /dev/null and b/doc/resources/glass.png differ diff --git a/lastopen.txt b/lastopen.txt new file mode 100644 index 0000000..fc480e0 --- /dev/null +++ b/lastopen.txt @@ -0,0 +1 @@ +C:\Users\ealm\Desktop\tessy3 \ No newline at end of file diff --git a/metadata.txt b/metadata.txt new file mode 100644 index 0000000..0dfef45 --- /dev/null +++ b/metadata.txt @@ -0,0 +1,12 @@ +DateUsedForStatistics;collection_date +ReportingCountry;geographic location (country and/or sea) +Gender; +Age; +Imported; +ProbableCountryOfInfection; +Serotype; +Specimen; +SampleOrigin; +DateOfSampling; +DateOfReceiptReferenceLab; +WgsAssembler; \ No newline at end of file diff --git a/paths.txt b/paths.txt new file mode 100644 index 0000000..ad4753f --- /dev/null +++ b/paths.txt @@ -0,0 +1,3 @@ +CURL=T:/Epidemiological Methods/MolecularSurveillance/Software/curl.exe +TMP=C:/ENAtmp +FTP=webin.ebi.ac.uk \ No newline at end of file diff --git a/sample.in.csv b/sample.in.csv new file mode 100644 index 0000000..a924788 --- /dev/null +++ b/sample.in.csv @@ -0,0 +1,140 @@ +id,file_pattern,instrument,species,collected_by,collection_date,country,1,2,3,4,5 +B1BFCD74-60B8-41BB-9988-61FEB4A33D83,B1BFCD74-60B8-41BB-9988-61FEB4A33D83,Illumina NextSeq 550,Listeria monocytogenes,Austria,18/01/2010,Austria,,,,, +CB5B6286-DD84-441A-933A-EE2AAF6FC21C,CB5B6286-DD84-441A-933A-EE2AAF6FC21C,Illumina NextSeq 550,Listeria monocytogenes,Austria,26/01/2010,Austria,,,,, +E19A51D8-6A81-4391-A17F-D771C3503676,E19A51D8-6A81-4391-A17F-D771C3503676,Illumina NextSeq 550,Listeria monocytogenes,Austria,26/01/2010,Austria,,,,, +E89B0641-3C7F-440F-ADDB-23F8DEC32B50,E89B0641-3C7F-440F-ADDB-23F8DEC32B50,Illumina MiSeq,Listeria monocytogenes,Austria,05/02/2010,Austria,,,,, +009F450F-EA69-42B5-B7B7-344CF5FAE01F,009F450F-EA69-42B5-B7B7-344CF5FAE01F,Illumina HiSeq 2000,Listeria monocytogenes,Austria,05/02/2010,Austria,,,,, +8891D44C-A026-4E4C-A818-BE541320A354,8891D44C-A026-4E4C-A818-BE541320A354,Illumina NextSeq 550,Listeria monocytogenes,Austria,17/02/2010,Austria,,,,, +B45681E3-4E89-4C7C-9828-A8C5AA0B0E7C,B45681E3-4E89-4C7C-9828-A8C5AA0B0E7C,Illumina NextSeq 550,Listeria monocytogenes,Austria,25/02/2010,Austria,,,,, +FA250076-BF3A-4F90-BDD6-5003C9CD9168,FA250076-BF3A-4F90-BDD6-5003C9CD9168,Illumina NextSeq 550,Listeria monocytogenes,Austria,15/03/2010,Austria,,,,, +6EB56B0C-6FB1-4C9B-8C9F-B1F2850C84D2,6EB56B0C-6FB1-4C9B-8C9F-B1F2850C84D2,Illumina NextSeq 550,Listeria monocytogenes,Austria,15/03/2010,Austria,,,,, +5E854261-0573-4A15-A318-AA0E2C66F3B1,5E854261-0573-4A15-A318-AA0E2C66F3B1,Illumina NextSeq 550,Listeria monocytogenes,Austria,15/03/2010,Austria,,,,, +53B74A09-0BB6-4730-A64E-5CC162E437BA,53B74A09-0BB6-4730-A64E-5CC162E437BA,Illumina HiSeq 2000,Listeria monocytogenes,Austria,23/03/2010,Austria,,,,, +6FC7B5CC-C4ED-45B7-8FC7-73E7974D6FA1,6FC7B5CC-C4ED-45B7-8FC7-73E7974D6FA1,Illumina HiSeq 2000,Listeria monocytogenes,Austria,10/04/2010,Austria,,,,, +18BC1D3D-EF6C-4E59-A6A0-D4B757E1DE7F,18BC1D3D-EF6C-4E59-A6A0-D4B757E1DE7F,Illumina HiSeq 2000,Listeria monocytogenes,Austria,19/04/2010,Austria,,,,, +14825576-3EF4-4ABA-BC18-9CF71A5CA589,14825576-3EF4-4ABA-BC18-9CF71A5CA589,Illumina NextSeq 550,Listeria monocytogenes,Austria,23/04/2010,Austria,,,,, +4B4EF77D-C618-4566-BB4F-0CAA983934E7,4B4EF77D-C618-4566-BB4F-0CAA983934E7,Illumina HiSeq 2000,Listeria monocytogenes,Austria,27/04/2010,Austria,,,,, +C1AB0BA8-1E17-4666-B48D-E7BCB4FDE873,C1AB0BA8-1E17-4666-B48D-E7BCB4FDE873,Illumina NextSeq 550,Listeria monocytogenes,Austria,06/05/2010,Austria,,,,, +D090382E-86F5-49AD-AC99-BCBDD8DC9242,D090382E-86F5-49AD-AC99-BCBDD8DC9242,Illumina NextSeq 550,Listeria monocytogenes,Austria,13/05/2010,Austria,,,,, +10717E34-B073-4726-B511-906BD4ED60E5,10717E34-B073-4726-B511-906BD4ED60E5,Illumina HiSeq 2000,Listeria monocytogenes,Austria,14/05/2010,Austria,,,,, +0792E205-95C3-4072-9131-D00670E39C9A,0792E205-95C3-4072-9131-D00670E39C9A,Illumina NextSeq 550,Listeria monocytogenes,Austria,28/05/2010,Austria,,,,, +9F2A84BB-D562-4718-87C4-76C87AFBDCBD,9F2A84BB-D562-4718-87C4-76C87AFBDCBD,Illumina NextSeq 550,Listeria monocytogenes,Austria,30/05/2010,Austria,,,,, +D53B03B9-C032-42C3-9149-BA4F795385C4,D53B03B9-C032-42C3-9149-BA4F795385C4,Illumina NextSeq 550,Listeria monocytogenes,Austria,01/07/2010,Austria,,,,, +3CCE04CB-0AC8-41F2-A6FE-671A74732687,3CCE04CB-0AC8-41F2-A6FE-671A74732687,Illumina NextSeq 550,Listeria monocytogenes,Austria,01/07/2010,Austria,,,,, +887AA976-2EE8-41E3-B2A6-413CC6A46BF5,887AA976-2EE8-41E3-B2A6-413CC6A46BF5,Illumina NextSeq 550,Listeria monocytogenes,Austria,01/07/2010,Austria,,,,, +45E1BBA7-8D62-4135-B7F6-6170030DCFFD,45E1BBA7-8D62-4135-B7F6-6170030DCFFD,Illumina NextSeq 550,Listeria monocytogenes,Austria,01/07/2010,Austria,,,,, +FE4A0190-FD90-4363-8B1A-890E661B5445,FE4A0190-FD90-4363-8B1A-890E661B5445,Illumina NextSeq 550,Listeria monocytogenes,Austria,01/07/2010,Austria,,,,, +252AA534-190B-477E-9FC1-593241DA69E6,252AA534-190B-477E-9FC1-593241DA69E6,Illumina NextSeq 550,Listeria monocytogenes,Austria,23/08/2010,Austria,,,,, +875245B5-58B5-412D-ACC3-45C92B1C82CB,875245B5-58B5-412D-ACC3-45C92B1C82CB,Illumina NextSeq 550,Listeria monocytogenes,Austria,15/11/2010,Austria,,,,, +55D8311D-28E8-40D5-AE13-084D39CF4231,55D8311D-28E8-40D5-AE13-084D39CF4231,Illumina HiSeq 2000,Listeria monocytogenes,Austria,10/12/2010,Austria,,,,, +E77E911E-0678-478E-AE67-D602D2899925,E77E911E-0678-478E-AE67-D602D2899925,Illumina NextSeq 550,Listeria monocytogenes,Austria,29/12/2010,Austria,,,,, +9DC4B2F5-6210-48EA-938E-A51375B0A242,9DC4B2F5-6210-48EA-938E-A51375B0A242,Illumina NextSeq 550,Listeria monocytogenes,Austria,03/01/2011,Austria,,,,, +5175694E-A9AA-432F-8D79-BC87BA07D1F6,5175694E-A9AA-432F-8D79-BC87BA07D1F6,Illumina HiSeq 2000,Listeria monocytogenes,Austria,26/01/2011,Austria,,,,, +3E31F383-F0B9-439F-8EDB-66236C6A7512,3E31F383-F0B9-439F-8EDB-66236C6A7512,Illumina NextSeq 550,Listeria monocytogenes,Austria,03/03/2011,Austria,,,,, +BA20DCF9-F16D-41F2-BB4A-98BA54750FB4,BA20DCF9-F16D-41F2-BB4A-98BA54750FB4,Illumina HiSeq 2000,Listeria monocytogenes,Austria,13/03/2011,Austria,,,,, +300262CE-FBA0-489F-B76A-81C35C0DFA0D,300262CE-FBA0-489F-B76A-81C35C0DFA0D,Illumina HiSeq 2000,Listeria monocytogenes,Austria,18/03/2011,Austria,,,,, +B3C67105-81F6-4654-ABBC-713F101379AA,B3C67105-81F6-4654-ABBC-713F101379AA,Illumina NextSeq 550,Listeria monocytogenes,Austria,07/04/2011,Austria,,,,, +05461485-E218-423F-A587-0840F5B46EAE,05461485-E218-423F-A587-0840F5B46EAE,Illumina NextSeq 550,Listeria monocytogenes,Austria,12/04/2011,Austria,,,,, +7FAB000F-367D-4910-8C24-AD3B2E83E955,7FAB000F-367D-4910-8C24-AD3B2E83E955,Illumina HiSeq 2000,Listeria monocytogenes,Austria,16/04/2011,Austria,,,,, +1B7CE6B3-7EA3-4D5F-8FCF-35A322C3628E,1B7CE6B3-7EA3-4D5F-8FCF-35A322C3628E,Illumina NextSeq 550,Listeria monocytogenes,Austria,10/05/2011,Austria,,,,, +ACABE62E-835D-48E5-A2CC-E20AA740524E,ACABE62E-835D-48E5-A2CC-E20AA740524E,Illumina HiSeq 2000,Listeria monocytogenes,Austria,14/06/2011,Austria,,,,, +CAD11CEE-DC1F-4254-8321-78A211CD4D0C,CAD11CEE-DC1F-4254-8321-78A211CD4D0C,Illumina NextSeq 550,Listeria monocytogenes,Austria,18/06/2011,Austria,,,,, +3BA24473-9BA2-4A93-B300-67C41757B985,3BA24473-9BA2-4A93-B300-67C41757B985,Illumina NextSeq 550,Listeria monocytogenes,Austria,01/07/2011,Austria,,,,, +45EB4B3B-B206-4861-B7AC-CC3369CDE662,45EB4B3B-B206-4861-B7AC-CC3369CDE662,Illumina HiSeq 2000,Listeria monocytogenes,Austria,11/07/2011,Austria,,,,, +09BE7F2E-A0BC-4548-97D1-AB292EA8B0E0,09BE7F2E-A0BC-4548-97D1-AB292EA8B0E0,Illumina NextSeq 550,Listeria monocytogenes,Austria,08/08/2011,Austria,,,,, +6F8101B4-1964-4EE7-939E-29733905F04D,6F8101B4-1964-4EE7-939E-29733905F04D,Illumina HiSeq 2000,Listeria monocytogenes,Austria,22/08/2011,Austria,,,,, +8F87D747-8BCE-4C52-AAD0-6E7EB548BC4C,8F87D747-8BCE-4C52-AAD0-6E7EB548BC4C,Illumina HiSeq 2000,Listeria monocytogenes,Austria,07/10/2011,Austria,,,,, +0FDDBDF7-D9DB-464E-8ABE-D4B2A5799368,0FDDBDF7-D9DB-464E-8ABE-D4B2A5799368,Illumina NextSeq 550,Listeria monocytogenes,Austria,07/10/2011,Austria,,,,, +95CC9D05-1FCB-43F2-AA2E-882F53557F01,95CC9D05-1FCB-43F2-AA2E-882F53557F01,Illumina NextSeq 550,Listeria monocytogenes,Austria,14/10/2011,Austria,,,,, +95495911-C7DB-4799-90FD-A5AB9539AA1C,95495911-C7DB-4799-90FD-A5AB9539AA1C,Illumina HiSeq 2000,Listeria monocytogenes,Austria,25/10/2011,Austria,,,,, +E3A654F5-D1FE-4303-A234-19A9A5548753,E3A654F5-D1FE-4303-A234-19A9A5548753,Illumina NextSeq 550,Listeria monocytogenes,Austria,10/11/2011,Austria,,,,, +642CAEB8-BC89-4919-8ABC-187FEA5CA8AB,642CAEB8-BC89-4919-8ABC-187FEA5CA8AB,Illumina NextSeq 550,Listeria monocytogenes,Austria,15/12/2011,Austria,,,,, +C68720E8-A59F-4795-B0E1-7E3C044F686F,C68720E8-A59F-4795-B0E1-7E3C044F686F,Illumina MiSeq,Listeria monocytogenes,Austria,18/01/2013,Austria,,,,, +C9BDF4AF-141B-4F47-AC73-6E6FF3FF1893,C9BDF4AF-141B-4F47-AC73-6E6FF3FF1893,Illumina MiSeq,Listeria monocytogenes,Austria,31/01/2013,Austria,,,,, +64668ED5-E074-4377-9BAA-3FBDFE188C49,64668ED5-E074-4377-9BAA-3FBDFE188C49,Illumina MiSeq,Listeria monocytogenes,Austria,13/03/2013,Austria,,,,, +31B71572-BA3C-4421-B651-5E936C2C39FC,31B71572-BA3C-4421-B651-5E936C2C39FC,Illumina MiSeq,Listeria monocytogenes,Austria,17/03/2013,Austria,,,,, +D7BE5AA5-64F6-4F31-8783-48CA023794F9,D7BE5AA5-64F6-4F31-8783-48CA023794F9,Illumina MiSeq,Listeria monocytogenes,Austria,04/04/2013,Austria,,,,, +4718EC46-8CBF-4ED8-8A4D-BF80C71D1131,4718EC46-8CBF-4ED8-8A4D-BF80C71D1131,Illumina MiSeq,Listeria monocytogenes,Austria,16/04/2013,Austria,,,,, +67889884-1FFC-400D-9778-0ACB8461AD3B,67889884-1FFC-400D-9778-0ACB8461AD3B,Illumina MiSeq,Listeria monocytogenes,Austria,08/05/2013,Austria,,,,, +8FFAA0BB-EE79-44AA-9800-8773F0E4206B,8FFAA0BB-EE79-44AA-9800-8773F0E4206B,Illumina MiSeq,Listeria monocytogenes,Austria,16/05/2013,Austria,,,,, +3547F1D7-42C6-4D50-906E-8F14E057EC7B,3547F1D7-42C6-4D50-906E-8F14E057EC7B,Illumina MiSeq,Listeria monocytogenes,Austria,22/05/2013,Austria,,,,, +3D99AEDA-E4FA-46C6-9E32-707646538BB4,3D99AEDA-E4FA-46C6-9E32-707646538BB4,Illumina MiSeq,Listeria monocytogenes,Austria,06/06/2013,Austria,,,,, +862E5D84-49AA-4FDB-A6E2-3BEC78E7E737,862E5D84-49AA-4FDB-A6E2-3BEC78E7E737,Illumina MiSeq,Listeria monocytogenes,Austria,12/10/2013,Austria,,,,, +59032E81-EFA4-4594-9BE2-63E06B124B9C,59032E81-EFA4-4594-9BE2-63E06B124B9C,Illumina MiSeq,Listeria monocytogenes,Austria,12/10/2013,Austria,,,,, +8FFF3A8B-4B47-4BE0-B515-7A7C416EC5AB,8FFF3A8B-4B47-4BE0-B515-7A7C416EC5AB,Illumina MiSeq,Listeria monocytogenes,Austria,12/10/2013,Austria,,,,, +59326EA9-0B64-407F-A4CA-8CA6C15FE429,59326EA9-0B64-407F-A4CA-8CA6C15FE429,Illumina NextSeq 550,Listeria monocytogenes,Austria,25/10/2013,Austria,,,,, +399B4AFD-019F-423E-B1D7-E7F400ABA4DD,399B4AFD-019F-423E-B1D7-E7F400ABA4DD,Illumina MiSeq,Listeria monocytogenes,Austria,28/10/2013,Austria,,,,, +D84F8663-1B98-425E-8911-F93D84854E63,D84F8663-1B98-425E-8911-F93D84854E63,Illumina NextSeq 550,Listeria monocytogenes,Austria,22/11/2013,Austria,,,,, +2AE3D543-90AC-4EEB-A16A-5934A8B728A0,2AE3D543-90AC-4EEB-A16A-5934A8B728A0,Illumina MiSeq,Listeria monocytogenes,Austria,03/01/2014,Austria,,,,, +3F7E729F-79A1-4537-A084-F7139515D5EC,3F7E729F-79A1-4537-A084-F7139515D5EC,Illumina MiSeq,Listeria monocytogenes,Austria,29/01/2014,Austria,,,,, +E2C6ECAB-2A46-4BF7-92B2-8FFEDCBB803C,E2C6ECAB-2A46-4BF7-92B2-8FFEDCBB803C,Illumina NextSeq 550,Listeria monocytogenes,Austria,14/03/2014,Austria,,,,, +9B4E454A-4096-4FD1-8726-7C651FE4800D,9B4E454A-4096-4FD1-8726-7C651FE4800D,Illumina NextSeq 550,Listeria monocytogenes,Austria,28/03/2014,Austria,,,,, +50CEF4DC-23AF-4A5B-817C-1B966D6D2531,50CEF4DC-23AF-4A5B-817C-1B966D6D2531,Illumina MiSeq,Listeria monocytogenes,Austria,31/03/2014,Austria,,,,, +CBE56C3B-ACB7-464C-B5F8-9E29A5475ECD,CBE56C3B-ACB7-464C-B5F8-9E29A5475ECD,Illumina MiSeq,Listeria monocytogenes,Austria,30/04/2014,Austria,,,,, +BC7FB72A-DDDF-46BB-876F-20D51669354E,BC7FB72A-DDDF-46BB-876F-20D51669354E,Illumina MiSeq,Listeria monocytogenes,Austria,09/05/2014,Austria,,,,, +5288E47A-8615-4A96-9233-BD24FEA741A9,5288E47A-8615-4A96-9233-BD24FEA741A9,Illumina MiSeq,Listeria monocytogenes,Austria,15/05/2014,Austria,,,,, +D2EF7A6C-1702-4C94-AC43-D8D397CF80A6,D2EF7A6C-1702-4C94-AC43-D8D397CF80A6,Illumina MiSeq,Listeria monocytogenes,Austria,12/06/2014,Austria,,,,, +252B8B9B-3BDF-4A82-BA1F-85CCF44C35E7,252B8B9B-3BDF-4A82-BA1F-85CCF44C35E7,Illumina MiSeq,Listeria monocytogenes,Austria,12/06/2014,Austria,,,,, +DCC6A88B-2B39-4FAA-A2FD-674BCB4D0280,DCC6A88B-2B39-4FAA-A2FD-674BCB4D0280,Illumina MiSeq,Listeria monocytogenes,Austria,12/06/2014,Austria,,,,, +4ABEA595-AD7A-4BDB-AE1F-1ADE2796ED04,4ABEA595-AD7A-4BDB-AE1F-1ADE2796ED04,Illumina MiSeq,Listeria monocytogenes,Austria,23/06/2014,Austria,,,,, +F1F87225-12D4-44D1-AFE0-5DAB4F6F05A3,F1F87225-12D4-44D1-AFE0-5DAB4F6F05A3,Illumina MiSeq,Listeria monocytogenes,Austria,27/06/2014,Austria,,,,, +FFB30397-8C4E-4FA7-8D59-9A9C7B7677E9,FFB30397-8C4E-4FA7-8D59-9A9C7B7677E9,Illumina MiSeq,Listeria monocytogenes,Austria,30/06/2014,Austria,,,,, +64F02804-A584-47A8-B11D-46DB4E60F88F,64F02804-A584-47A8-B11D-46DB4E60F88F,Illumina MiSeq,Listeria monocytogenes,Austria,01/07/2014,Austria,,,,, +860D607B-0952-4E8B-8A78-52CD63068187,860D607B-0952-4E8B-8A78-52CD63068187,Illumina MiSeq,Listeria monocytogenes,Austria,07/07/2014,Austria,,,,, +F1CA38CD-7E23-443A-A8F9-E9E736E65436,F1CA38CD-7E23-443A-A8F9-E9E736E65436,Illumina MiSeq,Listeria monocytogenes,Austria,07/07/2014,Austria,,,,, +A287732B-2011-490C-BEA9-C3A32B42F740,A287732B-2011-490C-BEA9-C3A32B42F740,Illumina MiSeq,Listeria monocytogenes,Austria,15/07/2014,Austria,,,,, +7AABE011-C6D4-4A94-8D7A-D790B187057B,7AABE011-C6D4-4A94-8D7A-D790B187057B,Illumina MiSeq,Listeria monocytogenes,Austria,18/07/2014,Austria,,,,, +1144AB4F-8EA0-4434-BCF8-10B75F1948C2,1144AB4F-8EA0-4434-BCF8-10B75F1948C2,Illumina MiSeq,Listeria monocytogenes,Austria,28/07/2014,Austria,,,,, +9C05F85B-3A86-4AB0-8E0B-A3648EFBD6FB,9C05F85B-3A86-4AB0-8E0B-A3648EFBD6FB,Illumina MiSeq,Listeria monocytogenes,Austria,29/07/2014,Austria,,,,, +393DCC56-58F3-4644-97F6-068F5181DD9C,393DCC56-58F3-4644-97F6-068F5181DD9C,Illumina MiSeq,Listeria monocytogenes,Austria,08/08/2014,Austria,,,,, +EC27B28F-C1EC-4637-BD63-F39063DCC200,EC27B28F-C1EC-4637-BD63-F39063DCC200,Illumina MiSeq,Listeria monocytogenes,Austria,11/08/2014,Austria,,,,, +6C1BF84F-466A-48BD-B840-8EB88034C9D0,6C1BF84F-466A-48BD-B840-8EB88034C9D0,Illumina MiSeq,Listeria monocytogenes,Austria,20/08/2014,Austria,,,,, +53DBA1F6-5921-43AB-BADC-398E91290C12,53DBA1F6-5921-43AB-BADC-398E91290C12,Illumina MiSeq,Listeria monocytogenes,Austria,22/08/2014,Austria,,,,, +546C65FD-572E-413D-847F-6936DAEDE461,546C65FD-572E-413D-847F-6936DAEDE461,Illumina MiSeq,Listeria monocytogenes,Austria,03/09/2014,Austria,,,,, +905DAC44-777A-4235-94CA-C2F5E5CBADDC,905DAC44-777A-4235-94CA-C2F5E5CBADDC,Illumina MiSeq,Listeria monocytogenes,Austria,08/09/2014,Austria,,,,, +64605B7C-62FF-4A00-9CF4-F5B1F871933B,64605B7C-62FF-4A00-9CF4-F5B1F871933B,Illumina MiSeq,Listeria monocytogenes,Austria,22/09/2014,Austria,,,,, +69D71F77-8C9C-4E1C-9DE9-A3BC8E26A466,69D71F77-8C9C-4E1C-9DE9-A3BC8E26A466,Illumina MiSeq,Listeria monocytogenes,Austria,26/09/2014,Austria,,,,, +3F70F42C-C9FC-4194-92B9-151834C12D79,3F70F42C-C9FC-4194-92B9-151834C12D79,Illumina MiSeq,Listeria monocytogenes,Austria,13/10/2014,Austria,,,,, +5FE3F622-A816-4F1E-85DC-0417DC3D9623,5FE3F622-A816-4F1E-85DC-0417DC3D9623,Illumina MiSeq,Listeria monocytogenes,Austria,27/10/2014,Austria,,,,, +0B456E7B-A5C4-481B-AAEC-37929D5A8206,0B456E7B-A5C4-481B-AAEC-37929D5A8206,Illumina MiSeq,Listeria monocytogenes,Austria,28/10/2014,Austria,,,,, +A86C2FFD-98A6-406B-881A-02E6E7B0F0A9,A86C2FFD-98A6-406B-881A-02E6E7B0F0A9,Illumina MiSeq,Listeria monocytogenes,Austria,30/10/2014,Austria,,,,, +D9F5112B-446E-427F-91AB-A75E52FEFB32,D9F5112B-446E-427F-91AB-A75E52FEFB32,Illumina MiSeq,Listeria monocytogenes,Austria,11/11/2014,Austria,,,,, +161999BB-FDDA-4D1E-9FB1-0C26D9753E6D,161999BB-FDDA-4D1E-9FB1-0C26D9753E6D,Illumina MiSeq,Listeria monocytogenes,Austria,25/11/2014,Austria,,,,, +CC71061B-CA2B-4BF1-B339-D6E84A2FF0EC,CC71061B-CA2B-4BF1-B339-D6E84A2FF0EC,Illumina MiSeq,Listeria monocytogenes,Austria,04/12/2014,Austria,,,,, +09766904-02E3-4C65-AF89-8ABE5B765B50,09766904-02E3-4C65-AF89-8ABE5B765B50,Illumina MiSeq,Listeria monocytogenes,Austria,04/12/2014,Austria,,,,, +42C176C3-62B4-451E-A81A-93C8E4BDEDC9,42C176C3-62B4-451E-A81A-93C8E4BDEDC9,Illumina MiSeq,Listeria monocytogenes,Austria,05/12/2014,Austria,,,,, +67E948F7-668B-428C-9FE1-9E8A96CC241C,67E948F7-668B-428C-9FE1-9E8A96CC241C,Illumina MiSeq,Listeria monocytogenes,Austria,10/12/2014,Austria,,,,, +A48844A6-1BB5-4A8E-BB0D-FAA5B5264274,A48844A6-1BB5-4A8E-BB0D-FAA5B5264274,Illumina MiSeq,Listeria monocytogenes,Austria,16/12/2014,Austria,,,,, +4BB96507-2C85-4C5A-95EA-284849E64DB9,4BB96507-2C85-4C5A-95EA-284849E64DB9,Illumina MiSeq,Listeria monocytogenes,Austria,29/12/2014,Austria,,,,, +A66709D5-4B9A-409E-AE88-819816B9D0A4,A66709D5-4B9A-409E-AE88-819816B9D0A4,Illumina MiSeq,Listeria monocytogenes,Austria,30/12/2014,Austria,,,,, +F904B314-F81C-42D5-B02A-B1AC3727D59B,F904B314-F81C-42D5-B02A-B1AC3727D59B,Illumina MiSeq,Listeria monocytogenes,Austria,07/01/2015,Austria,,,,, +5D4CC17C-DE65-4583-A595-A42480965541,5D4CC17C-DE65-4583-A595-A42480965541,Illumina MiSeq,Listeria monocytogenes,Austria,22/01/2015,Austria,,,,, +384570B4-7750-4FD7-8874-29F9AA989A1E,384570B4-7750-4FD7-8874-29F9AA989A1E,Illumina MiSeq,Listeria monocytogenes,Austria,22/01/2015,Austria,,,,, +58A68E0C-3129-4078-8747-3709642E2900,58A68E0C-3129-4078-8747-3709642E2900,Illumina MiSeq,Listeria monocytogenes,Austria,22/01/2015,Austria,,,,, +6C668BFD-ECE7-4E6C-8163-55D66CE78879,6C668BFD-ECE7-4E6C-8163-55D66CE78879,Illumina MiSeq,Listeria monocytogenes,Austria,22/01/2015,Austria,,,,, +608F0E59-1F11-446A-B38C-927C1AAD7F50,608F0E59-1F11-446A-B38C-927C1AAD7F50,Illumina MiSeq,Listeria monocytogenes,Austria,30/01/2015,Austria,,,,, +7B471D71-6B2A-43C3-8CA2-3300A6A4500F,7B471D71-6B2A-43C3-8CA2-3300A6A4500F,Illumina MiSeq,Listeria monocytogenes,Austria,30/01/2015,Austria,,,,, +136748F3-C8BE-490C-8095-5B0EA23C7D85,136748F3-C8BE-490C-8095-5B0EA23C7D85,Illumina MiSeq,Listeria monocytogenes,Austria,20/02/2015,Austria,,,,, +43611BE5-EF2B-420D-8CF0-B668D908CE5A,43611BE5-EF2B-420D-8CF0-B668D908CE5A,Illumina MiSeq,Listeria monocytogenes,Austria,23/02/2015,Austria,,,,, +CD16ACBF-4207-400F-B338-5FA34D8FDA44,CD16ACBF-4207-400F-B338-5FA34D8FDA44,Illumina MiSeq,Listeria monocytogenes,Austria,03/03/2015,Austria,,,,, +8C0289E1-56E1-47A5-BFEB-889D38C7B3A4,8C0289E1-56E1-47A5-BFEB-889D38C7B3A4,Illumina MiSeq,Listeria monocytogenes,Austria,21/04/2015,Austria,,,,, +D0644D89-B59E-4E33-8606-AC7BF4211898,D0644D89-B59E-4E33-8606-AC7BF4211898,Illumina MiSeq,Listeria monocytogenes,Austria,22/04/2015,Austria,,,,, +D8508F9A-1A42-4502-976B-ACC88BD1F57C,D8508F9A-1A42-4502-976B-ACC88BD1F57C,Illumina MiSeq,Listeria monocytogenes,Austria,28/05/2015,Austria,,,,, +E10D5545-6CF7-4125-8AE2-B28DF065BD3D,E10D5545-6CF7-4125-8AE2-B28DF065BD3D,Illumina MiSeq,Listeria monocytogenes,Austria,02/06/2015,Austria,,,,, +837B2062-40F3-4DDE-8CC7-D9C477E4F993,837B2062-40F3-4DDE-8CC7-D9C477E4F993,Illumina MiSeq,Listeria monocytogenes,Austria,08/06/2015,Austria,,,,, +C1FF3D42-F1A0-4233-BE67-CA6893984042,C1FF3D42-F1A0-4233-BE67-CA6893984042,Illumina MiSeq,Listeria monocytogenes,Austria,12/06/2015,Austria,,,,, +37369132-E105-4EA8-9576-64F740F6B136,37369132-E105-4EA8-9576-64F740F6B136,Illumina MiSeq,Listeria monocytogenes,Austria,07/07/2015,Austria,,,,, +567563D5-9450-4ACC-BCF1-C8F54B958E55,567563D5-9450-4ACC-BCF1-C8F54B958E55,Illumina MiSeq,Listeria monocytogenes,Austria,21/07/2015,Austria,,,,, +9BBCE9EB-4B06-48AF-96E7-92C1FF86AE6E,9BBCE9EB-4B06-48AF-96E7-92C1FF86AE6E,Illumina MiSeq,Listeria monocytogenes,Austria,07/08/2015,Austria,,,,, +483A5956-8495-4202-818F-EA8A7C39692E,483A5956-8495-4202-818F-EA8A7C39692E,Illumina MiSeq,Listeria monocytogenes,Austria,17/08/2015,Austria,,,,, +1B3616B7-C033-4796-A7D7-3A34C702A206,1B3616B7-C033-4796-A7D7-3A34C702A206,Illumina MiSeq,Listeria monocytogenes,Austria,25/08/2015,Austria,,,,, +95355497-7474-4A2B-96E6-BAA4A8717443,95355497-7474-4A2B-96E6-BAA4A8717443,Illumina MiSeq,Listeria monocytogenes,Austria,01/09/2015,Austria,,,,, +9905E1DA-7950-4D96-A695-5CEA932CE2E4,9905E1DA-7950-4D96-A695-5CEA932CE2E4,Illumina MiSeq,Listeria monocytogenes,Austria,01/10/2015,Austria,,,,, +A5399BA3-FF72-4763-B1D1-EEE16D13AF75,A5399BA3-FF72-4763-B1D1-EEE16D13AF75,Illumina MiSeq,Listeria monocytogenes,Austria,07/10/2015,Austria,,,,, +350F3BE8-6262-4DA3-8323-30A67358D1A8,350F3BE8-6262-4DA3-8323-30A67358D1A8,Illumina MiSeq,Listeria monocytogenes,Austria,13/10/2015,Austria,,,,, +7B1456F4-F37F-4C4F-A579-D496C4595AC1,7B1456F4-F37F-4C4F-A579-D496C4595AC1,Illumina MiSeq,Listeria monocytogenes,Austria,10/11/2015,Austria,,,,, +E74F40CC-9E23-45C8-A45F-F06D205ECA51,E74F40CC-9E23-45C8-A45F-F06D205ECA51,Illumina MiSeq,Listeria monocytogenes,Austria,11/11/2015,Austria,,,,, +7DCD32E0-1B15-49FB-95A1-9D2ABDB6876F,7DCD32E0-1B15-49FB-95A1-9D2ABDB6876F,Illumina MiSeq,Listeria monocytogenes,Austria,13/11/2015,Austria,,,,, +391F1B63-EA59-4DC8-91B0-F70CF23182B4,391F1B63-EA59-4DC8-91B0-F70CF23182B4,Illumina MiSeq,Listeria monocytogenes,Austria,20/11/2015,Austria,,,,, +8EBC86BE-F39A-43D5-B365-612EF6287538,8EBC86BE-F39A-43D5-B365-612EF6287538,Illumina MiSeq,Listeria monocytogenes,Austria,25/11/2015,Austria,,,,, +A1308EFC-1CA5-4C38-981E-483FD3182E91,A1308EFC-1CA5-4C38-981E-483FD3182E91,Illumina MiSeq,Listeria monocytogenes,Austria,22/12/2015,Austria,,,,, diff --git a/sqljdbc42.jar b/sqljdbc42.jar new file mode 100644 index 0000000..61b3463 Binary files /dev/null and b/sqljdbc42.jar differ diff --git a/src/eu/europa/ecdc/enauploader/CsvOutputHandler.java b/src/eu/europa/ecdc/enauploader/CsvOutputHandler.java new file mode 100644 index 0000000..39e7860 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/CsvOutputHandler.java @@ -0,0 +1,32 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; + +public class CsvOutputHandler extends OutputHandler { + + + String[][] data; + String[] header; + File outFile; + String project; + + public CsvOutputHandler(File csvFile, File file, String proj) { + data = ENAUtils.readCsv(csvFile, true); + header = ENAUtils.readCsvHeader(csvFile); + outFile = file; + project = proj; + } + + @Override + public void write(String value, int row, int col) { + data[row][col] = value; + + } + + @Override + public void close() { + ENAUtils.writeCsv(outFile,project,data,header); + + } + +} diff --git a/src/eu/europa/ecdc/enauploader/ENAUtils.java b/src/eu/europa/ecdc/enauploader/ENAUtils.java index 27193a2..1dd6ab6 100644 --- a/src/eu/europa/ecdc/enauploader/ENAUtils.java +++ b/src/eu/europa/ecdc/enauploader/ENAUtils.java @@ -6,20 +6,11 @@ import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; -import java.util.HashMap; - -import it.sauronsoftware.ftp4j.FTPAbortedException; -import it.sauronsoftware.ftp4j.FTPClient; -import it.sauronsoftware.ftp4j.FTPDataTransferException; -import it.sauronsoftware.ftp4j.FTPException; -import it.sauronsoftware.ftp4j.FTPIllegalReplyException; +// Utils public class ENAUtils { - - - - + // This method looks up and returns a taxid from a tab separated table public static String getTaxid(String taxon) { String out = ""; @@ -47,6 +38,7 @@ public static String getTaxid(String taxon) { } + // This method reads the header of a csv file public static String[] readCsvHeader(File csvFile) { String line; @@ -64,9 +56,9 @@ public static String[] readCsvHeader(File csvFile) { return null; } + // This method reads a csv file public static String[][] readCsv(File csvFile, boolean header) { - String line; ArrayList rowData = new ArrayList(); int cols = 0; @@ -112,6 +104,7 @@ public static String[][] readCsv(File csvFile, boolean header) { } + // This methods writes a csv file public static void writeCsv(File file, String title, String[][] data, String[] header) { BufferedWriter bw; try { diff --git a/src/eu/europa/ecdc/enauploader/ENAuploaderGUI.java b/src/eu/europa/ecdc/enauploader/ENAuploaderGUI.java new file mode 100644 index 0000000..d574ba7 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ENAuploaderGUI.java @@ -0,0 +1,1372 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.Dimension; +import java.awt.GridLayout; +import java.awt.Toolkit; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.KeyEvent; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.UUID; + +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JComponent; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JRadioButton; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.KeyStroke; +import javax.swing.ScrollPaneConstants; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.event.CellEditorListener; +import javax.swing.event.ChangeEvent; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.filechooser.FileSystemView; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; +import javax.swing.text.DefaultCaret; + + +public class ENAuploaderGUI extends JFrame implements ActionListener { + + private static final int MAXROWS = 5000; + private static final String version="0.30"; + private static final String BASE_TITLE = "ECDC uploader v"+version+" "; + private DefaultTableModel dataTableModel; + private JTable dataTable; + private JTextField projectText; + private JTextField centerText; + private JTextField projaccText; + private JTextField delimiterText; + private JTextField datadirText; + private JTextField loginText; + private JPasswordField passwdText; + private JCheckBox anonButton; + private JCheckBox prodButton; + private JTextArea logArea; + + private String curlPath; + private String ftpHost; + private String tmpPath; + private JCheckBox ftpButton; + private JTextField holdText; + private JTextField checklistText; + + + private File saveFile; + private JTextField tessyLoginText; + private JPasswordField tessyPassText; + private JTextField tessyHostText; + private JTextField tessyDomainText; + private JTextField tessyTargetText; + private JTextField tessyContactText; + private JTextField tessyProviderText; + private JTextField tessySubjectText; + private JTextField tessyMetaText; + private JTextField tessyCountryText; + private JTextField ftpHostText; + private JTextField ftpLoginText; + private JPasswordField ftpPassText; + private JCheckBox ftpCheckBox; + private JCheckBox enaCheckBox; + private JCheckBox tessyCheckBox; + private JCheckBox tessyWarnCheckBox; + private JCheckBox tessyRemarkCheckBox; + private SimpleDateFormat timestamp; + ENAuploaderGUI gui; + + ENAuploaderGUI() { + gui = this; + timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + saveFile = null; + curlPath = "curl.exe"; + String line; + + try { + BufferedReader br = new BufferedReader(new FileReader(new File("paths.txt"))); + while ((line = br.readLine())!=null) { + if (!line.equals("")) { + String[] fields = line.split("="); + String key = fields[0]; + String value = fields[1]; + if (key.equals("CURL")) { + curlPath = value; + } else if (key.equals("FTP")) { + ftpHost = value; + } else if (key.equals("TMP")) { + tmpPath = value; + } + } + } + br.close(); + } catch (IOException e) { + + e.printStackTrace(); + } + + JLabel checklistLabel = new JLabel("ENA checklist"); + checklistText = new JTextField("ERC000044"); + checklistText.setPreferredSize(new Dimension(60,20)); + + /*try { + BufferedReader br = new BufferedReader(new FileReader(new File("checklist.txt"))); + while ((line = br.readLine())!=null) { + if (!line.equals("")) { + checklistText.setText(line.trim()); + } + } + br.close(); + } catch (IOException e) { + + e.printStackTrace(); + }*/ + + + + dataTable = new JTable(dataTableModel); + dataTable.setCellSelectionEnabled(true); + dataTable.getTableHeader().setReorderingAllowed(false); + new ExcelAdapter(dataTable); + //dataTable.putClientProperty("terminateEditOnFocusLost", true); + + + + + dataTable.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() { + @Override + public Component getTableCellRendererComponent( + JTable table, Object value, boolean isSelected, + boolean hasFocus, int row, int column) { + Component c = super.getTableCellRendererComponent( + table, value, isSelected, hasFocus, row, column); + DefaultTableModel model = (DefaultTableModel) table.getModel(); + c.setBackground(Color.white); + if (isSelected) { + c.setBackground(new Color(175, 175, 175)); + } else if (table.getColumnName(column).endsWith("*")) { + if (table.getColumnName(column).startsWith("SFTP")) { + c.setBackground(new Color(189, 211, 125)); + } else if (table.getColumnName(column).startsWith("TESSy")) { + c.setBackground(new Color(167, 182, 41)); + + if (table.getColumnName(column).equals("TESSy date last approved*")) { + try { + String val1 = (String)table.getValueAt(row, column); + String val2 = (String)table.getValueAt(row, column-1); + if (val1!=null && val2!=null && !val1.equals("") && !val2.equals("")) { + Date d1 = timestamp.parse(val1); + Date d2 = timestamp.parse(val2); + if (d2.after(d1)) { + c.setBackground(new Color(255, 180, 120)); + } + } + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } else if (table.getColumnName(column).equals("TESSy date last uploaded*")) { + try { + String val1 = (String)table.getValueAt(row, column); + String val2 = (String)table.getValueAt(row, 1); + if (val1!=null && val2!=null && !val1.equals("") && !val2.equals("")) { + Date d1 = timestamp.parse(val1); + Date d2 = timestamp.parse(val2); + if (d2.after(d1)) { + c.setBackground(new Color(255, 180, 120)); + } + } + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + + + + } else { + c.setBackground(new Color(121, 191, 189)); + } + + + } else { + if (table.getColumnName(column).matches(".*[;].+") || table.getColumnName(column).matches("Instrument.*") || table.getColumnName(column).matches("species.*") || table.getColumnName(column).matches("File base.*")) { + c.setBackground(new Color(235, 235, 255)); + } else if (column<2) { + + } + } + + + + return c; + } + }); + + + + //loadMetaData(new File("metadata.txt")); + + dataTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + JScrollPane dataScroller = new JScrollPane(dataTable); + dataScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS ); + + JPanel bottomPanel = new JPanel(new BorderLayout()); + + JPanel dataPanel = new JPanel(new BorderLayout()); + dataPanel.add(dataScroller,BorderLayout.CENTER); + + JPanel ftpPanel = new JPanel(); + GridLayout ftpLayout = new GridLayout(0,2); + ftpPanel.setLayout(ftpLayout); + + JPanel controlPanel = new JPanel(); + GridLayout buttonLayout = new GridLayout(0,2); + controlPanel.setLayout(buttonLayout); + + JPanel tessyPanel = new JPanel(); + GridLayout tessyLayout = new GridLayout(0,2); + tessyPanel.setLayout(tessyLayout); + + JPanel buttonPanel = new JPanel(); + buttonPanel.setLayout(new GridLayout(0,1)); + + ftpCheckBox = new JCheckBox("Submit to ECDC SFTP"); + ftpCheckBox.setSelected(true); + JLabel fooLabel1 = new JLabel(""); + ftpPanel.add(ftpCheckBox); + ftpPanel.add(fooLabel1); + + enaCheckBox = new JCheckBox("Submit to ENA"); + enaCheckBox.setSelected(true); + JLabel fooLabel2 = new JLabel(""); + controlPanel.add(enaCheckBox); + controlPanel.add(fooLabel2); + + tessyCheckBox = new JCheckBox("Submit to TESSy"); + tessyCheckBox.setSelected(true); + JLabel fooLabel3 = new JLabel(""); + tessyPanel.add(tessyCheckBox); + tessyPanel.add(fooLabel3); + + JLabel ftpHostLabel = new JLabel("FTP host"); + ftpHostText = new JTextField("sftp.ecdc.europa.eu"); + ftpHostText.setPreferredSize(new Dimension(190,22)); + + JLabel ftpLoginLabel = new JLabel("FTP login"); + ftpLoginText = new JTextField("Moltype"); + ftpLoginText.setPreferredSize(new Dimension(190,22)); + + JLabel ftpPassLabel = new JLabel("FTP login"); + ftpPassText = new JPasswordField(""); + ftpPassText.setPreferredSize(new Dimension(190,22)); + + ftpPanel.add(ftpHostLabel); + ftpPanel.add(ftpHostText); + + ftpPanel.add(ftpLoginLabel); + ftpPanel.add(ftpLoginText); + + ftpPanel.add(ftpPassLabel); + ftpPanel.add(ftpPassText); + + JLabel centerLabel = new JLabel("Submitting institution"); + centerText = new JTextField(""); + centerText.setPreferredSize(new Dimension(80,20)); + + controlPanel.add(centerLabel); + controlPanel.add(centerText); + + JLabel projectLabel = new JLabel("Study alias"); + projectText = new JTextField(""); + projectText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(projectLabel); + controlPanel.add(projectText); + + JLabel holdLabel = new JLabel("Release date (empty for immediate)"); + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.setTime(new Date()); + c.add(Calendar.DATE, 30); + String dateStr = format.format(c.getTime()); + holdText = new JTextField(dateStr); + holdText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(holdLabel); + controlPanel.add(holdText); + + JLabel projaccLabel = new JLabel("Study accession"); + projaccText = new JTextField(""); + projaccText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(projaccLabel); + controlPanel.add(projaccText); + + JLabel createProjectLabel = new JLabel(""); + JButton createProjectButton = new JButton("Create and submit study to ENA"); + createProjectButton.setActionCommand("newProject"); + createProjectButton.addActionListener(this); + + + + JLabel releaseProjectLabel = new JLabel(""); + JButton releaseProjectButton = new JButton("Release ENA study"); + releaseProjectButton.setActionCommand("releaseProject"); + releaseProjectButton.addActionListener(this); + + + + + JLabel delimiterLabel = new JLabel("File delimiter"); + delimiterText = new JTextField("_"); + delimiterText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(delimiterLabel); + controlPanel.add(delimiterText); + + JLabel datadirLabel = new JLabel("Data directory"); + datadirText = new JTextField(""); + datadirText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(datadirLabel); + controlPanel.add(datadirText); + + JLabel choosedirLabel = new JLabel(""); + JButton choosedirButton = new JButton("Choose data directory"); + choosedirButton.setActionCommand("chooseDir"); + choosedirButton.addActionListener(this); + + controlPanel.add(choosedirLabel); + controlPanel.add(choosedirButton); + + JLabel submitLabel = new JLabel(""); + JButton submitButton = new JButton("Submit isolates to selected systems"); + submitButton.setActionCommand("submitIsolates"); + submitButton.addActionListener(this); + + + + + buttonPanel.add(submitButton); + + + + + + + + + + + + + + + JLabel loginLabel = new JLabel("Webin account"); + loginText = new JTextField(""); + loginText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(loginLabel); + controlPanel.add(loginText); + + JLabel passwdLabel = new JLabel("Webin password"); + passwdText = new JPasswordField(""); + passwdText.setPreferredSize(new Dimension(60,20)); + + controlPanel.add(passwdLabel); + controlPanel.add(passwdText); + + + JLabel anonLabel = new JLabel(""); + anonButton = new JCheckBox ("Anonymize sample IDs"); + anonButton.setSelected(true); + + controlPanel.add(anonLabel); + controlPanel.add(anonButton); + + JLabel prodLabel = new JLabel(""); + prodButton = new JCheckBox ("Use ENA production API"); + + controlPanel.add(prodLabel); + controlPanel.add(prodButton); + + JLabel ftpLabel = new JLabel(""); + ftpButton = new JCheckBox ("Files already exist on ENA FTP"); + + controlPanel.add(ftpLabel); + controlPanel.add(ftpButton); + + + controlPanel.add(checklistLabel); + controlPanel.add(checklistText); + + + controlPanel.add(createProjectLabel); + controlPanel.add(createProjectButton); + controlPanel.add(releaseProjectLabel); + controlPanel.add(releaseProjectButton); + + JLabel tessyHostLabel = new JLabel("TESSy URL"); + tessyHostText = new JTextField("tessy.ecdc.europa.eu"); + tessyHostText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyHostLabel); + tessyPanel.add(tessyHostText); + + JLabel tessyDomainLabel = new JLabel("TESSy DOMAIN"); + tessyDomainText = new JTextField("ecdcdmz"); + tessyDomainText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyDomainLabel); + tessyPanel.add(tessyDomainText); + + JLabel tessyTargetLabel = new JLabel("TESSy TARGET"); + tessyTargetText = new JTextField("/TessyWebService/TessyUpload.asmx"); + tessyTargetText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyTargetLabel); + tessyPanel.add(tessyTargetText); + + + JLabel tessyLoginLabel = new JLabel("TESSy account"); + tessyLoginText = new JTextField(""); + tessyLoginText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyLoginLabel); + tessyPanel.add(tessyLoginText); + + JLabel tessyPassLabel = new JLabel("TESSy password"); + tessyPassText = new JPasswordField(""); + tessyPassText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyPassLabel); + tessyPanel.add(tessyPassText); + + JLabel tessyCountryLabel = new JLabel("TESSy country"); + tessyCountryText = new JTextField(""); + tessyCountryText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyCountryLabel); + tessyPanel.add(tessyCountryText); + + JLabel tessyContactLabel = new JLabel("TESSy contact"); + tessyContactText = new JTextField(""); + tessyContactText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyContactLabel); + tessyPanel.add(tessyContactText); + + JLabel tessyProviderLabel = new JLabel("TESSy data source (e.g. XX-MOLSURV)"); + tessyProviderText = new JTextField(""); + tessyProviderText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyProviderLabel); + tessyPanel.add(tessyProviderText); + + JLabel tessySubjectLabel = new JLabel("TESSy SUBJECT (e.g. SALMISO)"); + tessySubjectText = new JTextField("SALMISO"); + tessySubjectText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessySubjectLabel); + tessyPanel.add(tessySubjectText); + + JLabel tessyMetaLabel = new JLabel("TESSy metadata version"); + tessyMetaText = new JTextField("3"); + tessyMetaText.setPreferredSize(new Dimension(120,20)); + tessyPanel.add(tessyMetaLabel); + tessyPanel.add(tessyMetaText); + + + JLabel tessyWarnLabel = new JLabel(""); + tessyWarnCheckBox = new JCheckBox("Halt submission on warning"); + tessyPanel.add(tessyWarnLabel); + tessyPanel.add(tessyWarnCheckBox); + + JLabel tessyRemarkLabel = new JLabel(""); + tessyRemarkCheckBox = new JCheckBox("Halt submission on remark"); + tessyPanel.add(tessyRemarkLabel); + tessyPanel.add(tessyRemarkCheckBox); + + + logArea = new JTextArea(""); + DefaultCaret caret = (DefaultCaret)logArea.getCaret(); + caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE); + + JScrollPane logScroller = new JScrollPane(logArea); + logScroller.setPreferredSize(new Dimension(1000,200)); + bottomPanel.add(logScroller); + + JPanel rightPanel = new JPanel(); + rightPanel.setPreferredSize(new Dimension(440,1200)); + rightPanel.add(ftpPanel); + rightPanel.add(controlPanel); + rightPanel.add(tessyPanel); + rightPanel.add(buttonPanel); + + JScrollPane rightScroller = new JScrollPane(rightPanel); + + + JPanel mainPanel = new JPanel(new BorderLayout()); + + ftpPanel.setBorder(BorderFactory.createTitledBorder("ECDC FTP parameters")); + controlPanel.setBorder(BorderFactory.createTitledBorder("ENA parameters")); + tessyPanel.setBorder(BorderFactory.createTitledBorder("TESSy parameters")); + buttonPanel.setBorder(BorderFactory.createTitledBorder("Controls")); + dataPanel.setBorder(BorderFactory.createTitledBorder("Isolate table")); + + + createMenuBar(); + + + mainPanel.setBorder(BorderFactory.createEmptyBorder(10,10,10,10)); + + + + mainPanel.add(dataPanel,BorderLayout.CENTER); + mainPanel.add(rightScroller,BorderLayout.EAST); + + + mainPanel.add(bottomPanel,BorderLayout.SOUTH); + + setTitle(BASE_TITLE); + this.getContentPane().add(mainPanel); + this.setDefaultCloseOperation(EXIT_ON_CLOSE); + this.setSize(new Dimension(1200,800)); + + File stateFile = new File("lastopen.txt"); + if (stateFile.exists()) { + try { + BufferedReader br = new BufferedReader(new FileReader(stateFile)); + + loadState(new File(br.readLine())); + br.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + + + setVisible(true); + + } + + + private void createMenuBar() { + JMenuBar menuBar = new JMenuBar(); + JMenu fileMenu = new JMenu("File"); + + JMenuItem newMetaMenuItem = new JMenuItem("New metadataset"); + newMetaMenuItem.addActionListener(this); + newMetaMenuItem.setActionCommand("NewMeta"); + fileMenu.add(newMetaMenuItem); + + fileMenu.addSeparator(); + + JMenuItem newMenuItem = new JMenuItem("New dataset"); + newMenuItem.addActionListener(this); + newMenuItem.setActionCommand("New"); + fileMenu.add(newMenuItem); + KeyStroke ctrlN = KeyStroke.getKeyStroke(KeyEvent.VK_N, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask()); + newMenuItem.setAccelerator(ctrlN); + + + + JMenuItem openMenuItem = new JMenuItem("Open"); + openMenuItem.addActionListener(this); + openMenuItem.setActionCommand("Open"); + fileMenu.add(openMenuItem); + KeyStroke ctrlO = KeyStroke.getKeyStroke(KeyEvent.VK_O, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask()); + openMenuItem.setAccelerator(ctrlO); + + JMenuItem saveMenuItem = new JMenuItem("Save"); + saveMenuItem.addActionListener(this); + saveMenuItem.setActionCommand("Save"); + fileMenu.add(saveMenuItem); + KeyStroke ctrlS = KeyStroke.getKeyStroke(KeyEvent.VK_S, Toolkit.getDefaultToolkit ().getMenuShortcutKeyMask()); + saveMenuItem.setAccelerator(ctrlS); + + JMenuItem saveAsMenuItem = new JMenuItem("Save as..."); + saveAsMenuItem.addActionListener(this); + saveAsMenuItem.setActionCommand("SaveAs"); + fileMenu.add(saveAsMenuItem); + + fileMenu.addSeparator(); + + + JMenuItem quickSaveMenuItem = new JMenuItem("Quick save"); + quickSaveMenuItem.addActionListener(this); + quickSaveMenuItem.setActionCommand("qSave"); + fileMenu.add(quickSaveMenuItem); + + JMenuItem quickLoadMenuItem = new JMenuItem("Quick load"); + quickLoadMenuItem.addActionListener(this); + quickLoadMenuItem.setActionCommand("qLoad"); + fileMenu.add(quickLoadMenuItem); + + fileMenu.addSeparator(); + JMenuItem instrumentsMenuItem = new JMenuItem("Show allowed instruments"); + instrumentsMenuItem.addActionListener(this); + instrumentsMenuItem.setActionCommand("Instruments"); + fileMenu.add(instrumentsMenuItem); + + JMenuItem taxMenuItem = new JMenuItem("Show allowed species"); + taxMenuItem.addActionListener(this); + taxMenuItem.setActionCommand("Taxids"); + fileMenu.add(taxMenuItem); + + menuBar.add(fileMenu); + this.setJMenuBar(menuBar); + + } + + + public static void main(String[] args) { + try { + // Set System L&F + UIManager.setLookAndFeel( + UIManager.getSystemLookAndFeelClassName()); + } + catch (UnsupportedLookAndFeelException e) { + // handle exception + } + catch (ClassNotFoundException e) { + // handle exception + } + catch (InstantiationException e) { + // handle exception + } + catch (IllegalAccessException e) { + // handle exception + } + + new ENAuploaderGUI(); + } + + + @Override + public void actionPerformed(ActionEvent e) { + if (e.getActionCommand().equals("newProject")) { + submitProject(); + } else if (e.getActionCommand().equals("releaseProject")) { + releaseProject(); + } else if (e.getActionCommand().equals("submitIsolates")) { + submitIsolates(ftpCheckBox.isSelected(),enaCheckBox.isSelected(),tessyCheckBox.isSelected()); + } else if (e.getActionCommand().equals("chooseDir")) { + chooseDir(); + } else if (e.getActionCommand().equals("qSave")) { + saveState(new File("qsave.txt")); + } else if (e.getActionCommand().equals("qLoad")) { + loadState(new File("qsave.txt")); + } else if (e.getActionCommand().equals("Instruments")) { + JFrame frame = new JFrame("Allowed instruments"); + JPanel panel = new JPanel(new BorderLayout()); + JTextArea area = new JTextArea(""); + area.setEditable(false); + panel.add(area,BorderLayout.CENTER); + frame.getContentPane().add(panel); + frame.setSize(400,600); + frame.setVisible(true); + area.setText("HiSeq X Five\nHiSeq X Ten\nIllumina Genome Analyzer\nIllumina Genome Analyzer II\nIllumina Genome Analyzer IIx\nIllumina HiScanSQ\nIllumina HiSeq 1000\nIllumina HiSeq 1500\nIllumina HiSeq 2000\nIllumina HiSeq 2500\nIllumina HiSeq 3000\nIllumina HiSeq 4000\nIllumina MiSeq\nIllumina MiniSeq\nIllumina NovaSeq 6000\nNextSeq 500\nNextSeq 550\n"); + area.append("\nIon Torrent PGM\nIon Torrent Proton\nIon Torrent S5\nIon Torrent S5 XL\n"); + area.append("\nPacBio RS\nPacBio RS II\nSequel"); + + + }else if (e.getActionCommand().equals("Taxids")) { + JFrame frame = new JFrame("Allowed species"); + JPanel panel = new JPanel(new BorderLayout()); + JTextArea area = new JTextArea(""); + area.setEditable(false); + JScrollPane scroll = new JScrollPane(area); + panel.add(scroll,BorderLayout.CENTER); + frame.getContentPane().add(panel); + frame.setSize(400,600); + frame.setVisible(true); + try { + String line; + BufferedReader br = new BufferedReader(new FileReader("taxids.tsv")); + + while((line = br.readLine())!=null) { + area.append(line+"\n"); + } + + br.close(); + + } catch (IOException e2) { + e2.printStackTrace(); + } + + + } else if (e.getActionCommand().equals("Save")) { + save(); + } else if (e.getActionCommand().equals("SaveAs")) { + saveAs(); + + } else if (e.getActionCommand().equals("Open")) { + JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + + int returnValue = jfc.showOpenDialog(null); + //int returnValue = jfc.showSaveDialog(null); + + if (returnValue == JFileChooser.APPROVE_OPTION) { + File selectedFile = jfc.getSelectedFile(); + loadState(selectedFile); + saveFile = selectedFile; + + } + } else if (e.getActionCommand().equals("New")) { + JComboBox metaBox = new JComboBox(); + File[] files = (new File(".")).listFiles(); + for (File f : files) { + if (f.getName().startsWith("ERC")||f.getName().startsWith("meta")||f.getName().endsWith("ISO.txt")) { + metaBox.addItem(f.getName()); + } + } + JTextActionArea textArea = new JTextActionArea("",false); + textArea.setPreferredSize(new Dimension(140,400)); + metaBox.addActionListener(textArea); + textArea.actionPerformed(new ActionEvent(metaBox, 0, "")); + + final JComponent[] inputs = new JComponent[] { + new JLabel("Select metadataset"), + metaBox,textArea + + }; + int result = JOptionPane.showConfirmDialog(null, inputs, "Choose metadata set", JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + String val = metaBox.getSelectedItem().toString(); + loadMetaData(new File(val)); + if (val.length()>=13) { + checklistText.setText(val.substring(0,9)); + } + + setTitle(BASE_TITLE + " - "+ "untitled"); + } else { + + } + + } else if (e.getActionCommand().equals("NewMeta")) { + JTextField metaField = new JTextField(""); + JComboBox metaBox = new JComboBox(); + File[] files = (new File(".")).listFiles(); + for (File f : files) { + if (f.getName().startsWith("ERC")||f.getName().startsWith("meta")) { + metaBox.addItem(f.getName()); + } + } + JTextActionArea textArea = new JTextActionArea("",true); + textArea.setPreferredSize(new Dimension(140,400)); + metaBox.addActionListener(textArea); + textArea.actionPerformed(new ActionEvent(metaBox, 0, "")); + + final JComponent[] inputs = new JComponent[] { + new JLabel("Name of new metadataset"), + metaField, + new JLabel("Existing metadatasets"), + metaBox, + new JLabel("Metadata fields in new set"), + textArea + + }; + int result = JOptionPane.showConfirmDialog(null, inputs, "Create metadata set", JOptionPane.PLAIN_MESSAGE); + if (result == JOptionPane.OK_OPTION) { + String val = metaField.getText(); + String metastr = textArea.getText(); + String[] fields = metastr.split("\n"); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(new File(val))); + for (String l:fields) { + bw.write(l+"\n"); + } + bw.close(); + } catch (IOException e2) { + e2.printStackTrace(); + } + } else { + + } + + } + + } + + + public void save() { + if (saveFile==null) { + saveAs(); + return; + } + saveState(saveFile); + + } + + private void saveAs() { + JFileChooser jfc = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory()); + + int returnValue = jfc.showSaveDialog(null); + + if (returnValue == JFileChooser.APPROVE_OPTION) { + File selectedFile = jfc.getSelectedFile(); + saveState(selectedFile); + saveFile = selectedFile; + setTitle(BASE_TITLE + " - "+ saveFile.toString()); + } + + } + + + private void chooseDir() { + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Choose directory for fastq files"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + chooser.setAcceptAllFileFilterUsed(false); + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + datadirText.setText(chooser.getSelectedFile().toString()); + } + else { + System.out.println("No Selection "); + } + + } + + + private void submitIsolates(boolean ftp, boolean ena, boolean tessy) { + + String sftpHost= ftpHostText.getText(); + String sftpLogin = ftpLoginText.getText(); + char[] ftpPasswdchars = ftpPassText.getPassword(); + String sftpPass = new String(ftpPasswdchars); + + String tessyLogin = tessyLoginText.getText(); + String tessyUrl = tessyHostText.getText(); + String tessyDomain = tessyDomainText.getText(); + String tessyTarget = tessyTargetText.getText(); + String tessyContact = tessyContactText.getText(); + String tessyProvider = tessyProviderText.getText(); + String tessySubject = tessySubjectText.getText(); + String tessyMeta = tessyMetaText.getText(); + String tessyCountry = tessyCountryText.getText(); + + char[] tessyPasswdchars = tessyPassText.getPassword(); + String tessyPass = new String(tessyPasswdchars); + + + TessyCredentials cred = null; + TessyBatch batch = null; + if (tessy) { + if (tessyPass.equals("") || tessyLogin.equals("") || tessyUrl.equals("") || tessyDomain.equals("") || tessyTarget.equals("")) { + JOptionPane.showMessageDialog(this, "You must enter TESSy login information to submit to TESSy"); + return; + } else { + + cred = new TessyCredentials(); + cred.setUsername(tessyLogin); + cred.setPassword(tessyPasswdchars); + cred.setDomain(tessyDomain); + cred.setHostname(tessyUrl); + cred.setTarget(tessyTarget); + } + boolean haltRemark = tessyRemarkCheckBox.isSelected(); + boolean haltWarn = tessyWarnCheckBox.isSelected(); + + + + + batch = new TessyBatch("",tessyCountry,tessyContact, tessyProvider, tessyMeta, tessySubject); + batch.setTessyCredentials(cred); + batch.setHaltWarn(haltWarn); + batch.setHaltRemark(haltRemark); + + } + + String projectId = projaccText.getText(); + String center = centerText.getText(); + File dataDir = new File(datadirText.getText()); + + boolean anonymize = anonButton.isSelected(); + boolean prod = prodButton.isSelected(); + boolean ftpExist = ftpButton.isSelected(); + + + + String delimiter = delimiterText.getText(); + String login = loginText.getText(); + + String enaChecklist = checklistText.getText(); + + char[] passwdchars = passwdText.getPassword(); + String pass = new String(passwdchars); + + if (ena) { + if (center.equals("")) { + JOptionPane.showMessageDialog(this, "You must enter an institution"); + return; + } + if (projectId.equals("")) { + JOptionPane.showMessageDialog(this, "You must enter an existing study acc or create a study acc by submitting a study first."); + return; + } + if (!dataDir.exists()) { + if (!ftpExist) { + JOptionPane.showMessageDialog(this, "You must choose a valid data directory unless files are already on FTP."); + return; + } else { + + } + } + } + + if (ftp) { + if (sftpHost.equals("")) { + JOptionPane.showMessageDialog(this, "You must enter an SFTP host for SFTP upload."); + return; + } + if (sftpLogin.equals("")) { + JOptionPane.showMessageDialog(this, "You must enter an SFTP login for SFTP upload."); + return; + } + if (sftpPass.equals("")) { + JOptionPane.showMessageDialog(this, "You must enter an SFTP password for SFTP upload."); + return; + } + } + + int rows = 0; + for (int i = 0;i dataTable.getColumnCount()-7) { + return; + } + + int row1 = e.getFirstRow(); + int row2 = e.getLastRow(); + for (int i = row1;i<=row2;i++) { + if (dataTableModel.getValueAt(i,0)!=null) { + dataTableModel.setValueAt(timestamp.format(new Date()), i, 1); + } + } + + if (saveFile!=null) { + save(); + } + } + + + }); + + + } + + + public void saveState(File f) { + + + + + String ftpHost = ftpHostText.getText(); + String ftpLogin = ftpLoginText.getText(); + + boolean useFtp = ftpCheckBox.isSelected(); + boolean useEna = enaCheckBox.isSelected(); + boolean useTessy = tessyCheckBox.isSelected(); + + boolean haltWarn = tessyWarnCheckBox.isSelected(); + boolean haltRemark = tessyRemarkCheckBox.isSelected(); + + String tessyLogin = tessyLoginText.getText(); + String tessyUrl = tessyHostText.getText(); + String tessyDomain = tessyDomainText.getText(); + String tessyTarget = tessyTargetText.getText(); + String tessyContact = tessyContactText.getText(); + String tessyProvider = tessyProviderText.getText(); + String tessySubject = tessySubjectText.getText(); + String tessyMeta = tessyMetaText.getText(); + + String tessyCountry = tessyCountryText.getText(); + + + String projectId = projaccText.getText(); + String center = centerText.getText(); + String alias = projectText.getText(); + String dataDir = datadirText.getText(); + + boolean anonymize = anonButton.isSelected(); + boolean prod = prodButton.isSelected(); + boolean ftpExist = ftpButton.isSelected(); + + + + String enaChecklist = checklistText.getText(); + + String delimiter = delimiterText.getText(); + String login = loginText.getText(); + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(f)); + bw.write("PROJECT_ALIAS="+alias+"\n"); + bw.write("PROJECT_ACC="+projectId+"\n"); + bw.write("CENTRE="+center+"\n"); + bw.write("DATA_DIR="+dataDir+"\n"); + bw.write("ANONYMIZE="+Boolean.toString(anonymize)+"\n"); + bw.write("PRODUCTION="+Boolean.toString(prod)+"\n"); + bw.write("FTP_EXISTS="+Boolean.toString(ftpExist)+"\n"); + bw.write("DELIMITER="+delimiter+"\n"); + bw.write("LOGIN="+login+"\n"); + bw.write("CHECKLIST="+enaChecklist+"\n"); + bw.write("TESSYLOGIN="+tessyLogin+"\n"); + bw.write("TESSYURL="+tessyUrl+"\n"); + bw.write("TESSYDOMAIN="+tessyDomain+"\n"); + bw.write("TESSYTARGET="+tessyTarget+"\n"); + bw.write("TESSYCONTACT="+tessyContact+"\n"); + bw.write("TESSYPROVIDER="+tessyProvider+"\n"); + bw.write("TESSYSUBJECT="+tessySubject+"\n"); + bw.write("TESSYMETA="+tessyMeta+"\n"); + bw.write("TESSYCOUNTRY="+tessyCountry+"\n"); + bw.write("FTPHOST="+ftpHost+"\n"); + bw.write("FTPLOGIN="+ftpLogin+"\n"); + bw.write("USEFTP="+Boolean.toString(useFtp)+"\n"); + bw.write("USEENA="+Boolean.toString(useEna)+"\n"); + bw.write("USETESSY="+Boolean.toString(useTessy)+"\n"); + bw.write("HALTWARN="+Boolean.toString(haltWarn)+"\n"); + bw.write("HALTREMARK="+Boolean.toString(haltRemark)+"\n"); + + String headRow = ""; + for (int j = 0;j headFields = new ArrayList(); + headFields.add("ID"); + headFields.add("Last modified"); + + String line; + try { + BufferedReader br = new BufferedReader(new FileReader(infile)); + while ((line = br.readLine())!=null) { + if (!line.equals("")) { + headFields.add(line.trim()); + } + } + br.close(); + } catch (IOException e) { + + e.printStackTrace(); + } + + headFields.add("Instrument model"); + headFields.add("species"); + headFields.add("File base name"); + headFields.add("ENA Anonymized id*"); + headFields.add("ENA Sample acc*"); + headFields.add("ENA Experiment acc*"); + headFields.add("ENA Run acc*"); + headFields.add("ENA Uploaded files*"); + headFields.add("TESSy batch*"); + headFields.add("TESSy validation*"); + headFields.add("TESSy date last uploaded*"); + headFields.add("TESSy date last approved*"); + headFields.add("TESSy id*"); + headFields.add("SFTP uploaded date*"); + + + + String [] header = (String[]) headFields.toArray(new String[0]); + String[][] data = new String[MAXROWS][header.length]; + dataTableModel = new DefaultTableModel(data,header); + dataTable.setModel(dataTableModel); + addTableListener(); + + } + + + +} diff --git a/src/eu/europa/ecdc/enauploader/ENAuploaderMain.java b/src/eu/europa/ecdc/enauploader/ENAuploaderMain.java index 58a956d..3520687 100644 --- a/src/eu/europa/ecdc/enauploader/ENAuploaderMain.java +++ b/src/eu/europa/ecdc/enauploader/ENAuploaderMain.java @@ -20,7 +20,7 @@ public class ENAuploaderMain { - private static String version="0.20"; + private static String version="0.22"; // This is a command line version @@ -33,7 +33,7 @@ public static void main(String[] args) { // Login (Webin-NNNNN) // Password // yes/no whether to use the production database at EBI - // yes/no whether to anonymize + // yes/no whether to anonymizehttp://marketplace.eclipse.org/marketplace-client-intro?mpc_install=156 // yes/no whether files are already on FTP //delimiter //ENA checklist @@ -144,10 +144,24 @@ public static void main(String[] args) { passwd = new String(System.console().readPassword()); } + boolean prod=false; + if (commandLine.hasOption("production")) { + String anonStr = commandLine.getOptionValue("production"); + if (anonStr.equals("yes")) { + prod = true; + } else if (anonStr.equals("no")) { + prod = false; + } else { + System.out.println("--production must be yes or no."); + return; + } + } + + String release; if (commandLine.hasOption("r")) { release = commandLine.getOptionValue("r"); - releaseStudy(center,release,curlPath,tmpPath,login,passwd); + releaseStudy(center,release,curlPath,tmpPath,login,passwd,prod); return; } else { @@ -221,18 +235,7 @@ public static void main(String[] args) { return; } } - boolean prod=false; - if (commandLine.hasOption("production")) { - String anonStr = commandLine.getOptionValue("production"); - if (anonStr.equals("yes")) { - prod = true; - } else if (anonStr.equals("no")) { - prod = false; - } else { - System.out.println("--production must be yes or no."); - return; - } - } + boolean ftpExist=false; if (commandLine.hasOption("ftp")) { String anonStr = commandLine.getOptionValue("ftp"); @@ -270,6 +273,11 @@ public static void main(String[] args) { s.setCurlPath(curlPath); s.setTmpPath(tmpPath); + if (prod) { + s.useProductionServer(true); + } else { + s.useProductionServer(false); + } Project p = new Project(center,project,s); p.setReleaseDate(holdDate); @@ -302,7 +310,7 @@ public static void main(String[] args) { String[] header = ENAUtils.readCsvHeader(csvFile); CsvOutputHandler outHandler = new CsvOutputHandler(csvFile,outCsv,project); - SubmissionWorker worker = new SubmissionWorker(center, project, data, header, dataDir,login,passwd, prod, anon, ftpExist, delimiter, checklist, null, tmpPath, curlPath, ftpHost, outHandler); + SubmissionWorker worker = new SubmissionWorker(center, project, data, header, dataDir,login,passwd, prod, anon, ftpExist, delimiter, checklist, null, tmpPath, curlPath, ftpHost, outHandler, null,"","","", false, true, false, null); worker.doInBackground(); } @@ -331,13 +339,16 @@ public static void main(String[] args) { } - private static void releaseStudy(String center, String acc, String curlPath, String tmpPath, String login, String passwd) { + private static void releaseStudy(String center, String acc, String curlPath, String tmpPath, String login, String passwd, boolean prod) { String randomUUIDString = UUID.randomUUID().toString(); Submission s = new Submission(center, randomUUIDString); s.setCurlPath(curlPath); s.setTmpPath(tmpPath); - + if (prod) { + s.useProductionServer(true); + } + Project p = new Project(center,"",s); p.setAccession(acc); p.setReleaseAction(true); diff --git a/src/eu/europa/ecdc/enauploader/EcdcAutomationWorker.java b/src/eu/europa/ecdc/enauploader/EcdcAutomationWorker.java new file mode 100644 index 0000000..9cd2c99 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcAutomationWorker.java @@ -0,0 +1,179 @@ +package eu.europa.ecdc.enauploader; + +import java.util.ArrayList; + +import javax.swing.JTable; + +// This class automates the process of Data import, sequence file linking and data submission +public class EcdcAutomationWorker extends EcdcJob { + + private ImportConfig importConfig; + private JTable table; + + EcdcAutomationWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + public void setImportConfig (ImportConfig cfg) { + this.importConfig = cfg; + } + + public void setTable (JTable table) { + this.table = table; + } + + @Override + protected Object doInBackground() throws Exception { + + setTitle("Automated import, linking and submission"); + setStatus("Initializing"); + setProgress(10); + + // Create EcdcImportWorker for data import + EcdcImportWorker importWorker = gui.getEcdcImportWorker(name); + + + // Check if this job was interrupted + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(30); + return null; + } + + + // If the worker was successfully created, run it and wait for the job to finish + if (importWorker!=null) { + setStatus("Importing..."); + setProgress(25); + importWorker.execute(); + boolean done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + if (importWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(30); + return null; + } + if (importWorker.isDone()) { + done=true; + } + } + } else { + log("GUI returned null ImportWorker, exiting"); + setStatus("Error, null ImportWorker"); + setProgress(35); + return null; + } + + setStatus("Linking sequence data..."); + setProgress(35); + int[] selected = new int[table.getRowCount()]; + for (int i = 0; i< selected.length;i++) { + selected[i] = i; + } + EcdcLinkWorker linkWorker = gui.getEcdcLinkWorker(importConfig.getSubject(), selected); + + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(40); + return null; + } + + + + // If the worker was successfully created, run it and wait for the job to finish + if (linkWorker!=null) { + setProgress(37); + linkWorker.execute(); + boolean done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + if (linkWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(45); + return null; + } + if (linkWorker.isDone()) { + done=true; + + } + } + } else { + log("GUI returned null LinkWorker, exiting"); + setStatus("Error, null LinkWorker"); + setProgress(45); + return null; + } + + setStatus("Submitting data..."); + setProgress(60); + + + ArrayList uploadList = gui.getUploadList(table, cfg); + + + int[] selectedForUpload = new int[uploadList.size()]; + for (int i = 0; i< uploadList.size(); i++) { + selectedForUpload[i] = uploadList.get(i); + System.out.println(uploadList.get(i)); + } + EcdcFullUploadWorker uploadWorker = gui.getFullUploadWorker(importConfig.getSubject(), selectedForUpload); + + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(70); + return null; + } + + // If the worker was successfully created, run it and wait for the job to finish + if (uploadWorker!=null) { + setProgress(65); + uploadWorker.execute(); + boolean done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + if (uploadWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(70); + return null; + } + if (uploadWorker.isDone()) { + done=true; + } + } + } else { + log("GUI returned null FullUploadWorker, exiting"); + setStatus("Error, null FullUploadWorker"); + setProgress(70); + return null; + } + log("Job finished"); + setStatus("Automated import and upload finished."); + setProgress(100); + return null; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcFullUploadWorker.java b/src/eu/europa/ecdc/enauploader/EcdcFullUploadWorker.java new file mode 100644 index 0000000..a68d314 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcFullUploadWorker.java @@ -0,0 +1,284 @@ +package eu.europa.ecdc.enauploader; + +public class EcdcFullUploadWorker extends EcdcJob { + + // Rows to submit + private int[] selectedRows; + + // Mandatory constructor + EcdcFullUploadWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + // Method for settings the rows to submit, should be called before starting the job + public void setRows(int[] selected) { + selectedRows = selected; + + } + + // Main routine for this EcdcJob + @Override + protected Object doInBackground() { + + log("Submission to multiple systems started."); + setTitle("Submission to multiple systems"); + setStatus("Initializing"); + setProgress(2); + + if (selectedRows==null || selectedRows.length==0) { + setStatus("Nothing to do, exiting."); + setProgress(100); + return null; + } + + // This section is for submitting to ENA + if (cfg.isSubmitEna()) { + setStatus("Submitting to ENA"); + setProgress(5); + log("Launching ENA job"); + + // Create EnaSubmissionWorker + EnaSubmissionWorker enaWorker = gui.getEnaSubmissionWorker(name, selectedRows); + + // Check if this job was interrupted + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(30); + return null; + } + + // If the worker was successfully created, run it and wait for the job to finish + if (enaWorker!=null) { + enaWorker.execute(); + boolean done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + if (enaWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(30); + return null; + } + if (enaWorker.isDone()) { + done=true; + } + } + } else { + log("GUI returned null enaWorker, continuing without ENA"); + } + + + } + + // This section is for submitting to TESSy + if (cfg.isSubmitTessy()) { + // Check if this job was interrupted + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(30); + return null; + } + setStatus("Testing at TESSy"); + setProgress(30); + log("TESSy test job"); + + // Create and run a job for testing at TESSy + EcdcTessyCreateAndTestWorker tessyTestWorker = gui.getEcdcTessyTestWorker(name, selectedRows); + if (tessyTestWorker!=null) { + tessyTestWorker.execute(); + } else { + setStatus("Error, no valied entries selected"); + setProgress(35); + log("GUI returned null tessyTestWorker, likely an error in the isolate table"); + return null; + } + + // Wait for job to finish + boolean done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + if (tessyTestWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(35); + return null; + } + if (tessyTestWorker.isDone()) { + done=true; + } + } + + // Check the validation results and decide whether to continue + batch = tessyTestWorker.getBatch(); + String batchId = batch.getBatchId(); + if (!batch.passedValidation()) { + log("Batch did not pass validation, quitting"); + setStatus("Error, the batch did not pass TESSy validation"); + setProgress(35); + return null; + } + + // Check if this job was interrupted + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(40); + return null; + } + + // Create and run a job for uploading to TESSy + setStatus("Uploading to TESSy"); + setProgress(40); + log("TESSy upload job"); + EcdcTessyUploadWorker tessyUploadWorker = gui.getEcdcTessyUploadWorker(batchId); + if (tessyUploadWorker!=null) { + tessyUploadWorker.execute(); + } else { + log("GUI returned null tessyUploadWorker, likely an error in the isolate table"); + return null; + } + + // Wait for job to finish + done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + // with batches going out of synch between the app and TESSy + if (tessyUploadWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(45); + return null; + } + if (tessyUploadWorker.isDone()) { + done=true; + } + } + + // Check the validation results and decide whether to continue. This should pretty much never fail as the batch has been tested. + // If the batch somehow fails at this stage, it must be rejected manually before retrying. + batch = tessyUploadWorker.getBatch(); + if (!batch.passedValidation()) { + log("Batch did not pass validation after Upload, quitting"); + setStatus("Error, the batch did not pass TESSy validation"); + setProgress(45); + return null; + } + + // Check if this job was interrupted + // with batches going out of synch between the app and TESSy + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(60); + return null; + } + setStatus("Approving in TESSy"); + setProgress(60); + log("TESSy approve job"); + EcdcTessyApprovalWorker tessyApprovalWorker = gui.getEcdcTessyApprovalWorker(batchId); + if (tessyApprovalWorker!=null) { + tessyApprovalWorker.execute(); + } else { + log("GUI returned null tessyApprovalWorker, likely an error in the isolate table"); + return null; + } + done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + // with batches going out of synch between the app and TESSy + if (tessyApprovalWorker.isDone()) { + done=true; + } + } + + // Check if batch was actually approved + batch = tessyApprovalWorker.getBatch(); + if (!batch.getState().equals("APPROVED")) { + log("Batch Approval failed, quitting"); + setStatus("Error, batch approval failed"); + setProgress(65); + return null; + } + + + } + + // This section is for submission to SFTP + if (cfg.isSubmitFtp()) { + + // Check if this job was interrupted + if (isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(75); + return null; + } + + setStatus("Submitting to ECDC SFTP"); + setProgress(75); + log("Launching SFTP UPLOAD job"); + + // Create and run a job for submitting to SFTP + EcdcSftpUploadWorker sftpWorker = gui.getSftpWorker(name, selectedRows); + if (sftpWorker!=null) { + sftpWorker.execute(); + } else { + log("GUI returned null sftpWorker, likely an error in the isolate table"); + return null; + } + + // Wait for the job to finish + boolean done=false; + while (!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + } + + // Check if this job was interrupted + if (sftpWorker.isStopped()) { + log("Job interrupted, exiting"); + setStatus("Error, job interrupted"); + setProgress(80); + return null; + } + if (sftpWorker.isDone()) { + done=true; + } + } + + + } + setStatus("Finished!"); + setProgress(100); + + return null; + } + + + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcImportWorker.java b/src/eu/europa/ecdc/enauploader/EcdcImportWorker.java new file mode 100644 index 0000000..ef091b0 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcImportWorker.java @@ -0,0 +1,268 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; + +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +public class EcdcImportWorker extends EcdcJob { + + private JTable table; + private ImportConfig importConfig; + private File importFile; + + EcdcImportWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + + public void setImportConfig (ImportConfig cfg) { + this.importConfig = cfg; + } + + public void setTable (JTable table) { + this.table = table; + } + + @Override + protected Object doInBackground() throws Exception { + + if (importFile==null) { + importFile = new File(importConfig.getDatafile()); + } + + setTitle("Importing data for: "+name); + setStatus("Performing import"); + setProgress(10); + + doImport(table, importConfig, this); + + setStatus("Import finished."); + setProgress(100); + + return null; + } + + + // Method for import using a ImportConfig, will select the source from the config parameters + private ArrayList doImport(JTable table, ImportConfig cfg, EcdcJob job) { + + if (job!=null) { + job.log("Starting import..."); + } + + ArrayList importedRows = new ArrayList(); + ArrayList oldEntries = new ArrayList(); + + // Read the existing entries + for (int i = 0;i importFields = new ArrayList(); + ArrayList tableIndices = new ArrayList(); + HashMap fixed = new HashMap(); + + // Get any constant field values from the config, these will not be imported but rather set to the fixed value + for (String k: cfg.getConstants().keySet()) { + String value = cfg.getConstants().get(k); + for (int i = 0;i data=null; + + if (job!=null) { + job.log("Checking import source type"); + } + + // Choose import source type and call the corresponding import method + switch (cfg.getImportType()) { + case ImportConfig.IMPORT_SQL: + if (job!=null) { + job.log("SQL"); + } + data = ImportTools.importSql(cfg,oldEntries, importFields, job); + break; + + case ImportConfig.IMPORT_SQLITE: + if (job!=null) { + job.log("SQLite"); + } + data = ImportTools.importSqlite(cfg,oldEntries, importFields, job); + break; + + case ImportConfig.IMPORT_CSV: + if (job!=null) { + job.log("CSV"); + } + + data = ImportTools.importCsv(cfg, oldEntries, importFields, job, importFile); + break; + + case ImportConfig.IMPORT_EXCEL: + if (job!=null) { + job.log("Excel"); + } + data = ImportTools.importExcel(cfg, oldEntries, importFields, job, importFile); + break; + + } + + + if (data==null) { + if (job!=null) { + job.log("Null data returned by import routine"); + } + return importedRows; + } + + // Map the values + if (job!=null) { + job.log("Mapping values"); + } + + data = ImportTools.mapValues(data,importFields,tableIndices,cfg.getValueMap()); + + + DefaultTableModel model =(DefaultTableModel)table.getModel(); + + // Make a HashMap from RecordId to row number for the existing entries + HashMap oldIds = new HashMap(); + for (int i = 0;i { + + // This abstract class should be used for background jobs launched by the Ecdc upload app + // The constructor automatically adds the job to the GUI's job handler + + // doInbackground() must be implemented by the class inheriting this class, that is where the actual code goes + // + // A constructor also needs to be implemented, similar to the one below: + // EcdcSftpUploadWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, String[][] data) { + // super(gui, batch, name, cfg, headers, data); + // } + // + // To set the status shown in the job manager, these three methods are used, the GUI is only updated on setProgress(int), so do that last. + // setTitle(String title); + // setStatus(String status); + // setProgress(int progress); progress goes from 0 (just started) to 100 (finished) + // + // To add to the job log, use the method: + // log(String message) + // + + protected String name; + protected UploadConfig cfg; + protected String[] headers; + protected String[][] data; + protected int batchId; + protected EcdcUploaderGUI gui; + protected TessyBatch batch; + private String status; + private String title; + private String logText; + private SimpleDateFormat dateFormat; + private boolean stopped = false; + private String id; + + EcdcJob (EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers,String[][] data) { + this.dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + this.logText = ""; + this.gui = gui; + this.batch = batch; + this.name = name; + this.cfg = cfg; + this.headers = headers; + this.data = data; + gui.getJobHandler().addJob(this); + this.addPropertyChangeListener(gui.getJobHandler()); + this.setProgress(1); + SimpleDateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd_HHmmss_SS"); + id = logDateFormat.format(new Date()); + } + + public boolean isStopped() { + return stopped; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public void log(String text){ + if (!logText.equals("")) { + logText = logText+"\n"; + } + logText=logText+"["+dateFormat.format(new Date())+"] "+text; + } + + public String getLogText() { + return logText; + } + + public TessyBatch getBatch() { + return batch; + } + + public void stopJob(boolean b) { + stopped = true; + } + + + + public void done() { + + File logDir = new File("./logs"); + if (!logDir.exists()) { + logDir.mkdirs(); + } + File logFile = new File(logDir.toString()+"/"+id+".log"); + + log("Writing logfile: "+logFile.toString()); + + try { + BufferedWriter bw = new BufferedWriter(new FileWriter(logFile)); + bw.write(logText); + bw.close(); + } catch(IOException e) { + log("Failed to write logfile to disk."); + } + + + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcJobHandler.java b/src/eu/europa/ecdc/enauploader/EcdcJobHandler.java new file mode 100644 index 0000000..a9ffb50 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcJobHandler.java @@ -0,0 +1,200 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.beans.PropertyChangeEvent; +import java.beans.PropertyChangeListener; +import java.io.InputStream; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; + +import javax.imageio.ImageIO; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextArea; + +//This class is the GUI-component and actual job manager for the Ecdc upload app +public class EcdcJobHandler extends JFrame implements PropertyChangeListener, ActionListener{ + + private static final long serialVersionUID = 6686812811438715750L; + + + JPanel mainPanel; + private JPanel jobPanel; + private LinkedHashMap jobs; + private LinkedHashMap panels; + + + EcdcJobHandler() { + + // Init UI components + mainPanel = new JPanel(new BorderLayout()); + + JButton clearButton = new JButton("Clear all finished jobs"); + clearButton.setActionCommand("clear"); + clearButton.addActionListener(this); + JPanel clearPanel = new JPanel(); + clearPanel.add(clearButton); + + mainPanel.add(clearPanel,BorderLayout.NORTH); + + jobPanel = new JPanel(); + jobs = new LinkedHashMap(); + panels = new LinkedHashMap(); + + setSize(800,600); + mainPanel.setSize(800,600); + jobPanel.setSize(800,600); + jobPanel.setLayout(new BoxLayout(jobPanel, BoxLayout.PAGE_AXIS)); + mainPanel.add(jobPanel,BorderLayout.CENTER); + this.add(mainPanel); + setTitle("ECDC WGS upload app - Job handler"); + this.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); + try { + String imagePath = "media/ECDC2.png"; + InputStream imgStream = UploadConfigGUI.class.getResourceAsStream(imagePath ); + BufferedImage myImg; + myImg = ImageIO.read(imgStream); + setIconImage(myImg); + } catch (Exception e) { + e.printStackTrace(); + } + pack(); + } + + + // Add a new job. This is called by the EcdcJob constructor and does not explicitly need to be called + public void addJob(EcdcJob job) { + EcdcJobPanel panel = new EcdcJobPanel(job.toString(),this); + jobs.put(job,panel); + panels.put(panel,job); + jobPanel.add(panel); + job.log("Added job to job manager"); + + // Update UI and make it pop to the front + pack(); + jobPanel.repaint(); + setVisible(true); + toFront(); + } + + // Remove job from handler + public void removeJob(EcdcJobPanel panel) { + + EcdcJob job = panels.get(panel); + if (job.isDone()) { + jobPanel.remove(panel); + jobs.remove(job); + panels.remove(panel); + } + if (panels.isEmpty()) { + setVisible(false); + } + pack(); + repaint(); + } + + // Try to interrupt job + public void cancelJob(EcdcJobPanel panel) { + EcdcJob job = panels.get(panel); + + // If the job is already gone, show that it is cancelled + if (job==null) { + panel.cancel(); + return; + } + + // Try to cancel the job, if successful, show that it is cancelled + // Note that jobs may be impossible to cancel at some stages, the individual EcdcJob + // implementations have to handle the signal + job.stopJob(false); + if (job.isDone()) { + panel.cancel(); + } + + } + + // When any job is updated, update UI + @Override + public void propertyChange(PropertyChangeEvent evt) { + + // Get the source job + EcdcJob source = (EcdcJob) evt.getSource(); + System.out.println("job event! "+source.toString()); + + // Get the visual job panel + EcdcJobPanel panel = jobs.get(source); + if (panel==null) { + return; + } + + // If job made progress, update progress + if (evt.getPropertyName().equals("progress")) { + int intVal = (Integer)evt.getNewValue(); + panel.setProgress(intVal); + } + + // Set title and status + String status = source.getStatus(); + String title = source.getTitle(); + panel.setLabel(status); + if (title!=null) { + panel.setTitle(title); + } + + // Check if job finished, if so, update panel reflecting this information + if (source.isDone()) { + panel.setDone(); + } + + } + + // This method opens a window where the log for a certain job is shown. + public void showLog(String title, EcdcJobPanel panel) { + EcdcJob job = panels.get(panel); + String logText = job.getLogText(); + + JFrame f = new JFrame("Log for "+title); + JPanel logPanel = new JPanel(); + + f.getContentPane().add(logPanel, "Center"); + JTextArea ta = new JTextArea(logText); + + JScrollPane scroller = new JScrollPane(ta); + scroller.setPreferredSize(new Dimension(1200, 800)); + logPanel.add(scroller); + + try { + String imagePath = "media/ECDC2.png"; + InputStream imgStream = UploadConfigGUI.class.getResourceAsStream(imagePath ); + BufferedImage myImg; + myImg = ImageIO.read(imgStream); + f.setIconImage(myImg); + } catch (Exception e) { + e.printStackTrace(); + } + + f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + f.setSize(1300, 900); + f.setVisible(true); + } + + // Remove finished jobs from UI + @Override + public void actionPerformed(ActionEvent e) { + LinkedHashSet jobPanels = new LinkedHashSet(panels.keySet()); + for (EcdcJobPanel p : jobPanels) { + removeJob(p); + } + } + + + + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcJobPanel.java b/src/eu/europa/ecdc/enauploader/EcdcJobPanel.java new file mode 100644 index 0000000..8375bbf --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcJobPanel.java @@ -0,0 +1,119 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JProgressBar; +import javax.swing.border.TitledBorder; + +public class EcdcJobPanel extends JPanel implements ActionListener { + + private static final long serialVersionUID = 8549159337996248380L; + private JProgressBar bar; + private JLabel label; + private EcdcJobHandler handler; + private JButton closeButton; + private JButton logButton; + + EcdcJobPanel(String title, EcdcJobHandler handler) { + + // Init UI components + this.handler=handler; + setBorder(BorderFactory.createTitledBorder(title)); + label = new JLabel(title); + bar = new JProgressBar(); + bar.setMaximum(100); + bar.setMinimum(0); + bar.setValue(0); + add(label); + add(bar); + setSize(100,500); + closeButton = new JButton("Cancel"); + closeButton.setActionCommand("Cancel"); + closeButton.addActionListener(this); + add(closeButton); + logButton = new JButton("Show log"); + logButton.setActionCommand("log"); + logButton.addActionListener(this); + add(logButton); + } + + // Set progressbar, from 0 to 100 + public void setProgress(int intVal) { + bar.setValue(intVal); + + // If progress at max, change button text and action + if (intVal==100) { + setDone(); + } + repaint(); + } + + // Change action and text on button to reflect that the job is finished + public void setDone() { + closeButton.setActionCommand("Remove"); + closeButton.setText("Remove"); + repaint(); + } + + // Update the text next to the progressbar + public void setLabel(String l) { + if (l==null) { + return; + } + label.setText(l); + if (l.startsWith("Error")) { + closeButton.setText("Remove"); + closeButton.setActionCommand("Remove"); + } + repaint(); + } + + // Update the title of the job + public void setTitle(String l) { + TitledBorder b = (TitledBorder)this.getBorder(); + b.setTitle(l); + } + + + // Reflect visually that a job has been cancelled + public void cancel() { + closeButton.setText("Remove"); + closeButton.setActionCommand("Remove"); + setLabel("Cancelled"); + repaint(); + } + + // Action for the buttons + @Override + public void actionPerformed(ActionEvent e) { + String cmd = e.getActionCommand(); + action(cmd); + } + + + // The various actions possible for the buttons + // The handler should perform all operations on jobs and then call this class for updating UI + public void action(String cmd) { + + // Cancel the job + if (cmd.equals("Cancel")) { + handler.cancelJob(this); + + // Remove the job + } else if (cmd.equals("Remove")) { + handler.removeJob(this); + + // Open log + } else if (cmd.equals("log")) { + String t = ((TitledBorder)this.getBorder()).getTitle(); + handler.showLog(t,this); + + } + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcLinkWorker.java b/src/eu/europa/ecdc/enauploader/EcdcLinkWorker.java new file mode 100644 index 0000000..8efab86 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcLinkWorker.java @@ -0,0 +1,224 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; + +import javax.swing.JOptionPane; +import javax.swing.JTable; + +public class EcdcLinkWorker extends EcdcJob { + + private JTable table; + private int[] selected; + private String READ_FILES_COLUMN; + private String ASSEMBLY_FILE_COLUMN; + private ArrayList linkedRows; + private String BASE_FILES_COLUMN; + + + EcdcLinkWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + selected = null; + } + + public void setTable (JTable table) { + this.table = table; + } + + public void setSelected (int[] selected) { + this.selected = selected; + } + + public void setColumnNames(String baseName, String rawName, String assemblyName) { + BASE_FILES_COLUMN = baseName; + READ_FILES_COLUMN = rawName; + ASSEMBLY_FILE_COLUMN = assemblyName; + } + + + @Override + protected Object doInBackground() throws Exception { + + setTitle("Linking sequence files"); + setStatus("Initializing"); + setProgress(5); + + // Get the selected table if not supplied + + // use selected rows if not supplied + if (selected==null) { + selected = table.getSelectedRows(); + } + + if (cfg == null) { + log("Error, no config found for "+name); + setStatus("Initialization error"); + setProgress(10); + return null; + } + + + + String rawDir = cfg.getRawdataDir(); + String assemblyDir = cfg.getAssemblyDir(); + String rawDelim = cfg.getRawdataDelimiter(); + String assemblyDelim = cfg.getAssemblyDelimiter(); + + // Check if data directories are supplied in the config + if (rawDir.equals("") && assemblyDir.equals("")) { + log("At least one of 'Assembly directory' or 'Raw reads directory' must be defined in the configuration."); + setStatus("Initialization error"); + setProgress(10); + return null; + } + + + + // Init variables + linkedRows = new ArrayList(); + + int numberLinkedRaw = 0; + int numberLinkedAssembly = 0; + + setStatus("Reading raw data directory"); + log("Reading raw data directory: "+rawDir); + setProgress(10); + // List the raw data directory recursively + ArrayList foundFiles = new ArrayList(); + File rawDirFile = new File(rawDir); + if (!rawDir.equals("") && rawDirFile.exists() && rawDirFile.isDirectory()) { + try { + foundFiles = EcdcUtils.search(new File(rawDir), foundFiles); + } catch (IOException e) { + log(e.getMessage()); + setStatus("IO Error"); + setProgress(12); + } + } else { + log("No raw reads directory found. Skipping import of raw reads."); + } + + setStatus("Reading assembly data directory"); + log("Reading assembly data directory: "+assemblyDir); + setProgress(35); + ArrayList foundFilesAssembly; + if (!assemblyDir.equals(rawDir)) { + // List the assembly data directory recursively + foundFilesAssembly = new ArrayList(); + File assemblyDirFile = new File(assemblyDir); + if (!assemblyDir.equals("") && assemblyDirFile.exists() && assemblyDirFile.isDirectory()) { + try { + foundFilesAssembly = EcdcUtils.search(new File(assemblyDir), foundFilesAssembly); + } catch (IOException e) { + log(e.getMessage()); + setStatus("IO Error"); + setProgress(37); + } + } else { + log("No assembly directory found. Skipping import of assemblies."); + } + } else { + log("Assembly directory same as raw read directory, reusing index."); + foundFilesAssembly = (ArrayList)foundFiles.clone(); + } + + // Init column indices + int baseCol = gui.getColumn(table,BASE_FILES_COLUMN); + int fileCol = gui.getColumn(table,READ_FILES_COLUMN); + int assemblyCol = gui.getColumn(table,ASSEMBLY_FILE_COLUMN); + log("Raw reads table column: "+Integer.toString(fileCol)); + log("Assembly table column: "+Integer.toString(assemblyCol)); + + setStatus("Matching entries with files"); + log("Matching entries with files"); + setProgress(60); + // Iterate through the table rows + log("Iterating over "+Integer.toString(foundFiles.size())+" files in reads direcotyr."); + log("Iterating over "+Integer.toString(foundFilesAssembly.size())+" files in assembly directory."); + log("Iterating over "+Integer.toString(selected.length)+" entries."); + for (int i : selected) { + + String id; + String baseVal = (String)table.getValueAt(i, baseCol); + if (baseVal==null || baseVal.equals("")) { + String recordId = (String)table.getValueAt(i, 0); + id = recordId; + } else { + id = baseVal; + } + + + + + String files = (String)table.getValueAt(i, fileCol); + String filesAssembly = (String)table.getValueAt(i, assemblyCol); + + // Skip rows missing RecordId + if (id == null || id.equals("")) { + continue; + } + + // If the raw read links are empty, try to find links + + String pattern = id+rawDelim+".*[.]?fastq[.]?g?z?"; + String fileStr = ""; + + for (File f : foundFiles) { + if (!f.getName().matches(pattern)) { + continue; + } + if (!fileStr.equals("")) { + fileStr = fileStr + ";"; + } + fileStr = fileStr + f.toString(); + } + + if (!fileStr.equals("") && (files==null || files.equals("") || !files.equals(fileStr))) { + linkedRows.add(i); + table.setValueAt(fileStr,i, fileCol); + numberLinkedRaw++; + } + + + setProgress(80); + // If the assembly links are empty, try to find links + + pattern = id+assemblyDelim+".*[.]?fasta[.]?g?z?"; + + fileStr = ""; + + for (File f : foundFilesAssembly) { + + if (!f.getName().matches(pattern)) { + continue; + } + if (!fileStr.equals("")) { + fileStr = fileStr + ";"; + } + fileStr = fileStr + f.toString(); + } + if (!fileStr.equals("") && (filesAssembly==null || filesAssembly.equals("") || !filesAssembly.equals(fileStr))) { + table.setValueAt(fileStr,i, assemblyCol); + if (linkedRows.indexOf(i)==-1) { + linkedRows.add(i); + } + numberLinkedAssembly++; + } + } + + + + + log("Finished, "+Integer.toString(numberLinkedRaw)+"(reads) "+Integer.toString(numberLinkedAssembly)+"(assembly) "+" linked files"); + setStatus("Finished, "+Integer.toString(numberLinkedRaw)+"(reads) "+Integer.toString(numberLinkedAssembly)+"(assembly) "+" linked files"); + setProgress(100); + return null; + } + + public ArrayList getLinkedEntries() { + return linkedRows; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcSftpUploadWorker.java b/src/eu/europa/ecdc/enauploader/EcdcSftpUploadWorker.java new file mode 100644 index 0000000..59883cd --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcSftpUploadWorker.java @@ -0,0 +1,412 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileWriter; +import java.io.IOException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import org.apache.commons.vfs2.FileObject; +import org.apache.commons.vfs2.FileSystemException; +import org.apache.commons.vfs2.FileSystemManager; +import org.apache.commons.vfs2.FileSystemOptions; +import org.apache.commons.vfs2.Selectors; +import org.apache.commons.vfs2.VFS; +import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; +import org.jdom2.Attribute; +import org.jdom2.Document; +import org.jdom2.Element; +import org.jdom2.output.Format; +import org.jdom2.output.XMLOutputter; + +public class EcdcSftpUploadWorker extends EcdcJob { + + private OutputHandler outputHandler; + private int ftpColumn; + private static final int WAIT_RETRY = 10; + private static final int MAX_TRIES = 5; + private static final String XML_API_VERSION = "1.0.1"; + + // Mandatory constructor + EcdcSftpUploadWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + // Set the handler for output. + // TODO: This API is only used for this class, harmonisation for all EcDCJobs would be nice + public void setOutputHandler(OutputHandler handler) { + this.outputHandler = handler; + } + + // Set the table column for output + public void setFtpColumn(int col) { + ftpColumn = col; + } + + + // Main routine for this job + @Override + protected Object doInBackground() { + + // Check if cancelled + if (isStopped()) { + log("Process cancelled"); + return null; + } + + log("Uploading raw reads through SFTP"); + setTitle("Uploading reads using SFTP"); + setStatus("Connecting to SFTP host"); + setProgress(5); + + // Init parameters from config + String sftpLogin = cfg.getSftpLogin(); + String sftpHost = cfg.getSftpHost(); + String sftpPass = new String(cfg.getSftpPass()); + String sftpPath = cfg.getSftpPath(); + String tmpPath = cfg.getTmpPath(); + File dataDir = new File(cfg.getRawdataDir()); + if (!dataDir.exists()) { + log("Data directory "+dataDir.toString()+" does not exist."); + setStatus("Error, data dir not found"); + setProgress(10); + return null; + } + + int step = 80/data.length; + + // Iterate over the entries to submit + int total = data.length; + int fail = 0; + + if (total==0) { + setStatus("Error, no valid entries selected"); + setProgress(20); + return null; + } + + ISOLATE: for (int i = 0; i files = new ArrayList(); + ArrayList tmpFiles = new ArrayList(); + for (String fn: fileNames) { + File file = new File(fn); + if (file.exists()) { + + if (fn.toLowerCase().endsWith(".fastq.gz") || fn.toLowerCase().endsWith(".fastq") || fn.toLowerCase().endsWith(".fq") || fn.toLowerCase().endsWith(".fq.gz")|| fn.toLowerCase().endsWith(".fasta") || fn.toLowerCase().endsWith(".fa")) { + if (fn.endsWith(".gz") || fn.endsWith(".fasta") || fn.endsWith(".fa")) { + files.add(file); + log("Record "+recordId+", found file: "+fn); + } else { + log("Record "+recordId+", found uncompressed file: "+fn); + String tmpFilePath = tmpPath+"/"+file.getName()+".gz"; + File tmpFile = new File(tmpFilePath); + log("Compressing "+fn+" to "+tmpFilePath); + EcdcUtils.compressGzipFile(file,tmpFile); + tmpFiles.add(tmpFile); + files.add(tmpFile); + } + } + + + } else { + log("Error, for record "+recordId+", file: "+fn+" does not exist."); + fail++; + continue ISOLATE; + } + } + + if (files.isEmpty()) { + log("No raw data files found for "+recordId+", skipping."); + fail++; + continue ISOLATE; + } else { + log(Integer.toString(files.size()) + " raw data files found for "+recordId); + } + + String remotePath = sftpPath+"/"+cfg.getTessySubject(); + + int count = 0; + int step2 = step/files.size(); + + + FileSystemManager fsManager; + FileSystemOptions fsOptions; + try { + fsOptions = new FileSystemOptions(); + SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no"); + SftpFileSystemConfigBuilder.getInstance().setTimeout(fsOptions, 30000); + fsManager = VFS.getManager(); + } catch (Exception e) { + log("Failed to initialize SFTP filesystem, quitting."); + fail++; + continue ISOLATE; + } + + // Create a MD5 digest of concatenated data provider and TESSy GUID + // This is used to anonymize the file names for the SFTP + String baseName = org.apache.commons.codec.digest.DigestUtils.md5Hex(cfg.getTessyProvider()+"_"+recordId); + String xmlName = baseName+".xml"; + String xmlFile = tmpPath+"/"+xmlName; + + // Init data structures for the info that is going into the XML waybill + HashMap newFileNames = new HashMap(); + ArrayList fileNamesXml = new ArrayList(); + ArrayList checksumsXml = new ArrayList(); + + int fileCount = 1; + // Iterate over the files + for (File f : files) { + String newName; + // Anonymize and standardise filename + // TODO: Not great to have IONTORRENT hardcoded + if (f.getName().endsWith(".fa") || f.getName().endsWith(".fasta")) { + newName = baseName+".fasta"; + } else { + if (wgsProtocol.toUpperCase().equals("IONTORRENT")) { + newName = baseName+"."+Integer.toString(fileCount)+".fastq.gz"; + } else { + newName = baseName+".R"+Integer.toString(fileCount)+".fastq.gz"; + } + } + + // Calculate checksum for file, to put in XML + FileInputStream fis; + String checksum; + try { + fis = new FileInputStream(f); + checksum = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis); + fis.close(); + } catch (IOException e) { + log("Checksum failed"); + fail++; + continue ISOLATE; + } + newFileNames.put(f,newName); + fileNamesXml.add(newName); + checksumsXml.add(checksum); + fileCount++; + } + + + boolean xmlSuccess = makeSftpXml(xmlFile,baseName,fileNamesXml,wgsProtocol,checksumsXml,ui,cfg.isAnonymizeFtp(),cfg.isShareFtp(),cfg.isShowYearFtp()); + if (!xmlSuccess) { + log("XML creation failed."); + fail++; + continue ISOLATE; + } + + // Upload XML file + try { + String uriXml = "sftp://"+sftpLogin+":"+sftpPass+"@"+sftpHost+":22"+remotePath+"/"+xmlName; + FileObject localFileXml; + localFileXml = fsManager.resolveFile(xmlFile); + FileObject foXml = fsManager.resolveFile(uriXml, fsOptions); + foXml.copyFrom(localFileXml, Selectors.SELECT_SELF); + } catch (FileSystemException e1) { + log("XML upload failed."); + fail++; + continue ISOLATE; + } + + + // Upload files + for (File f : files) { + + // Check if process is cancelled + if (isStopped()) { + log("Process cancelled"); + return null; + } + setStatus("File "+f.getName()); + setProgress(10+i*step+count*step2); + log("File "+f.getName()); + + boolean done = false; + int tries = 0; + + // Upload will retry several times, as determined by the MAX_TRIES parameter + while (!done) { + done=true; + count++; + + String newName = newFileNames.get(f); + + // Check local file size, to determine if upload is successful + long filesizeLocal = f.length(); + + try { + + // Remote file and folder objects + String uri = "sftp://"+sftpLogin+":"+sftpPass+"@"+sftpHost+":22"+remotePath+"/"+newName; + String uriDir = "sftp://"+sftpLogin+":"+sftpPass+"@"+sftpHost+":22"+remotePath; + + FileObject fileObjectLocal = fsManager.resolveFile(f.getAbsolutePath()); + FileObject folderObjectRemote = fsManager.resolveFile(uriDir, fsOptions); + folderObjectRemote.createFolder(); + FileObject fileObjectRemote = fsManager.resolveFile(uri, fsOptions); + + log("Uploading to SFTP: "+fileObjectLocal.toString()+"\n"); + log("Remote file: "+fileObjectRemote.getPublicURIString()+"\n"); + + fileObjectRemote.copyFrom(fileObjectLocal, Selectors.SELECT_SELF); + + long filesizeUploaded = fileObjectRemote.getContent().getSize(); + + // Check if the file is successfully uploaded + if (filesizeUploaded != filesizeLocal) { + log("Upload error (wrong file size) for "+fileObjectLocal.toString()); + done = false; + } + + if (done) { + log("Upload for "+fileObjectLocal.toString()+" finished"); + } + + } catch (Exception e) { + + // If Exception, log it and retry + e.printStackTrace(); + log(e.getStackTrace().toString()); + done = false; + } + + if (!done) { + tries++; + // Check if the maximum number of tries have been reached + if (tries fileNames, String wgsProtocol, ArrayList checksums, String ui, boolean anonymize, boolean share, boolean showYear) { + + try { + + Element ecdcWgs = new Element("ECDCWgs"); + Element sequence = new Element("sequence"); + + Element ecdcWgsUploadClient = new Element("ecdcWgsUploadClient"); + + // Add XML API version to XML, must match back-end version + // TODO: Incorrect version should trigger user notification from back-end using email + ecdcWgsUploadClient.setAttribute(new Attribute("version", XML_API_VERSION)); + Document doc = new Document(ecdcWgs); + ecdcWgs.addContent(sequence); + sequence.addContent(ecdcWgsUploadClient); + + // Add current date and time + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Element uploadedDate = new Element("submittedDate"); + uploadedDate.setText(df.format(new Date())); + ecdcWgsUploadClient.addContent(uploadedDate); + + // Add the anonymized id + Element anonymizedId = new Element("anonymizedId"); + anonymizedId.setText(baseName); + ecdcWgsUploadClient.addContent(anonymizedId); + + // Add info for each sequence file + for (int i = 0; i< fileNames.size();i++) { + Element sequenceReads = new Element("sequenceReads"); + sequenceReads.addContent(new Element("fileName").setText(fileNames.get(i))); + sequenceReads.addContent(new Element("wgsProtocol").setText(wgsProtocol)); + sequenceReads.addContent(new Element("md5Checksum").setText(checksums.get(i))); + ecdcWgsUploadClient.addContent(sequenceReads); + } + + // Add parameters for the back-ens processing + Element config = new Element("ecdcWgsConfig"); + ecdcWgsUploadClient.addContent(config); + + // Is this associated with an event id? + config.addContent(new Element("event").setText(ui)); + + // Should the file names be anonymized if shared + config.addContent(new Element("anonymise").setText(Boolean.toString(anonymize))); + + // Should the files be shared? + config.addContent(new Element("share").setText(Boolean.toString(share))); + + // Should the year be shown if shared? + config.addContent(new Element("showYear").setText(Boolean.toString(showYear))); + + // Write XML + XMLOutputter xmlOutput = new XMLOutputter(); + xmlOutput.setFormat(Format.getPrettyFormat()); + xmlOutput.output(doc, new FileWriter(xmlFile)); + log("xmlFile written: "+xmlFile); + + } catch (IOException io) { + log("Error, could not write xmlFile: "+xmlFile); + return false; + } + return true; + } +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcTessyApprovalWorker.java b/src/eu/europa/ecdc/enauploader/EcdcTessyApprovalWorker.java new file mode 100644 index 0000000..f6a76fa --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcTessyApprovalWorker.java @@ -0,0 +1,95 @@ +package eu.europa.ecdc.enauploader; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; + +// Class for submitting reads and assembly to SFTP +public class EcdcTessyApprovalWorker extends EcdcJob { + + // Mandatory constructor + EcdcTessyApprovalWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + // Main process for the event + @Override + protected Object doInBackground() throws Exception { + + String batchId = batch.getBatchId(); + + // Check if process was interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + log("Approving batch "+batchId); + + setTitle("Approving batch "+batchId); + setStatus("Retrieving validation..."); + setProgress(5); + + // Batch must have passed validation before approval + if (!batch.passedValidation()) { + log("Batch did not pass validation, it cannot be approved. See deails below. Reject the batch and restart."); + + HashMap results = batch.getValidationResults(); + for (String k : results.keySet()) { + TessyValidationResult val = results.get(k); + log(val.toString()); + } + + setStatus("Error, batch did not pass validation"); + setProgress(10); + return null; + } + + // Check if process is interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + + setStatus("Approving..."); + setProgress(30); + + // Send approve request to TESSy + log("Sending approve request"); + boolean approved = batch.approve(); + + // Get TESSy reply + String msg = batch.getLastMessage(); + log("Uploaded XML: "+msg); + log("TESSy response: "+batch.getLastResponse()); + + // If approval failed, exit with error + if (!approved) { + setStatus("Error, approval failed."); + log("Error, approval failed"); + setProgress(35); + gui.error("TESSy approval of batch "+batchId+" failed"); + return null; + } + + // Update GUI with TESSy approval date and save + log("Saving..."); + setStatus("Saving..."); + setProgress(95); + + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateStr = df.format(new Date()); + log("Updating GUI with active batch"); + gui.setBatch(name, batch); + log("Updating Isolate table"); + gui.setValidationResults(name, batch.getBatchId(),"A",null,dateStr,true); + log("Saving"); + gui.save(); + + // Exit + setStatus("Finished!"); + setProgress(100); + return null; + } +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcTessyCreateAndTestWorker.java b/src/eu/europa/ecdc/enauploader/EcdcTessyCreateAndTestWorker.java new file mode 100644 index 0000000..34666a0 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcTessyCreateAndTestWorker.java @@ -0,0 +1,208 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.util.ArrayList; +import java.util.HashMap; + +import javax.xml.bind.DatatypeConverter; + +// Class for creating a batch object and testing it in TESSy +public class EcdcTessyCreateAndTestWorker extends EcdcJob { + + // Mandatory constructor + EcdcTessyCreateAndTestWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + } + + // Main routine for job + @Override + protected Object doInBackground() { + + // Check if job is interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + log("Started"); + setStatus("Requesting new batchId..."); + setProgress(5); + + // Create a TESSy request for checking last batchId + // A little bit of a hack to use the TessyIsolate class like this, but it works nicely. + TessyIsolate iso = new TessyIsolate("","",""); + iso.setCredentials(batch.getCredentials()); + ArrayList content = new ArrayList(); + content.add(""); + log("XML submitted: "+content); + String response = iso.submitXml(content); + log("TESSy response: "+response); + if (response==null) { + setStatus("Error, failed to get next batchId"); + setProgress(10); + gui.error("Retrieving last used batch id from TESSy failed."); + log("No batchId returned."); + return null; + } + + // Check if job is interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + + setStatus("Parsing batchId..."); + setProgress(30); + + // Parse the batchId + // TODO: The entire batchId retrieval could be moved to a method and improved + String[] lines = response.split("\n",-1); + boolean foundId = false; + for (String l : lines) { + if (l.matches(".*.*")) { + String batchStr = l.replaceAll(".*","").replaceAll(".*",""); + log("Last used batchId: "+batchStr); + int batchnum = Integer.parseInt(batchStr); + batchnum++; + batchStr = Integer.toString(batchnum); + log("Next batchId: "+batchStr); + batch.setId(batchStr); + foundId = true; + } + } + + // If fail to get next batchId from TESSy, exit + if (!foundId) { + setStatus("Error, failed to get next batchId"); + setProgress(35); + gui.error("Retrieving last used batch id from TESSy failed."); + log("No batchId returned."); + return null; + } + + // Check if interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + + setStatus("Creating batch..."); + log("Creating batch..."); + setTitle("Testing batch "+batch.getBatchId()); + setProgress(35); + + // Put data table in arraylist + // TODO: Data table API between GUI and jobs should be improved + ArrayList rows = new ArrayList(); + for (int i = 0;i results = batch.test(); + + // If results are somehow null, give an error + if (results == null) { + setStatus("Error, failed to find validation results"); + setProgress(50); + log("Error, failed to find validation results (null response from batch.test())."); + return null; + } + + // Log the validation results + for (String k : results.keySet()) { + TessyValidationResult val = results.get(k); + log(val.toString()); + } + + + setStatus("Saving..."); + setProgress(90); + log("Setting current batch: "+name+": "+batch.getBatchId()+" ("+batch.getState()+")"); + + // Update the GUI with batch information + log("Updating isolate table with batch information"); + gui.setBatch(name, batch); + + // Update the GUI with validation results + log("Updating isolate table with validation results"); + gui.setValidationResults(name, batch.getBatchId(),"T",null,null,false); + + // Save + log("Saving results..."); + gui.save(); + + + // Exit + log("Finished!"); + setStatus("Finished!"); + setProgress(100); + + return null; + } +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcTessyRejectWorker.java b/src/eu/europa/ecdc/enauploader/EcdcTessyRejectWorker.java new file mode 100644 index 0000000..97e45b5 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcTessyRejectWorker.java @@ -0,0 +1,54 @@ +package eu.europa.ecdc.enauploader; + +// Class for sending reject requests to TESSy +public class EcdcTessyRejectWorker extends EcdcJob { + + // Mandatory constructor + EcdcTessyRejectWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + } + + // Main routine for the job + @Override + protected Object doInBackground() throws Exception { + String batchId = batch.getBatchId(); + + // Check if the process is interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + log("Rejecting batch "+batchId); + setTitle("Rejecting batch "+batchId); + setProgress(15); + + // Send reject request to TESSy + batch.reject(); + + // Get TESSy request and reply texts + String msg = batch.getLastMessage(); + log("Uploaded XML: "+msg); + log("TESSy response: "+batch.getLastResponse()); + + // Update GUI and save + log("Saving..."); + setStatus("Saving..."); + setProgress(95); + + log("Updating Isolate table"); + gui.setValidationResults(name, batch.getBatchId(),"R",null,null,true); + log("Updating GUI with active batch"); + gui.setBatch(name, batch); + + log("Saving"); + gui.save(); + + log("Finished."); + setStatus("Finished!"); + setProgress(100); + + return null; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcTessyUploadWorker.java b/src/eu/europa/ecdc/enauploader/EcdcTessyUploadWorker.java new file mode 100644 index 0000000..587ea91 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcTessyUploadWorker.java @@ -0,0 +1,154 @@ +package eu.europa.ecdc.enauploader; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.HashMap; + +// Class for uploading a created and tested TESSy batch +public class EcdcTessyUploadWorker extends EcdcJob { + + + // Mandatory constructor + EcdcTessyUploadWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + // Constants + private static final long WAITTIME = 5000; // Time to wait between tries, in ms + private static final int MAXTRIES = 100; // How many times to wait for validation before giving up + // Multiply these together to get the maximum total time before validation timeout + + // Main process for the job + @Override + protected Object doInBackground() { + + //Check if interrupted + if (isStopped()) { + log("Process cancelled"); + return null; + } + + log("Started"); + String batchId = batch.getBatchId(); + log("batchId "+batchId); + + setTitle("Uploading batch "+batchId); + setStatus("Uploading batch..."); + setProgress(5); + + // Check that batch has passed the test + if (!batch.passedValidation()) { + log("Batch did not pass test, it cannot be uploaded."); + setStatus("Error, batch did not pass test"); + setProgress(10); + return null; + } + + log("Uploading"); + + //Upload batch + boolean uploaded = batch.upload(); + + log("TESSy response: "+batch.getLastResponse()); + + // Check if upload was successful + if (!uploaded) { + setStatus("Error, upload failed."); + log("Error, upload failed."); + setProgress(10); + gui.error("TESSy upload of batch "+batchId+" failed"); + return null; + } + + // Update UI with information that the batch has been uploaded + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + String dateStr = df.format(new Date()); + log("Batch uploaded at "+ dateStr); + gui.setBatch(name, batch); + gui.setValidationResults(name, batch.getBatchId(),"U",dateStr,null,true); + + setStatus("Waiting for validation results..."); + log("Waiting for validation..."); + setProgress(30); + + // Wait for validation results + boolean done = false; + int tries = 0; + while (!done) { + + // If giving up, show error in GUI + if (tries > MAXTRIES) { + setStatus("Error, validation results timeout after "+Long.toString(MAXTRIES*WAITTIME/1000)+" seconds"); + setProgress(35); + gui.error("TESSy validation of batch "+batchId+" timed out after "+Long.toString(MAXTRIES*WAITTIME/1000)+" seconds."); + return null; + } + + // Check if validation is ready + tries++; + log("Validation check #"+Integer.toString(tries)); + done = batch.checkValidation(); + log("Results available: "+Boolean.toString(done)); + + // Just some funky code to move the progressbar back and forth while waiting + if (tries%2==0) { + setProgress(40); + } else { + setProgress(35); + } + + // Wait before next attempt to retrieve validations + try { + Thread.sleep(WAITTIME); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + log("Retrieving validation results."); + setStatus("Retrieving validation results"); + setProgress(65); + + // Retrieve validation results + HashMap results = batch.getValidation(); + String msg = batch.getLastMessage(); + log("Uploaded XML: "+msg); + + // Check if results are present, else show an error + if (results==null) { + log("Error, null results retrieved."); + setStatus("Error while retrieving validation results"); + setProgress(65); + gui.error("ERROR while retrieving validation results. You must retrieve validation results before proceeding."); + return null; + } + + // Log the validation results + for (String k : results.keySet()) { + TessyValidationResult val = results.get(k); + log(val.toString()); + } + + setStatus("Saving..."); + setProgress(95); + + // Update GUI with batch info and validation results + log("Updating active batch in GUI"); + gui.setBatch(name, batch); + log("Updating isolate table"); + gui.setValidationResults(name, batch.getBatchId(),"V",dateStr,null,true); + + // Save GUI + log("Saving..."); + gui.save(); + + // Exit + setStatus("Finished!"); + setProgress(100); + log("Finished."); + return null; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EcdcUploaderGUI.java b/src/eu/europa/ecdc/enauploader/EcdcUploaderGUI.java new file mode 100644 index 0000000..f532b04 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EcdcUploaderGUI.java @@ -0,0 +1,1909 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.BorderLayout; +import java.awt.Color; +import java.awt.Component; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.MouseListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Date; +import java.util.HashMap; +import java.util.List; + +import javax.imageio.ImageIO; +import javax.swing.DefaultCellEditor; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JMenu; +import javax.swing.JMenuBar; +import javax.swing.JMenuItem; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTable; +import javax.swing.KeyStroke; +import javax.swing.ListSelectionModel; +import javax.swing.RowSorter; +import javax.swing.SortOrder; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; +import javax.swing.event.TableModelEvent; +import javax.swing.event.TableModelListener; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; +import javax.swing.table.DefaultTableCellRenderer; +import javax.swing.table.DefaultTableModel; +import javax.swing.table.TableColumn; +import javax.swing.table.TableRowSorter; + +public class EcdcUploaderGUI extends JFrame implements ActionListener { + + private static final long serialVersionUID = 1268136970945881244L; + + // Column names for reserved columns in the isolate table + private static final String BASE_FILE_COLUMN = "File base name"; + private static final String ASSEMBLY_FILE_COLUMN = "Assembly file"; + private static final String READ_FILES_COLUMN = "Read files"; + private static final String MODIFIED_COLUMN = "Modified date"; + private static final String UPLOAD_COLUMN = "Ready for upload"; + private static final String UI_COLUMN = "ECDC event (UI)"; + private static final String TESSY_ID_COLUMN = "TESSy id"; + private static final String TESSY_BATCH_COLUMN = "TESSy batch"; + private static final String TESSY_TEST_COLUMN = "Selected for TESSy upload"; + private static final String TESSY_UPLOADED_COLUMN = "TESSy last uploaded"; + private static final String ENA_RUN_COLUMN = "ENA run id"; + private static final String TESSY_VALIDATION_COLUMN = "TESSy validation"; + private static final String TESSY_APPROVED_COLUMN = "TESSy last approved"; + private static final String SFTP_COLUMN = "ECDC SFTP uploaded"; + + private static final String VERSION = "1.0.3"; + + + + + private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + // Config directory = same as working directory, + private static final String CONFIG_DIR = "."; + + protected static final int EDITABLE_EXTRA_FIELDS = 5; + private static final int LOCKED_FIELDS = 8; + + // Is this class run using the main method? + private boolean isMain; + + // HashMap of isolate tables + private HashMap tableHash; + + // HashMap of upload configurations for each table and any number of import configurations + private HashMap configHash; + private HashMap importConfigHash; + + // HashMap of TESSy batches in progress and a HashMap with the TESSy SUBJECTs for those batches. + // TODO: Improve the handling of batches, old batches remain sometimes when the program is closed during upload. + private HashMap batches; + private HashMap batchSubjects; + + // Fields in addition to the metadata fields (reserved fields) + private ArrayList extraFields; + + // UI elements that need to be accessed as fields + private JTabbedPane tabs; + private JMenu importQuickMenu; + private JScrollPane scroller; + private JLabel totalEntriesLabel; + private JLabel selectedEntriesLabel; + + // Import scheduler for automated submissions, and job handler for submission jobs + private ImportScheduler scheduler; + private EcdcJobHandler jobHandler; + + private ImportConfigGUI importDialogWindow; + + private UploadConfigGUI uploadDialogWindow; + + + + + public EcdcUploaderGUI(boolean isMain) { + this.isMain = isMain; + } + + public static void main(String[] args) { + + // Set System L&F + try { + UIManager.setLookAndFeel( + UIManager.getSystemLookAndFeelClassName()); + } catch (ClassNotFoundException | InstantiationException | IllegalAccessException + | UnsupportedLookAndFeelException e) { + e.printStackTrace(); + } + + // Create UI, with the isMain flag set to true + EcdcUploaderGUI gui = new EcdcUploaderGUI(true); + + // Init UI + gui.init(); + + } + + private void init() { + + // Initialize variables + batches = new HashMap(); + batchSubjects = new HashMap(); + + importConfigHash = new HashMap(); + + + + // Add all the global reserved fields to the extraFields list + extraFields = new ArrayList(); + extraFields.add(MODIFIED_COLUMN); + extraFields.add(UPLOAD_COLUMN); + extraFields.add(UI_COLUMN); + extraFields.add(BASE_FILE_COLUMN); + extraFields.add(READ_FILES_COLUMN); + extraFields.add(ASSEMBLY_FILE_COLUMN); + extraFields.add(TESSY_TEST_COLUMN ); + extraFields.add(TESSY_BATCH_COLUMN ); + extraFields.add(TESSY_VALIDATION_COLUMN); + extraFields.add(TESSY_UPLOADED_COLUMN); + extraFields.add(TESSY_APPROVED_COLUMN); + extraFields.add(TESSY_ID_COLUMN); + extraFields.add(ENA_RUN_COLUMN); + extraFields.add(SFTP_COLUMN); + + + // Init UI elements + totalEntriesLabel = new JLabel(""); + selectedEntriesLabel = new JLabel(""); + JPanel mainPanel = new JPanel(new BorderLayout()); + JMenuBar menuBar = new JMenuBar(); + JMenu fileMenu = new JMenu("Data"); + JMenu configMenu = new JMenu("Setup"); + JMenu uploadMenu = new JMenu("Submission"); + JMenu viewMenu = new JMenu("View"); + menuBar.add(fileMenu); + menuBar.add(configMenu); + menuBar.add(uploadMenu); + menuBar.add(viewMenu); + + JMenuItem addrowItem = new JMenuItem("Add row"); + addrowItem.addActionListener(this); + addrowItem.setActionCommand("addrow"); + KeyStroke ctrlAKeyStroke = KeyStroke.getKeyStroke("control ENTER"); + addrowItem.setAccelerator(ctrlAKeyStroke); + fileMenu.add(addrowItem); + + JMenuItem addrowsItem = new JMenuItem("Add several rows"); + addrowsItem.addActionListener(this); + addrowsItem.setActionCommand("addrows"); + KeyStroke ctrlAAKeyStroke = KeyStroke.getKeyStroke("control alt ENTER"); + addrowsItem.setAccelerator(ctrlAAKeyStroke); + fileMenu.add(addrowsItem); + + JMenuItem removerowsItem = new JMenuItem("Delete selected rows"); + removerowsItem.addActionListener(this); + removerowsItem.setActionCommand("removerows"); + fileMenu.add(removerowsItem); + + JMenuItem saveItem = new JMenuItem("Save data"); + saveItem.addActionListener(this); + saveItem.setActionCommand("save"); + KeyStroke ctrlSKeyStroke = KeyStroke.getKeyStroke("control S"); + saveItem.setAccelerator(ctrlSKeyStroke); + fileMenu.add(saveItem); + + JMenuItem loadItem = new JMenuItem("Revert to saved"); + loadItem.addActionListener(this); + loadItem.setActionCommand("revert"); + KeyStroke ctrlLKeyStroke = KeyStroke.getKeyStroke("control L"); + loadItem.setAccelerator(ctrlLKeyStroke); + fileMenu.add(loadItem); + + fileMenu.addSeparator(); + + importQuickMenu = new JMenu("Import using template"); + fileMenu.add(importQuickMenu); + + loadImportAndScheduleConfigs(importQuickMenu); + + JMenuItem importMenuItem = new JMenuItem("Manage imports and scheduling..."); + importMenuItem.addActionListener(this); + importMenuItem.setActionCommand("importDialog"); + configMenu.add(importMenuItem); + + JMenuItem configItem = new JMenuItem("Configure upload parameters..."); + configItem.addActionListener(this); + configItem.setActionCommand("config"); + configMenu.add(configItem); + + JMenuItem linkItem = new JMenuItem("Link sequence files for selected isolates"); + linkItem.addActionListener(this); + linkItem.setActionCommand("link"); + uploadMenu.add(linkItem); + + uploadMenu.addSeparator(); + + JMenuItem allUploadItem = new JMenuItem("Submit data to configured systems"); + allUploadItem.addActionListener(this); + allUploadItem.setActionCommand("uploadSelected"); + uploadMenu.add(allUploadItem); + + uploadMenu.addSeparator(); + + JMenuItem enaUploadSelectedItem = new JMenuItem("ENA - Submit all selected isolates"); + enaUploadSelectedItem.addActionListener(this); + enaUploadSelectedItem.setActionCommand("uploadEnaSelected"); + uploadMenu.add(enaUploadSelectedItem); + + uploadMenu.addSeparator(); + + JMenuItem testSelectedItem = new JMenuItem("TESSy - Create batch from selected and test"); + testSelectedItem.addActionListener(this); + testSelectedItem.setActionCommand("testSelected"); + uploadMenu.add(testSelectedItem); + + JMenuItem uploadAllItem = new JMenuItem("TESSy - Upload batch..."); + uploadAllItem.addActionListener(this); + uploadAllItem.setActionCommand("uploadBatch"); + uploadMenu.add(uploadAllItem); + + JMenuItem approveAllItem = new JMenuItem("TESSy - Approve batch..."); + approveAllItem.addActionListener(this); + approveAllItem.setActionCommand("approveBatch"); + uploadMenu.add(approveAllItem); + + JMenuItem rejectItem = new JMenuItem("TESSy - Reject batch..."); + rejectItem.addActionListener(this); + rejectItem.setActionCommand("rejectBatch"); + uploadMenu.add(rejectItem); + + uploadMenu.addSeparator(); + uploadMenu.addSeparator(); + + JMenuItem sftpUploadItem = new JMenuItem("SFTP - Upload sequences (requires TESSy records)"); + sftpUploadItem.addActionListener(this); + sftpUploadItem.setActionCommand("uploadFtpSelected"); + uploadMenu.add(sftpUploadItem); + + JMenuItem viewJobsItem = new JMenuItem("Show job manager window"); + viewJobsItem.addActionListener(this); + viewJobsItem.setActionCommand("viewJobs"); + viewMenu.add(viewJobsItem); + + this.setJMenuBar(menuBar); + + // Set program Icon and title + setTitle("ECDC WGS upload app v"+VERSION); + try { + String imagePath = "media/ECDC2.png"; + InputStream imgStream = UploadConfigGUI.class.getResourceAsStream(imagePath ); + BufferedImage myImg; + myImg = ImageIO.read(imgStream); + setIconImage(myImg); + } catch (Exception e) { + e.printStackTrace(); + } + + + // load isolate table contents from files + loadData(); + + // load configs from files + loadUploadConfigs(); + + JPanel titlePanel = new JPanel(); + JLabel titleLabel = new JLabel("Isolate table"); + + + + updateEntriesLabels(); + + + titlePanel.add(titleLabel); + JLabel totalText = new JLabel(" Total entries: "); + titlePanel.add(totalText); + titlePanel.add(totalEntriesLabel); + JLabel selectedText = new JLabel(" Selected: "); + titlePanel.add(selectedText); + titlePanel.add(selectedEntriesLabel); + mainPanel.add(titlePanel,BorderLayout.NORTH); + + mainPanel.add(tabs,BorderLayout.CENTER); + this.add(mainPanel); + + // If this is the main class, close program on window close. + // (This class could be instantiated from elsewhere, then it should not exit on close) + if (isMain) { + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + + + // Init the job handler + jobHandler = new EcdcJobHandler(); + + // Init the automated job scheduler + scheduler = new ImportScheduler(this); + scheduler.execute(); + + // Send the config information to the scheduler which can import and upload at regular intervals if so configured + int scheduleNumber = scheduler.setImportConfigHash(importConfigHash); + + // Notify the user of scheduled submissions. + if (scheduleNumber>0) { + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + JOptionPane.showMessageDialog(null, + "Automatic import and submission has been configured for "+Integer.toString(scheduleNumber)+" different import configuration(s). This will automatically submit data to configured systems. Go to the 'Manage imports and scheduling...' wizard if you wish to change this.
Note that scheduled import and submission only works if you keep the ECDC WGS Upload app open."); + } + + }); + + } + + // Set UI size and make it visible + this.setSize(1024,800); + this.setExtendedState(JFrame.MAXIMIZED_BOTH); + this.setVisible(true); + } + + private void updateEntriesLabels() { + String name= tabs.getTitleAt(tabs.getSelectedIndex()); + JTable table = tableHash.get(name); + totalEntriesLabel.setText(Integer.toString(table.getRowCount())); + selectedEntriesLabel.setText(Integer.toString(table.getSelectedRowCount())); + + } + + private void loadUploadConfigs() { + + // Init empty HashMap for configs + configHash = new HashMap(); + + // Iterate through all the tabs and look for a config associated with the SUBJECT + int totalTabs = tabs.getTabCount(); + for(int i = 0; i < totalTabs; i++) + { + String name= tabs.getTitleAt(i); + File configFile = new File(name+".cfg"); + + // If config does not exist, it must be created before any upload can be performed, warn the user + if (!configFile.exists()) { + JOptionPane.showMessageDialog(null, + "No config found for "+name+", you must create a config called \'"+name+".cfg\' before you can submit any data for "+name+".\nConfigs are created from the \'Setup\' menu"); + continue; + } + + //Load config from file and add it to HashMap + try { + UploadConfig cfg = UploadConfigHandler.loadConfig(configFile); + configHash.put(name, cfg); + } catch (Exception e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(this, + "Loading config "+name+".cfg failed."); + continue; + } + + + } + } + + + private void loadData() { + + // Init the actual TabbedPane and a HashMap for associating SUBJECT and tab + tabs = new JTabbedPane(); + tableHash = new HashMap(); + + tabs.addChangeListener(new ChangeListener() { + @Override + public void stateChanged(ChangeEvent arg0) { + updateEntriesLabels(); + + } + }); + + + // List all files in config directory and iterate through them + File dir = new File(CONFIG_DIR); + File[] files = dir.listFiles(); + for (File f : files) { + + // If a batch file is found, load batches from it + if (f.getName().endsWith(".batch")) { + String name = f.getName().substring(0,f.getName().length()-6); + loadBatchFiles(name); + } + + // If this is a metadata file (supplied by ECDC), create a tab including an isolate table + if (f.getName().endsWith(".meta")) { + String[] headers; + String[][] data; + + // Name of tab derived from metadata file name + String name = f.getName().substring(0,f.getName().length()-5); + + // Initialize controlled vocabularies use for some fields (coded value lists) + HashMap controlledVocabularies = new HashMap(); + + BufferedReader br; + ArrayList fields = new ArrayList(); + try { + // Open file + br = new BufferedReader(new FileReader(f)); + String line; + + // Each row contains a fieldname, and potentially a comma-separated coded value list after = + while ((line=br.readLine())!=null) { + fields.add(line); + } + // Add the global reserved fields to the list of fields + for (String s : extraFields) { + if (fields.indexOf(s)==-1) { + fields.add(s); + } + } + + // Create a table header with size equal to the number of fields + headers = new String[fields.size()]; + + // For every field that contains '=', split it and use the comma-separated values after the = as a controlled vocabulary + for (int i=0;ithis.getColumnCount()-extraFields.size()+EDITABLE_EXTRA_FIELDS) { + return false; + } else { + return true; + } + } + }; + + // Create the isolate table + JTable table = new JTable(model){ + + private static final long serialVersionUID = -7197366759070120859L; + + + // Set the tooltip text so that mouse-over shows the contents. For content containing ';', split over several rows + public String getToolTipText(MouseEvent e) { + String tip = ""; + java.awt.Point p = e.getPoint(); + int rowIndex = rowAtPoint(p); + int colIndex = columnAtPoint(p); + + + try { + String[] tips = getValueAt(rowIndex, colIndex).toString().split(";"); + for (String t : tips) { + tip = tip+t+"
"; + } + } catch (RuntimeException e1) { + // Do nothing on error (it is hard to envision what could go wrong here anyway) + } + if (tip.equals("")) { + return null; + } + tip = ""+tip+""; + return tip; + } + }; + + + + + // When new rows are added, scroll to bottom of table. Must be done using invokeLater, as the table is not updated visually + // on the same thread as the TableModel modification + table.getModel().addTableModelListener(new TableModelListener() { + @Override + public void tableChanged(TableModelEvent e) { + if (e.getType()==TableModelEvent.DELETE) { + System.out.println("DELETE"); + return; + } + SwingUtilities.invokeLater(new Runnable() { + @Override + public void run() { + if (e.getType()==TableModelEvent.INSERT) { + table.scrollRectToVisible(table.getCellRect(table.getRowCount()-1, 0, true)); + updateEntriesLabels(); + } + int col = e.getColumn(); + int dateCol=getColumn(table,MODIFIED_COLUMN); + if (col=table.getColumnCount()-extraFields.size()+1+EDITABLE_EXTRA_FIELDS) { + + if (isSelected) { + c.setBackground(new Color(155, 155, 155)); + } else { + + c.setBackground(new Color(175, 235, 235)); + + } + } else if (column>=table.getColumnCount()-extraFields.size()+3) { + if (isSelected) { + c.setBackground(new Color(155, 155, 155)); + } else { + c.setBackground(new Color(235, 175, 235)); + } + } else if (column>=table.getColumnCount()-extraFields.size()) { + if (isSelected) { + c.setBackground(new Color(155, 155, 155)); + } else { + c.setBackground(new Color(225, 225, 225)); + } + } else { + if (isSelected) { + c.setBackground(new Color(175, 175, 175)); + } else { + c.setBackground(Color.white); + } + } + + return c; + } + }); + + + // Encapsulate table in a JScrollPane to allow scrolling + TableColumn column = null; + for (int i = 0; i < table.getColumnCount(); i++) { + column = table.getColumnModel().getColumn(i); + if (i == 0) { + column.setPreferredWidth(160); + } else { + column.setPreferredWidth(100); + } + } + + TableRowSorter sorter = new TableRowSorter(table.getModel()); + table.setRowSorter(sorter); + + // Add MouseListener for onClick event + table.getTableHeader().addMouseListener(new MouseAdapter() { + private SortOrder currentOrder = SortOrder.UNSORTED; + + @Override + public void mouseClicked(MouseEvent e) { + int column = table.getTableHeader().columnAtPoint(e.getPoint()); + RowSorter sorter = table.getRowSorter(); + List sortKeys = new ArrayList(); + switch (currentOrder) { + case UNSORTED: + sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.ASCENDING)); + break; + case ASCENDING: + sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.DESCENDING)); + break; + case DESCENDING: + sortKeys.add(new RowSorter.SortKey(column, currentOrder = SortOrder.UNSORTED)); + break; + } + sorter.setSortKeys(sortKeys); + } + }); + + table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF); + + scroller = new JScrollPane(table); + + JPanel tablePanel = new JPanel(new BorderLayout()); + + + tablePanel.add(scroller,BorderLayout.CENTER); + + // Add table to HashMap, and add tab to JTabbedPane + tableHash.put(name, table); + tabs.add(name, tablePanel); + } + } + } + + // Load the TESSY batch files + // TODO: This whole functionality is a bit messy, + // if the program is closed during TESSy operations, this can go out of synch with the actual batch state in TESSy + @SuppressWarnings("unchecked") + private void loadBatchFiles(String name) { + File indataFile = new File(name+".batch"); + + if (indataFile.exists()) { + FileInputStream streamIn; + HashMap indata; + try { + streamIn = new FileInputStream(indataFile); + ObjectInputStream objectInputstream = new ObjectInputStream(streamIn); + indata = (HashMap) objectInputstream.readObject(); + objectInputstream.close(); + } catch (ClassNotFoundException | IOException e) { + e.printStackTrace(); + indata = new HashMap(); + } + + // Add loaded batches and batch subjects to corresponding HashMaps + for (String k : indata.keySet()) { + TessyBatch bat = indata.get(k); + batches.put(bat.getBatchId(),bat); + batchSubjects.put(bat.getBatchId(), name); + } + } + + } + + // Load the isolate table + // Data is stored as key->value in a serialized ArrayList of HashMaps + // This is not very efficient but allows for updates of the metadata on the fly + @SuppressWarnings("unchecked") + private String[][] load(String name, String[] headers) { + + File indataFile = new File(CONFIG_DIR+"/"+name+".dat"); + ArrayList> indata; + if (indataFile.exists()) { + FileInputStream streamIn; + try { + streamIn = new FileInputStream(indataFile); + ObjectInputStream objectInputstream = new ObjectInputStream(streamIn); + indata = (ArrayList>) objectInputstream.readObject(); + objectInputstream.close(); + } catch (ClassNotFoundException | IOException e) { + e.printStackTrace(); + indata = new ArrayList>(); + } + } else { + indata = new ArrayList>(); + } + String[][] data = new String[indata.size()][headers.length]; + int i = 0; + for (HashMap row : indata) { + int j = 0; + for (String field : headers) { + if (row.containsKey(field)) { + data[i][j] = row.get(field); + } + j++; + } + i++; + } + return data; + } + + + // Load data import templates and add them to the quick import Menu + public void loadImportAndScheduleConfigs(JMenu menu) { + + File dir = new File(CONFIG_DIR); + File[] files = dir.listFiles(); + + // Init empty HashMap of import configs + importConfigHash = new HashMap(); + FILES: for (File f : files) { + + if (f.getName().endsWith(".import")) { + // Derive the config name from the file name + String name = f.getName().substring(0,f.getName().length()-7); + try { + // Load the config and put it into a HashMap + ImportConfig cfg = ImportConfigHandler.loadConfig(f); + importConfigHash.put(name, cfg); + } catch (ClassNotFoundException | IOException e) { + JOptionPane.showMessageDialog(this, + "Config "+name+" could not be loaded from file: "+f.toString()+", the file may be corrupt or locked for reading."); + e.printStackTrace(); + } + + // Check if a corresponding item already exists in the Menu + for (int i = 0; i< menu.getItemCount();i++) { + if (menu.getItem(i) != null && menu.getItem(i).getText().equals(name)){ + continue FILES; + } + } + + // if it does not exists, add it to menu + JMenuItem csvImportItem = new JMenuItem(name); + csvImportItem.addActionListener(this); + csvImportItem.setActionCommand("IMPORT_"+name); + importQuickMenu.add(csvImportItem); + } + } + if (importConfigHash!=null && scheduler!=null) { + scheduler.setImportConfigHash(importConfigHash); + } + + } + + // Event handler + @Override + public void actionPerformed(ActionEvent e) { + + // The importDialog opens an ImportConfigGUI and then loads the importConfigs when it is closed + + if (e.getActionCommand().equals("importDialog")) { + if (importDialogWindow!=null) { + importDialogWindow.toFront(); + return; + } + ImportConfigGUI importGui = new ImportConfigGUI(false); + importGui.setLocationRelativeTo(null); + importGui.init(); + importDialogWindow = importGui; + importGui.addWindowListener(new WindowAdapter() { + @Override + // When the ImportConfigGUI window is closed, reload importConfigs + public void windowClosing(WindowEvent e) { + SwingUtilities.invokeLater(new Runnable(){ + + @Override + public void run() { + importDialogWindow = null; + loadImportAndScheduleConfigs(importQuickMenu); + } + }); + } + }); + + // The config dialog opens a UploadConfigGUI and then loads the upload configs when the window is closed. + } else if (e.getActionCommand().equals("config")) { + + if (uploadDialogWindow!=null) { + uploadDialogWindow.toFront(); + return; + } + + UploadConfigGUI uploadConfigGui = new UploadConfigGUI(false); + uploadConfigGui.setLocationRelativeTo(null); + uploadConfigGui.init(); + uploadDialogWindow = uploadConfigGui; + + uploadConfigGui.addWindowListener(new WindowAdapter() { + @Override + // When the config window is closed, reload upload configs + public void windowClosing(WindowEvent e) { + SwingUtilities.invokeLater(new Runnable(){ + + @Override + public void run() { + uploadDialogWindow = null; + loadUploadConfigs(); + } + }); + } + }); + + // Open job manager + } else if (e.getActionCommand().equals("viewJobs")) { + jobHandler.setVisible(true); + jobHandler.toFront(); + + // Save isolate table, note that it is also autosaved on many operations + } else if (e.getActionCommand().equals("save")) { + save(); + + // revert isolate table to saved version + } else if (e.getActionCommand().equals("revert")) { + revert(); + + // Add row to active isolate table + } else if (e.getActionCommand().equals("addrow")) { + addSingleRow(); + + // Add several rows to active isolate table + } else if (e.getActionCommand().equals("addrows")) { + addRowsInteractive(); + + // Link sequence data for selected rows + } else if (e.getActionCommand().equals("removerows")) { + String name= tabs.getTitleAt(tabs.getSelectedIndex()); + JTable table = tableHash.get(name); + int num = table.getSelectedRowCount(); + int reply = JOptionPane.showConfirmDialog(null, "This will delete "+Integer.toString(num)+" entries from the "+name+" table. Are you sure?", "Delete rows?", JOptionPane.YES_NO_OPTION); + if (reply == JOptionPane.YES_OPTION) { + removeRows(); + } + + + // Link sequence data for selected rows + } else if (e.getActionCommand().equals("link")) { + EcdcLinkWorker worker = getEcdcLinkWorker(null, null); + worker.execute(); + + // Upload selected rows to ECDC SFTP, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("uploadFtpSelected")) { + EcdcSftpUploadWorker worker = getSftpWorker(null, null); + if (worker!=null) { + worker.execute(); + } + + // Upload selected rows to configured systems, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("uploadSelected")) { + EcdcFullUploadWorker worker = getFullUploadWorker(null, null); + if (worker!=null) { + worker.execute(); + } + + // Upload selected rows to ENA, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("uploadEnaSelected")) { + EnaSubmissionWorker worker = getEnaSubmissionWorker(null, null); + if (worker!=null) { + worker.execute(); + } + + // Test selected rows at TESSy, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("testSelected")) { + EcdcTessyCreateAndTestWorker worker = getEcdcTessyTestWorker(null, null); + if (worker!=null) { + worker.execute(); + } + + // Upload batch to TESSy, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("uploadBatch")) { + EcdcTessyUploadWorker worker = getEcdcTessyUploadWorker(null); + if (worker!=null) { + worker.execute(); + } + + // Approve batch in TESSy, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("approveBatch")) { + EcdcTessyApprovalWorker worker = getEcdcTessyApprovalWorker(null); + if (worker!=null) { + worker.execute(); + } + + // Reject batch in TESSy, uses EcdcJob base class to perform in background. + } else if (e.getActionCommand().equals("rejectBatch")) { + EcdcTessyRejectWorker worker = getEcdcTessyRejectWorker(null); + if (worker!=null) { + worker.execute(); + } + + // Quick import triggered from the Menu + } else if (e.getActionCommand().startsWith("IMPORT_")) { + String cfgName = e.getActionCommand().substring(7); + + EcdcImportWorker worker = getEcdcImportWorker(cfgName); + if (worker!=null) { + worker.execute(); + } + } + } + + + private void removeRows() { + String name= tabs.getTitleAt(tabs.getSelectedIndex()); + JTable table = tableHash.get(name); + DefaultTableModel model = (DefaultTableModel)table.getModel(); + int[] inds = table.getSelectedRows(); + Integer[] indices = new Integer[inds.length]; + int ii = 0; + for (int value : inds) { + indices[ii++] = Integer.valueOf(value); + } + Arrays.sort(indices, Collections.reverseOrder()); + for(int i = 0; i < indices.length; i++) + { + indices[i] = table.convertRowIndexToModel(indices[i]); + model.removeRow(indices[i]); + } + } + + // This functions adds a single row to the active isolate table + private void addSingleRow() { + String name= tabs.getTitleAt(tabs.getSelectedIndex()); + JTable table = tableHash.get(name); + DefaultTableModel model = (DefaultTableModel)table.getModel(); + model.addRow(new String[table.getColumnCount()]); + } + + // This functions queries the user for the number of rows and then adds them to the active isolate table + private void addRowsInteractive() { + String s = (String)JOptionPane.showInputDialog( + this, + "Choose number of rows to add", + "Add rows", + JOptionPane.PLAIN_MESSAGE + ); + + if (s==null) { + return; + } + int num; + try { + num = Integer.parseInt(s); + } catch (Exception e2) { + e2.printStackTrace(); + return; + } + String name= tabs.getTitleAt(tabs.getSelectedIndex()); + JTable table = tableHash.get(name); + DefaultTableModel model = (DefaultTableModel)table.getModel(); + for (int i = 0;i box = new JComboBox(); + for (String id : batches.keySet()) { + TessyBatch bat = batches.get(id); + if (bat.getState().matches(batchState)) { + box.addItem(id+" ("+bat.getState()+")"); + } + } + box.setSelectedIndex(box.getItemCount()-1); + int res = JOptionPane.showConfirmDialog( null, box, "Select batch", JOptionPane.OK_CANCEL_OPTION); + String choice = (String)box.getSelectedItem(); + if (res != JOptionPane.OK_OPTION || choice==null) { + return null; + } + return(choice.split(" ")[0]); + } + + + // This function is interactive if the argument is null, otherwise it will use the supplied batchId + // It creates an EcdcJob for rejecting a batch in TESSy + public EcdcTessyRejectWorker getEcdcTessyRejectWorker(String batchId) { + + // Interactive dialog for selecting batch to reject + if (batchId==null) { + batchId = getBatchIdInteractive("VALIDATED"); + if (batchId==null) { + return null; + } + } + + + // Get batch + TessyBatch batch = batches.get(batchId); + if (batch==null) { + JOptionPane.showMessageDialog(this, "No such batch "+batchId+" found!"); + return null; + } + String batchSubject = batchSubjects.get(batchId); + + // Create and return job, note that it is not executed automatically + EcdcTessyRejectWorker worker = new EcdcTessyRejectWorker(this, batch, batchSubject, null, null, null); + return worker; + } + + + + // This function is interactive if the argument is null, otherwise it will use the supplied batchId + // It creates an EcdcJob for approving a batch in TESSy + public EcdcTessyApprovalWorker getEcdcTessyApprovalWorker(String batchId) { + + // Interactive dialog for selecting batch to reject + if (batchId==null) { + batchId = getBatchIdInteractive("VALIDATED"); + if (batchId==null) { + return null; + } + } + + // Get batch + TessyBatch batch = batches.get(batchId); + if (batch==null) { + JOptionPane.showMessageDialog(this, "No such batch "+batchId+" found!"); + return null; + } + String batchSubject = batchSubjects.get(batchId); + + // Create and return job, note that it is not executed automatically + EcdcTessyApprovalWorker worker = new EcdcTessyApprovalWorker(this,batch,batchSubject,null,null,null); + return worker; + } + + // This function is interactive if the argument is null, otherwise it will use the supplied batchId + // It creates an EcdcJob for uploading a batch to TESSy + public EcdcTessyUploadWorker getEcdcTessyUploadWorker(String batchId) { + + // Interactive dialog for selecting batch to reject + if (batchId==null) { + batchId = getBatchIdInteractive("TESTED"); + if (batchId==null) { + return null; + } + } + + // Get batch + TessyBatch batch = batches.get(batchId); + if (batch==null) { + JOptionPane.showMessageDialog(this, "No such batch "+batchId+" found!"); + return null; + } + String batchSubject = batchSubjects.get(batchId); + + // Create and return job, note that it is not executed automatically + EcdcTessyUploadWorker worker = new EcdcTessyUploadWorker(this,batch,batchSubject,null,null,null); + return worker; + } + + + // This function uses the current table selection if the arguments are null, otherwise it will use the supplied table and rows + // It creates an EcdcJob for generating a batch object and testing it in TESSy + // This is a requirement before upload in this application + public EcdcTessyCreateAndTestWorker getEcdcTessyTestWorker(String tabname, int[] selected) { + if (tabname==null) { + // If not supplied, use active tab + tabname = tabs.getTitleAt(tabs.getSelectedIndex()); + } + JTable table = tableHash.get(tabname); + + // If not supplied, use the selected rows. + boolean interactive=false; + if (selected==null) { + interactive = true; + selected = getUploadRows(table,true); + } + + + ArrayList rows = new ArrayList(); + + int tessyBatchColumn = getColumn(table,TESSY_BATCH_COLUMN); + if (tessyBatchColumn==-1) { + return null; + } + + // Check which isolates that have been submitted to TESSy before and separate them into different lists + // depending on whether they are approved or not. Resubmitting isolates that are already in progress in TESSy will not work. + ArrayList rowsOld = new ArrayList(); + ArrayList rowsInProgress = new ArrayList(); + for (int i : selected) { + if(table.getModel().getValueAt(i,0)==null || table.getModel().getValueAt(i,0).equals("")) { + continue; + } + if (table.getModel().getValueAt(i,tessyBatchColumn)==null || table.getModel().getValueAt(i,tessyBatchColumn).equals("") || ((String)table.getModel().getValueAt(i,tessyBatchColumn)).endsWith("T") || ((String)table.getModel().getValueAt(i,tessyBatchColumn)).endsWith("R")) { + rows.add(i); + } else if (((String)table.getModel().getValueAt(i,tessyBatchColumn)).endsWith("A")) { + rowsOld.add(i); + } else { + rowsInProgress.add(i); + } + } + + + if (interactive) { + + // For interactive submission, give the user an error that the selection + // includes isolates that have been uploaded but not approved nor rejected. + if (!rowsInProgress.isEmpty()) { + JOptionPane.showMessageDialog(this, + "Selection includes isolates that are parts of batches that have been uploaded but not approves, these cannot be included. Try again."); + return null; + } + + // If the selection includes isolates that have been approved before, warn the user that they will be replaced. + if (!rowsOld.isEmpty()) { + int reply = JOptionPane.showConfirmDialog(null, "Some isolates have already been approved in TESSy, include them anyway?", "Resubmit isolates?", JOptionPane.YES_NO_OPTION); + if (reply == JOptionPane.YES_OPTION) { + rows.addAll(rowsOld); + } + } + } else { + // For non-interactive session, quietly resubmit old approved or rejected isolates but never include those in the uploaded state. + rows.addAll(rowsOld); + } + + // If no isolates are included, warn if interactive and then return. + if (rows.isEmpty()) { + if (interactive) { + JOptionPane.showMessageDialog(this, "No isolates selected for submission."); + } + return null; + } + + // Set TESSy credentials and options for the batch + UploadConfig cfg = configHash.get(tabname); + TessyCredentials cred = cfg.getTessyCredentials(); + TessyBatch batch = new TessyBatch("",cfg.getTessyCountry(),cfg.getTessyContact(), cfg.getTessyProvider(), cfg.getTessyMeta(), cfg.getTessySubject()); + batch.setTessyCredentials(cred); + batch.setHaltWarn(cfg.getTessyHaltWarn()); + batch.setHaltRemark(cfg.getTessyHaltRemark()); + + // TODO: This is a bit of a hack. Basically the code creates a table with headers, the first four columns are fixed, + // RecordId, DateUsedForStatistics, EnaId, Assembly file. The rest are any supplied fields in the data table. + // The code can be improved + int extrafields = 4; + + String[] headers = new String[table.getColumnCount()-extraFields.size()+extrafields]; + String[][] data = new String[rows.size()][table.getColumnCount()-extraFields.size()+extrafields]; + + int enaColumn = getColumn(table,ENA_RUN_COLUMN); + int assemblyColumn = getColumn(table,ASSEMBLY_FILE_COLUMN); + + headers[0] = "id"; + headers[1] = "DateUsedForStatistics"; + headers[2] = "WgsEnaId"; + headers[3] = "WgsAssembly"; + for (int j = extrafields ;j uploadList = new ArrayList(); + ArrayList nonUploadList = new ArrayList(); + int uploadColumn = getColumn(table,UPLOAD_COLUMN); + for (int i : inds) { + int modelInd = table.convertRowIndexToModel(i); + String uploadVal = (String)table.getModel().getValueAt(modelInd, uploadColumn); + if (uploadVal!=null && uploadVal.equals("Yes")) { + uploadList.add(modelInd); + } else { + nonUploadList.add(modelInd); + } + } + if (interactive && nonUploadList.size()>0) { + int reply = JOptionPane.showConfirmDialog(null, "The selection includes "+Integer.toString(nonUploadList.size())+" isolates not flagged as 'Ready for upload', change the flag and upload?", "Submit?", JOptionPane.YES_NO_OPTION); + if (reply == JOptionPane.YES_OPTION) { + for (int i : nonUploadList) { + table.getModel().setValueAt("Yes",i, uploadColumn); + } + uploadList.addAll(nonUploadList); + } + } + + + int[] out = new int[uploadList.size()]; + for (int i = 0;i rows = new ArrayList(); + + // If not supplied, use selected rows + if (selectedRows==null) { + selectedRows = getUploadRows(dataTable, true); + } + + // Check that the selected rows have a recordId and raw read files, and that they do not already have an ENA run id. + for (int i : selectedRows) { + if (dataTable.getModel().getValueAt(i, recordIdCol)!=null && !dataTable.getModel().getValueAt(i, recordIdCol).equals("") && dataTable.getModel().getValueAt(i, filesCol)!=null && !dataTable.getModel().getValueAt(i, filesCol).equals("") && (dataTable.getModel().getValueAt(i, enaColumn)==null || dataTable.getModel().getValueAt(i, enaColumn).equals(""))) { + rows.add(i); + } + } + + // return if nothing to do + if (rows.isEmpty()) { + JOptionPane.showMessageDialog(this, + "No valid entries selected for submission to ENA."); + return null; + } + + + // Create a table with the required data for ENA submission + String[] headers = {"id","RecordId","Year","Files","WgsProtocol"}; + String[][] data = new String[rows.size()][headers.length]; + int c = 0; + for (int i : rows) { + + // Get year from supplied dates, if no date is supplied, skip. + String year = EcdcUtils.calcDate(dataTable,i,"yyyy"); + if (year.equals("")) { + JOptionPane.showMessageDialog(this, + "No date found for one or more entries, ENA submission halted."); + return null; + } + + data[c][0]=Integer.toString(i); + data[c][1]=(String)dataTable.getModel().getValueAt(i, recordIdCol); + data[c][2]=year; + data[c][3]=(String)dataTable.getModel().getValueAt(i, filesCol); + data[c][4]=(String)dataTable.getModel().getValueAt(i, wgsProtocolCol); + c++; + } + + + // Create and return, an EcdcJob for submitting to ENA. It does not automatically run. + EnaSubmissionWorker worker = new EnaSubmissionWorker(this,null,tabname,configHash.get(tabname),headers,data); + + // Set table column for worker to output ENA accession in + worker.setEnaColumn(enaColumn); + worker.setOutputHandler(new JTableOutputHandler(dataTable)); + return worker; + } + + + // This function uses the current table selection if the arguments are null, otherwise it will use the supplied table and rows + // It creates an EcdcJob for uploading to all configured systems + public EcdcFullUploadWorker getFullUploadWorker(String tabname, int[] selected) { + + // Use selected table if argument is not supplied + if (tabname==null) { + tabname = tabs.getTitleAt(tabs.getSelectedIndex()); + } + JTable table = tableHash.get(tabname); + + // use selected rows if not supplied + if (selected==null) { + selected = getUploadRows(table, true); + } + + // Create and return an EcdcJob for submitting to all configured systems. I still needs to be executed + EcdcFullUploadWorker worker = new EcdcFullUploadWorker(this,null,tabname, configHash.get(tabname),null,null); + worker.setRows(selected); + return worker; + } + + // This function uses the current table selection if the arguments are null, otherwise it will use the supplied table and rows + // It creates an EcdcJob for uploading to SFTP + public EcdcSftpUploadWorker getSftpWorker(String tabname, int[] selected) { + + // Use selected table if argument is not supplied + if (tabname==null) { + tabname = tabs.getTitleAt(tabs.getSelectedIndex()); + } + JTable table = tableHash.get(tabname); + + // use selected rows if not supplied + if (selected==null) { + selected = getUploadRows(table, true); + } + + // Create a data table with information needed for SFTP upload + int n = selected.length; + String[] headers = new String[6]; + String[][] data = new String[n][6]; + + int recordIdCol = 0; + int filesCol = getColumn(table, READ_FILES_COLUMN); + int assemblyCol = getColumn(table, ASSEMBLY_FILE_COLUMN); + int tessyIdCol = getColumn(table, TESSY_ID_COLUMN); + int protocolCol = getColumn(table, "WgsProtocol"); + int uiCol = getColumn(table, UI_COLUMN); + int ftpCol = getColumn(table, SFTP_COLUMN); + + + int count = 0; + for (int i : selected) { + data[count][0] = Integer.toString(i); + data[count][1] = (String)table.getModel().getValueAt(i, recordIdCol); + data[count][2] = (String)table.getModel().getValueAt(i, filesCol); + + String assemblyFiles = (String)table.getModel().getValueAt(i, assemblyCol); + if (assemblyFiles!=null && !assemblyFiles.equals("")) { + if (data[count][2]==null) { + data[count][2] = ""; + } + if (!data[count][2].equals("")) { + data[count][2] = data[count][2]+";"; + } + data[count][2] = data[count][2] + assemblyFiles; + } + data[count][3] = (String)table.getModel().getValueAt(i, tessyIdCol); + data[count][4] = (String)table.getModel().getValueAt(i, protocolCol); + data[count][5] = (String)table.getModel().getValueAt(i, uiCol); + + count++; + } + + if (count==0) { + JOptionPane.showMessageDialog(this, + "No valid entries selected for submission using SFTP."); + return null; + } + + // Create and return a worker for SFTP upload. It still needs to be executed + EcdcSftpUploadWorker worker = new EcdcSftpUploadWorker(this,null,tabname,configHash.get(tabname),headers,data); + + // Set output handling for this worker + worker.setFtpColumn(ftpCol); + worker.setOutputHandler(new JTableOutputHandler(table)); + + return worker; + } + + + // Save isolate table and batch data + void save() { + + // Iterate over all tabs + int totalTabs = tabs.getTabCount(); + for(int i = 0; i < totalTabs; i++) + { + ArrayList> data = new ArrayList>(); + String name= tabs.getTitleAt(i); + System.out.println(name); + File outFile = new File(name+".dat"); + File outFileBatch = new File(name+".batch"); + + // Get the batches associated with this subject + // TODO: This can be done more efficiently + HashMap saveBatches = new HashMap(); + for (String k : batches.keySet()) { + if (batchSubjects.get(k).equals(name)) { + TessyBatch bat = batches.get(k); + if (!bat.getState().equals("APPROVED")) { + saveBatches.put(k,bat); + } + } + } + + // Iterate through the data table, add all non-empty rows to the List for saving + JTable table = tableHash.get(name); + int rows = table.getRowCount(); + int cols = table.getColumnCount(); + for (int j = 0; j< rows; j++) { + HashMap row=null; + boolean save = false; + + for (int k = 0; k< cols; k++) { + String val = (String)table.getModel().getValueAt(j, k); + if (val!=null) { + if (!save) { + save = true; + row = new HashMap(); + } + row.put((String)table.getColumnName(k), (String)table.getModel().getValueAt(j, k)); + } + } + if (save) { + data.add(row); + } + } + + // Write table data to file + FileOutputStream foutData; + try { + foutData = new FileOutputStream(outFile); + ObjectOutputStream oos = new ObjectOutputStream(foutData); + oos.writeObject(data); + oos.close(); + } catch (IOException e1) { + JOptionPane.showMessageDialog(this, + "Save failed."); + e1.printStackTrace(); + } + + // Write batch data to file + FileOutputStream foutBatch; + try { + foutBatch = new FileOutputStream(outFileBatch); + ObjectOutputStream oosB = new ObjectOutputStream(foutBatch); + oosB.writeObject(saveBatches); + oosB.close(); + } catch (IOException e1) { + JOptionPane.showMessageDialog(this, + "Saving TESSy batch data failed."); + e1.printStackTrace(); + } + + } + + } + + + // This function uses the current table selection if the arguments are null, otherwise it will use the supplied table and rows + // it links sequence read files and assembly files using the RecordId and the UploadConfig file pattern + public EcdcLinkWorker getEcdcLinkWorker(String name, int[] selected) { + + // Get the selected table if not supplied + if (name==null) { + name= tabs.getTitleAt(tabs.getSelectedIndex()); + } + + JTable table = tableHash.get(name); + + // A config is required, + if (!configHash.containsKey(name)) { + JOptionPane.showMessageDialog(this, "No upload configuration found for subject "+name+", cannot link data."); + return null; + } + UploadConfig cfg = configHash.get(name); + + + EcdcLinkWorker linkWorker = new EcdcLinkWorker(this, null, name, cfg, null, null); + linkWorker.setColumnNames(BASE_FILE_COLUMN, READ_FILES_COLUMN, ASSEMBLY_FILE_COLUMN); + linkWorker.setTable(table); + linkWorker.setSelected(selected); + return linkWorker; + + } + + + // This functions handles the TESSy validation results output, puts them into the isolate table. + public void setValidationResults(String name, String batchId, String suffix, String dateStr, String appDateStr, boolean setId) { + + HashMap results = batches.get(batchId).getValidationResults(); + + batchId = batchId+suffix; + + JTable table = tableHash.get(name); + + // Init column indices + int tessyValColumn = getColumn(table,TESSY_VALIDATION_COLUMN); + int tessyTestColumn = getColumn(table,TESSY_TEST_COLUMN); + int tessyBatchColumn = getColumn(table,TESSY_BATCH_COLUMN); + int tessyUploadColumn = getColumn(table,TESSY_UPLOADED_COLUMN); + int tessyApproveColumn = getColumn(table,TESSY_APPROVED_COLUMN); + int tessyIdColumn = getColumn(table,TESSY_ID_COLUMN); + + // TESSy validation column required + if (tessyValColumn==-1) { + return; + } + + + // Clear all old non-uploaded batches, only one test batch can be active at any time + for (String k : tableHash.keySet()) { + JTable t = tableHash.get(k); + for (int i = 0; i generateBox(String[] options) + { + JComboBox bx=null; + bx=new JComboBox(); + bx.addItem(""); + for (String option: options) { + bx.addItem(option); + } + bx.setEditable(false); + + return bx; + + } + + // Get the column index for a certain table and column name, returns -1 if not found + int getColumn(JTable table, String colname) { + for (int i = 0;i getUploadList(JTable table, UploadConfig cfg) { + + + ArrayList inds = new ArrayList(); + int uploadColumn = getColumn(table,UPLOAD_COLUMN); + int readsColumn = getColumn(table,READ_FILES_COLUMN); + int assemblyColumn = getColumn(table,ASSEMBLY_FILE_COLUMN); + int modifiedColumn = getColumn(table,MODIFIED_COLUMN); + int tessyApprovedColumn = getColumn(table,TESSY_APPROVED_COLUMN); + int sftpColumn = getColumn(table,SFTP_COLUMN); + int enaColumn = getColumn(table,ENA_RUN_COLUMN); + + for (int i = 0;i searchDev(File file, ArrayList foundFiles) throws IOException { + System.out.println("Reading directory: "+file.getName()); + + /*FileFilter filter = new FileFilter() { + @Override public boolean accept(File f) + { + String name = f.getName(); + return (name.endsWith(".fastq.gz") || name.endsWith(".fastq") || name.endsWith(".fasta") || name.endsWith(".fasta.gz") || f.isDirectory()); + } + };*/ + + + System.out.println("Reading files"); + //File[] files = file.listFiles(filter); + // System.out.println("Iterating over "+Integer.toString(files.length)+" files"); + + DirectoryStream.Filter filter = new DirectoryStream.Filter() { + @Override + public boolean accept(Path entry) throws IOException { + String name = entry.getFileName().toString(); + return (name.endsWith(".fastq.gz") || name.endsWith(".fastq") || name.endsWith(".fasta") || name.endsWith(".fasta.gz") || Files.isDirectory(entry)); + + } + }; + + Path dir = file.toPath(); + DirectoryStream stream = Files.newDirectoryStream( dir , filter); + for (Path path : stream) { + File f = path.toFile(); + if (f.isDirectory()) { + foundFiles = searchDev(f,foundFiles); + } else { + foundFiles.add(f); + } + } + stream.close(); + + return foundFiles; + } + + // This utility function recursively searches a file system for sequence files + public static ArrayList search(File file, ArrayList foundFiles) throws IOException { + System.out.println("Reading directory: "+file.getName()); + + FileFilter filter = new FileFilter() { + @Override public boolean accept(File f) + { + String name = f.getName(); + return (name.endsWith(".fastq.gz") || name.endsWith(".fastq") || name.endsWith(".fasta") || name.endsWith(".fasta.gz") || f.isDirectory()); + } + }; + + + System.out.println("Reading files"); + File[] files = file.listFiles(filter); + System.out.println("Iterating over "+Integer.toString(files.length)+" files"); + + + + for (File f : files) { + if (f.isDirectory()) { + foundFiles = search(f,foundFiles); + } else { + foundFiles.add(f); + } + } + + return foundFiles; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/EnaSubmissionWorker.java b/src/eu/europa/ecdc/enauploader/EnaSubmissionWorker.java new file mode 100644 index 0000000..2fd680e --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/EnaSubmissionWorker.java @@ -0,0 +1,291 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.UUID; + +// This class submits sequence data and minimal metadata (year, country, sequencing instrument) to ENA +public class EnaSubmissionWorker extends EcdcJob { + + private static final int EXPECTED_FIELDS = 5; + private int enaColumn; + private OutputHandler outputHandler; + + // Mandatory constructor + EnaSubmissionWorker(EcdcUploaderGUI gui, TessyBatch batch, String name, UploadConfig cfg, String[] headers, + String[][] data) { + super(gui, batch, name, cfg, headers, data); + + } + + // Set output handler object + public void setOutputHandler(OutputHandler handler) { + this.outputHandler = handler; + } + + // Set table column for output to GUI + public void setEnaColumn(int col) { + enaColumn = col; + } + + + // Main routine for the job + @Override + protected Object doInBackground() { + + // Get all config info + String studyAcc = cfg.getEnaProjectAcc(); + String center = cfg.getEnaCenter(); + String checklist = cfg.getEnaChecklist(); + String login = cfg.getEnaLogin(); + String organism = cfg.getOrganism(); + char[] password = cfg.getEnaPassword(); + boolean anonymize = cfg.getEnaAnonymize(); + boolean prod = cfg.getEnaProd(); + System.out.println("PROD: "+Boolean.toString(prod)); + + String ftpHost = cfg.getEnaFtpHost(); + String curlPath = cfg.getCurlPath(); + String tmpPath = cfg.getTmpPath(); + + // Log parameters used + log("ENA parameters"); + log("Study: "+studyAcc); + log("Center: "+center); + log("Checklist: "+checklist); + log("Login: "+login); + log("Organism: "+organism); + log("Anonymize: "+anonymize); + log("ENA prodcution: "+prod); + log("FTP: "+ftpHost); + log("CURL: "+curlPath); + log("TMP: "+tmpPath); + + log("Starting..."); + setTitle("Uploading to ENA study "+studyAcc); + setStatus("Checking configs..."); + setProgress(5); + + // Check that all required config fields are there + if (password.length==0 || studyAcc.equals("") || organism.equals("") || center.equals("") || login.equals("") || checklist.equals("")) { + log("Organism, Study accession, Center, Login, Password, and Checklist are mandatory fields for ENA submission."); + log("Aborting ENA submission."); + + setStatus("Error, missing fields in config"); + log("Config is missing information, aborting."); + setProgress(10); + return null; + } + + // Check that there is data to submit + if (data == null || data.length==0) { + log("There are no data to submit."); + log("Aborting ENA submission."); + + setStatus("Error, no data selected for submission"); + log("No data, aborting."); + setProgress(10); + return null; + } + + // Check that data has the correct format + if (headers.length!=EXPECTED_FIELDS || data[0].length!=EXPECTED_FIELDS) { + log("Unexpected number of columns in data or headers. Expected number: "+Integer.toString(EXPECTED_FIELDS)); + log("Aborting ENA submission."); + + setStatus("Error, data formatting not recongnized"); + log("Data formatting error"); + setProgress(10); + return null; + } + + int failed = 0; + int success = 0; + int increment = 75/data.length; + int total = data.length; + + if (total==0) { + setStatus("Error, no valid entries selected"); + setProgress(20); + return null; + } + + // Iterate over each isolate entry + ISOLATE: for (int i = 0;i= jTable1.getRowCount()) { + ((DefaultTableModel)jTable1.getModel()).addRow(new String[jTable1.getColumnCount()]); + } + rowstring=st1[i]; + if (rowstring.equals("")) { + break; + } + //StringTokenizer st2=new StringTokenizer(rowstring,"\t"); + String[] st2=rowstring.split("\t",-1); + + for(int j=0;jGENOMIC\n"); bw.write("RANDOM\n"); bw.write("\n"); - if (instrument.toLowerCase().matches(".*illumina.*")) { + if (instrument.toLowerCase().matches(".*illumina.*") || instrument.toLowerCase().matches(".*nextseq.*")) { bw.write("\n"); } else { bw.write("\n"); diff --git a/src/eu/europa/ecdc/enauploader/GhostEntryCreator.java b/src/eu/europa/ecdc/enauploader/GhostEntryCreator.java new file mode 100644 index 0000000..cd3953b --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/GhostEntryCreator.java @@ -0,0 +1,624 @@ +package eu.europa.ecdc.enauploader; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.DataOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.URL; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Base64; +import java.util.Date; +import java.util.HashMap; +import java.util.UUID; + +import javax.swing.JComboBox; +import javax.swing.JFrame; +import javax.swing.JPanel; + + +// This is a utility class for creating Ghost entries in a Bionumerics database +public class GhostEntryCreator extends JFrame { + + + + + private static HashMap usedIds; + + public static void main(String[] args) { + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + + /* if (args.length<5) { + System.out.println("Usage: createghostentry "); + System.exit(0); + } + + String insubj = args[0].toUpperCase(); + String environ = args[1].toUpperCase(); + String username = args[2]; + String password = args[3]; + String infile = args[4]; + */ + + String insubj = "LISTISO"; + String environ = "PROD"; + String username = "ealm"; + + + ArrayList BNfields = new ArrayList(); + BNfields.add("BN_ANN1"); + BNfields.add("BN_ANN2"); + BNfields.add("BN_ANN3"); + BNfields.add("BN_WGS_ECDCID"); + String sourceDb = "jdbc:sqlite:Z:/BioNumerics/Data/ELITE_WGS/ELITE_WGS.sqlite"; + String transferlist = "C:/Users/ealm/Desktop/transfer3.csv"; + String targetDb; + String targetTable; + String password; + + if (environ.equals("PROD")) { + targetDb = "jdbc:sqlserver://nsql3:1433;DatabaseName=Molsurv;integratedSecurity=true"; + targetTable = "vSRC_"+insubj+"_ENTRYTABLE"; + password = "hbj024"; + } else { + targetDb = "jdbc:sqlserver://zdevsql16.idmdevdmz.local:1433;DatabaseName=BNAS_TEST_"+insubj; + targetTable = "ENTRYTABLE"; + password = "Solna123"; + } + + + + + + + String infile = "C:/Users/ealm/Desktop/testghost.txt"; + + try { + dumpDbToFile(sourceDb, infile); + } catch (SQLException | IOException e1) { + + e1.printStackTrace(); + System.exit(0); + } + + + ArrayList isolates = new ArrayList(); + try { + BufferedReader br = new BufferedReader(new FileReader(transferlist)); + String line; + while ((line=br.readLine())!=null) { + if (line.split(",")[1].toUpperCase().equals("Y")) { + isolates.add(line.split(",")[0]); + } + + } + br.close(); + + } catch (IOException e) { + e.printStackTrace(); + } + + + + + try { + boolean success = upload(insubj, environ, username, password, infile, BNfields, isolates, targetDb, targetTable); + if (success) { + System.out.println("Submission successful."); + } else { + System.out.println("Submission failed."); + } + } catch (Exception e) { + + e.printStackTrace(); + } + + } + + private static void dumpDbToFile(String sourceDb, String infile) throws SQLException, IOException { + + BufferedWriter bw = new BufferedWriter(new FileWriter(infile)); + + Connection conn2 = DriverManager.getConnection(sourceDb); + Statement m_Statement2 = conn2.createStatement(); + System.out.println("Connection to SQLite has been established."); + String query2 = "SELECT * FROM entrytable"; + + + ResultSet rs2 = m_Statement2.executeQuery(query2); + for (int i = 1; i < rs2.getMetaData().getColumnCount() + 1; i++) { + String val = rs2.getMetaData().getColumnName(i); + val = val.replaceAll("\t",""); + if (i>1) { + bw.write("\t"); + } + bw.write(val); + } + + while (rs2.next()) { + bw.write("\n"); + for (int i = 1; i < rs2.getMetaData().getColumnCount() + 1; i++) { + String val = rs2.getString(i); + if (val==null) { + val = ""; + } + val = val.replaceAll("\t",""); + if (i>1) { + bw.write("\t"); + } + bw.write(val); + } + + } + bw.close(); + conn2.close(); + } + + private static boolean upload(String subj, String environ, String login, String password, String infile, ArrayList BNfields, ArrayList isolates, String targetDb, String targetTable) throws Exception { + + + String baseUrl; + + if (environ.equals("TEST")) { + baseUrl = "http://zdevbion16.idmdevdmz.local/bnwebservice/"; + } else if (environ.equals("PROD")) { + baseUrl = "http://zbionsts.ecdcdmz.europa.eu/bnwebservice/"; + } else { + System.out.println("Only TEST or PROD are allowed for the second argument"); + return false; + } + + File xmlFile = new File("C:/Users/ealm/test3.txt"); + + + int numrecords = writeXml(xmlFile,new File(infile),subj, BNfields, isolates, targetDb, targetTable); + if (numrecords == 0) { + return false; + } + //System.exit(0); + + + System.out.print("Number of records read from list: "); + System.out.println(isolates.size()); + System.out.print("Number of records loaded into xml: "); + System.out.println(numrecords); + //System.exit(0); + //TODO: + + URL url = new URL(baseUrl+"logon.aspx?userid="+login+"&pwd="+password+"&db=BNAS_"+environ+"_"+subj); + final long startTime = System.nanoTime(); + + HttpURLConnection con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + + int status = con.getResponseCode(); + BufferedReader in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + String inputLine; + StringBuffer content = new StringBuffer(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + con.disconnect(); + System.out.println(status); + System.out.println(content); + + String sessionId = ""; + if (content.toString().startsWith("OK")) { + sessionId = content.toString().substring(3); + } else { + return false; + } + System.out.println(sessionId); + final long interTime = System.nanoTime(); + + //Code here + //runscript.aspx?session=" + SessionId + "&name=" + scriptName + "&arg=" + UrlCodecHelper.Encode(arg); + + String scriptName = "UploadToBnServer.py"; + String arg = ""; + String base64Xml = ""; + String xml = ""; + + + BufferedReader br = new BufferedReader(new FileReader(xmlFile)); + String l; + while ((l=br.readLine())!=null) { + xml = xml+ l; + } + br.close(); + base64Xml = Base64.getEncoder().encodeToString(xml.getBytes()); + + + url = new URL(baseUrl+"runscript.aspx?session="+sessionId+"&name="+scriptName+"&arg="+arg); + + + con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("POST"); + + con.setDoOutput(true); + DataOutputStream wr = new DataOutputStream(con.getOutputStream()); + wr.writeBytes(base64Xml); + wr.flush(); + wr.close(); + + status = con.getResponseCode(); + in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + + content = new StringBuffer(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + con.disconnect(); + System.out.println(status); + System.out.println(content); + boolean success = true; + if (!content.toString().startsWith("OK")) { + success = false; + } + + final long interTime2 = System.nanoTime(); + + + url = new URL(baseUrl+"logoff.aspx?session="+sessionId); + con = (HttpURLConnection) url.openConnection(); + con.setRequestMethod("GET"); + + status = con.getResponseCode(); + in = new BufferedReader( + new InputStreamReader(con.getInputStream())); + + content = new StringBuffer(); + while ((inputLine = in.readLine()) != null) { + content.append(inputLine); + } + in.close(); + con.disconnect(); + System.out.println(status); + System.out.println(content); + if (!success) { + return false; + } + final long duration1 = interTime - startTime; + final long duration2 = interTime2 - interTime; + final long duration3 = System.nanoTime() - interTime2; + final long duration = System.nanoTime() - startTime; + + System.out.print("N="); + System.out.println(numrecords); + System.out.print("CONNECT: "); + System.out.println(duration1/1000000); + System.out.print("SUBMIT: "); + System.out.println(duration2/1000000); + System.out.print("DELETE: "); + System.out.println(duration3/1000000); + System.out.println(""); + System.out.print("TOTAL: "); + System.out.println(duration/1000000); + + for (String k : usedIds.keySet()) { + Connection conn; + if (targetDb.matches(".*nsql3.*")) { + conn = DriverManager.getConnection(targetDb); + } else { + conn = DriverManager.getConnection(targetDb,"sa","Solna123"); + } + + Statement m_Statement = conn.createStatement(); + + + String query = "SELECT [key] FROM "+targetTable+ " WHERE[key]='"+k+"'"; + + boolean inTessy = false; + ResultSet rs = m_Statement.executeQuery(query); + while (rs.next()) { + inTessy=true; + } + if (!inTessy) { + System.out.println("Submission of "+k+" failed."); + } + conn.close(); + } + + return true; + } + + private static int writeXml(File xmlFile, File infile, String subj, ArrayList BNfields, ArrayList isolates, String targetDb, String targetTable) { + int numrecords = 0; + try { + Connection conn; + if (targetDb.matches(".*nsql3.*")) { + conn = DriverManager.getConnection(targetDb); + } else { + conn = DriverManager.getConnection(targetDb,"sa","Solna123"); + } + + + + BufferedReader br = new BufferedReader(new FileReader(infile)); + ArrayList lines = new ArrayList(); + HashMap indices = new HashMap(); + String line = br.readLine(); + String[] headFields = line.split("\t",-1); + + if (headFields.length<2) { + System.out.println("Infile must be tab delimited"); + br.close(); + return 0; + } + for (int i = 0; i< headFields.length;i++) { + indices.put(headFields[i],i); + } + + + + + while ((line = br.readLine())!=null) { + lines.add(line); + } + + br.close(); + + + + BufferedWriter bw = new BufferedWriter(new FileWriter(xmlFile)); + PrintWriter pw = new PrintWriter(bw); + + pw.println(""); + pw.println("
"); + pw.println(""); + pw.println("ECDC"); + pw.println(""); + pw.println(""); + pw.println(""); + pw.println(""); + pw.println(""); + pw.println("
"); + pw.println(""); + pw.println(""); + pw.println(""+subj+""); + pw.println(""); + pw.println(""+subj+""); + pw.println("UPDATE"); + pw.println(""); + pw.println(""); + pw.println(""); + + System.out.print("Lines read: "); + System.out.println(lines.size()); + + usedIds = new HashMap(); + + for (String l : lines) { + + String[] fields = l.split("\t",-1); + + if (isolates!=null && isolates.indexOf(fields[0])==-1) { + //System.out.println("Skipping "+guid); + continue; + } + String guid = fields[0].toUpperCase(); + String oldGuid = guid; + if (!guid.startsWith("SEQ-")) { + guid = "SEQ-"+UUID.randomUUID().toString().toUpperCase(); + } + + //System.out.println(oldGuid); + + String id = fields[indices.get("PB_RECORDID")]; + if (id.equals("")) { + + System.out.println("Entry "+oldGuid+ " is missing a RecordId"); + continue; + } + String country = fields[indices.get("PB_REPORTINGCOUNTRY")]; + if (country.equals("")) { + + System.out.println("Entry "+oldGuid+ "("+id+") is missing a ReportingCountry"); + country = "UNK"; + } + + Statement m_Statement = conn.createStatement(); + + + String query = "SELECT [key] FROM "+targetTable+ " WHERE (PB_RECORDID='"+id+"' AND PB_REPORTINGCOUNTRY='"+country+"') OR [key]='"+oldGuid+"'"; + + boolean inTessy = false; + ResultSet rs = m_Statement.executeQuery(query); + while (rs.next()) { + String key = rs.getString(1); + guid = key; + //System.out.println(oldGuid+ " already exists in target database, using key: "+key); + inTessy = true; + } + + String dateSampling = fields[indices.get("PB_DATEOFSAMPLING")]; + String dateReflab = fields[indices.get("PB_DATEOFRECEIPTREFERENCELAB")]; + String date = fields[indices.get("PB_DATEUSEDFORSTATISTICS")]; + + if (usedIds.containsKey(guid)) { + System.out.println(guid + " is duplicate! "+country+", "+id+", "+oldGuid); + + continue; + } else { + usedIds.put(guid,1); + + } + + if (date.equals("")) { + if (!dateSampling.equals("")) { + date = dateSampling; + } else if (!dateReflab.equals("")) { + date = dateReflab; + } else { + String dateOrig = fields[indices.get("BN_ANN3")]; + if (dateOrig==null) { + dateOrig = ""; + } + if (dateOrig.matches("[0-9][0-9][0-9][0-9][-][0-9][0-9]-[0-9][0-9]")) { + date = dateOrig; + } else if (dateOrig.matches("[0-9][0-9][0-9][0-9][-][0-9][0-9]")) { + date = dateOrig+"-15"; + } else if (dateOrig.matches("[0-9][0-9][0-9][0-9]")) { + date = dateOrig+"-07-01"; + } else { + System.out.println("Entry "+oldGuid+"("+id+", "+country+") is missing Date and Ann3"); + //continue; + date = "UNK"; + } + + } + fields[indices.get("PB_DATEUSEDFORSTATISTICS")] = date; + } + + + String enaId = ""; + if (enaId.equals("") && !fields[indices.get("BN_WGS_ENAID")].equals("")) { + enaId = fields[indices.get("BN_WGS_ENAID")]; + } + if (enaId.equals("") && !fields[indices.get("BN_WGS_SRAID")].equals("")) { + enaId = fields[indices.get("BN_WGS_SRAID")]; + } + + + + + pw.println(""); + pw.println(""+id+""); + pw.println(""+country+""); + pw.println("NEW/UPDATE"); + pw.println(""+date+""); + pw.println(""+guid+""); + + for (int i = 1;i=fields.length) { + pw.close(); + bw.close(); + System.out.println("Entry "+guid+ " has too few columns"); + return 0; + } + if (!headFields[i].startsWith("PB_") && !headFields[i].startsWith("BN_")) { + continue; + } + if (fields[i].equals("")) { + continue; + } + if (!enaId.equals("")) { + pw.println(""); + pw.println("WGSENAID"); + pw.println(""+enaId+""); + pw.println(""); + } + if (headFields[i].toUpperCase().equals("BN_ANN3")) { + pw.println(""); + pw.println("DATEOFRECEIPTREFERENCELABORIG"); + pw.println(""+fields[i]+""); + pw.println(""); + } else if (headFields[i].startsWith("PB_") && !inTessy) { + pw.println(""); + pw.println(""+headFields[i].substring(3)+""); + pw.println(""+fields[i]+""); + pw.println(""); + } else if (BNfields.indexOf(headFields[i].toUpperCase())!=-1) { + pw.println(""); + pw.println(""+headFields[i]+""); + pw.println(""+fields[i]+""); + pw.println(""); + } + + } + + pw.println(""); + numrecords++; + if (numrecords>90) { + //break; + } + } + + + + /* + for (int i = 0; i"); + pw.println(""+id+""); + pw.println("SE"); + pw.println("NEW/UPDATE"); + pw.println("2013-07-01"); + pw.println(""+guid+""); + pw.println(""); + pw.println("Age"); + pw.println("53"); + pw.println(""); + pw.println(""); + pw.println("Gender"); + pw.println("M"); + pw.println(""); + pw.println(""); + pw.println("DateOfSampling"); + pw.println("2013-07-01"); + pw.println(""); + pw.println(""); + pw.println("DateOfReceiptReferenceLab"); + pw.println("2013-07-15"); + pw.println(""); + pw.println(""); + pw.println("WgsProtocol"); + pw.println("MISEQ_2X150"); + pw.println(""); + pw.println(""); + pw.println("WgsEnaId"); + pw.println("ERR1276254"); + pw.println(""); + + + + pw.println(""); + + + } + */ + + pw.println(""); + pw.println(""); + pw.println(""); + pw.println("
"); + + + + pw.close(); + bw.close(); + conn.close(); + } catch (IOException | SQLException e) { + + e.printStackTrace(); + } + return numrecords; + } + + + + +} diff --git a/src/eu/europa/ecdc/enauploader/ImportConfig.java b/src/eu/europa/ecdc/enauploader/ImportConfig.java new file mode 100644 index 0000000..cd9e593 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ImportConfig.java @@ -0,0 +1,190 @@ +package eu.europa.ecdc.enauploader; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +// Class for holding the configuration for Data Import and scheduling +// It contains fields and getters+setters for them +public class ImportConfig implements Serializable { + + private static final long serialVersionUID = -7632508112626524840L; + public static final int IMPORT_SQL = 0; + public static final int IMPORT_SQLITE = 1; + public static final int IMPORT_EXCEL = 2; + public static final int IMPORT_CSV = 3; + + public static final int AUTH_NONE = 0; + public static final int AUTH_PASSWORD = 1; + + public static final int SOURCE_STATIC = 0; + public static final int SOURCE_FLEXIBLE = 1; + + public static final int SCHEDULE_NONE = 0; + public static final int SCHEDULE_MINUTE = 1; + public static final int SCHEDULE_HOUR = 2; + public static final int SCHEDULE_DAY = 3; + + private int importType=0; + private int authType=0; + private int dataSourceFlexible=0; + private String databaseServer=""; + private String database=""; + private String datafile=""; + private String datatable=""; + private String sqlQuery=""; + private LinkedHashMap map; + private LinkedHashMap constants; + private LinkedHashMap> valueMap; + private String username=""; + private char[] password=new char[0]; + private String subject=""; + private ArrayList datasourceHeaders; + + private int scheduleUnit=0; + private int scheduleAmount=0; + + ImportConfig() { + setMap(new LinkedHashMap()); + setConstants(new LinkedHashMap()); + setValueMap(new LinkedHashMap>()); + } + + public int getImportType() { + return importType; + } + + public void setImportType(int importType) { + this.importType = importType; + } + + public int getAuthType() { + return authType; + } + + public void setAuthType(int authType) { + this.authType = authType; + } + + public int getDataSourceFlexible() { + return dataSourceFlexible; + } + + public void setDataSourceFlexible(int dataSourceFlexible) { + this.dataSourceFlexible = dataSourceFlexible; + } + + public String getSqlQuery() { + return sqlQuery; + } + + public void setSqlQuery(String sqlQuery) { + this.sqlQuery = sqlQuery; + } + + public LinkedHashMap getConstants() { + return constants; + } + + public void setConstants(LinkedHashMap map) { + this.constants = map; + } + + public LinkedHashMap getMap() { + return map; + } + + public void setMap(LinkedHashMap map) { + this.map = map; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public char[] getPassword() { + return password; + } + + public void setPassword(char[] cs) { + this.password = cs; + } + + public String getSubject() { + return subject; + } + + public void setSubject(String subject) { + this.subject = subject; + } + + public String getDatabase() { + return database; + } + + public void setDatabase(String database) { + this.database = database; + } + + public String getDatafile() { + return datafile; + } + + public void setDatafile(String datafile) { + this.datafile = datafile; + } + + public String getDatatable() { + return datatable; + } + + public void setDatatable(String datatable) { + this.datatable = datatable; + } + + public String getDatabaseServer() { + return databaseServer; + } + + public void setDatabaseServer(String databaseServer) { + this.databaseServer = databaseServer; + } + + public LinkedHashMap> getValueMap() { + return valueMap; + } + + public void setValueMap(LinkedHashMap> valueMap) { + this.valueMap = valueMap; + } + + public int getScheduleUnit() { + return scheduleUnit; + } + + public void setScheduleUnit(int scheduleUnit) { + this.scheduleUnit = scheduleUnit; + } + + public int getScheduleAmount() { + return scheduleAmount; + } + + public void setScheduleAmount(int scheduleAmount) { + this.scheduleAmount = scheduleAmount; + } + + public ArrayList getDatasourceHeaders() { + return datasourceHeaders; + } + + public void setDataSourceHeaders(ArrayList headers) { + datasourceHeaders = headers; + } + + +} diff --git a/src/eu/europa/ecdc/enauploader/ImportConfigGUI.java b/src/eu/europa/ecdc/enauploader/ImportConfigGUI.java new file mode 100644 index 0000000..a40c081 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ImportConfigGUI.java @@ -0,0 +1,937 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; + +import javax.imageio.ImageIO; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JScrollPane; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; +import javax.swing.filechooser.FileFilter; +import javax.swing.filechooser.FileNameExtensionFilter; + +// This class creates a GUI for configuring Data import and scheduling +public class ImportConfigGUI extends JFrame implements ActionListener { + + private static final long serialVersionUID = -7815244026662021007L; + private HashMap configs; + private JButton newButton; + private JButton renameButton; + private JButton saveButton; + private JButton revertButton; + private JButton deleteButton; + private JTextArea descriptionArea; + private JComboBox confignameField; + private String oldSelection; + private boolean isMain; + private JComboBox configTypeBox; + private JComboBox authTypeBox; + private JComboBox flexibleSourceBox; + private JTextField infileField; + private JTextField indatabaseField; + private JTextField intableField; + private JTextField queryField; + private JTextField usernameField; + private JPasswordField passwordField; + private JComboBox subjectBox; + + LinkedHashMap mapPanelHashMap; + private JPanel mapPanel; + private JTabbedPane tabs; + private JTextField databaseServerField; + private JComboBox scheduleBox; + private JTextField scheduleField; + + private static final String UPLOAD_COLUMN = "Ready for upload"; + private static final String BASE_FILE_COLUMN = "File base name"; + private static final String ASSEMBLY_FILE_COLUMN = "Assembly file"; + private static final String READ_FILES_COLUMN = "Read files"; + + // This can be run as main class, in that case the program will exit on GUI close + ImportConfigGUI(boolean isMain) { + this.isMain = isMain; + } + + public void init() { + + // Find all configs and read them + readConfigs(); + + + // Init UI elements + try { + String imagePath = "media/ECDC2.png"; + InputStream imgStream = ImportConfigGUI.class.getResourceAsStream(imagePath ); + BufferedImage myImg; + myImg = ImageIO.read(imgStream); + setIconImage(myImg); + } catch (Exception e) { + e.printStackTrace(); + } + + + setTitle("ECDC WGS Uploader - Data import configuration"); + this.setResizable(false); + JPanel mainPanel = new JPanel(new BorderLayout()); + JPanel buttonPanel = new JPanel(); + JPanel topPanel = new JPanel(new BorderLayout()); + + newButton = new JButton("New"); + newButton.addActionListener(this); + newButton.setActionCommand("new"); + renameButton = new JButton("Rename"); + renameButton.addActionListener(this); + renameButton.setActionCommand("rename"); + saveButton = new JButton("Save"); + saveButton.addActionListener(this); + saveButton.setActionCommand("save"); + + revertButton = new JButton("Revert changes"); + revertButton.addActionListener(this); + revertButton.setActionCommand("revert"); + deleteButton = new JButton("Delete"); + deleteButton.addActionListener(this); + deleteButton.setActionCommand("delete"); + + buttonPanel.add(newButton); + buttonPanel.add(renameButton); + buttonPanel.add(saveButton); + + buttonPanel.add(revertButton); + buttonPanel.add(deleteButton); + + JLabel descriptionLabel = new JLabel("Description:"); + descriptionArea = new JTextArea(); + descriptionArea.setPreferredSize(new Dimension(360, 80)); + JPanel descriptionPanel = new JPanel(); + descriptionPanel.add(descriptionLabel); + descriptionPanel.add(descriptionArea); + buttonPanel.add(descriptionPanel); + + + JLabel confignameLabel = new JLabel("Configuration"); + confignameField = new JComboBox(); + for (String k : configs.keySet()) { + confignameField.addItem(k); + } + confignameField.addActionListener(this); + confignameField.setActionCommand("selection"); + + confignameField.setPreferredSize(new Dimension(240,20)); + JPanel confignamePanel = new JPanel (); + confignamePanel.add(confignameLabel); + confignamePanel.add(confignameField); + + + topPanel.add(buttonPanel,BorderLayout.CENTER); + topPanel.add(confignamePanel,BorderLayout.NORTH); + tabs = new JTabbedPane(); + mainPanel.add(tabs,BorderLayout.CENTER); + mainPanel.add(topPanel,BorderLayout.NORTH); + + + JPanel cfgPanel = new JPanel(); + FlowLayout mgr = new FlowLayout(FlowLayout.RIGHT); + cfgPanel.setLayout(mgr); + cfgPanel.setBorder(BorderFactory.createEtchedBorder()); + populate(cfgPanel); + tabs.add("Import configuration", cfgPanel); + + mapPanelHashMap = new LinkedHashMap(); + mapPanel = new JPanel(); + FlowLayout mgr2 = new FlowLayout(FlowLayout.RIGHT); + mapPanel.setLayout(mgr2); + mapPanel.setBorder(BorderFactory.createEtchedBorder()); + String subject = (String) subjectBox.getSelectedItem(); + + JPanel loadHeadersPanel = new JPanel(); + JButton loadHeadersButton = new JButton("Load column names from data source"); + loadHeadersButton.addActionListener(this); + loadHeadersButton.setActionCommand("loadHeaders"); + loadHeadersPanel.add(loadHeadersButton); + mapPanel.add(loadHeadersPanel); + + JPanel constantPanel = new JPanel(); + JLabel constantLabel = new JLabel("Fixed value Value mapping "); + constantPanel.add(constantLabel); + mapPanel.add(constantPanel); + + + + + tabs.add("Import variable mapping", mapPanel); + + String item = (String)confignameField.getSelectedItem(); + ImportConfig cfg = configs.get(item); + updateUi(cfg); + oldSelection = item; + updateMappingTab(subject,false,false); + + + /* + JScrollPane mainScroller = new JScrollPane(mainPanel); + mainScroller.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER); + mainScroller.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS); + + JPanel mainPanel2 = new JPanel(new BorderLayout()); + mainPanel2.add(mainScroller,BorderLayout.CENTER); + */ + + this.add(mainPanel); + + if (isMain) { + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + + + this.setPreferredSize(new Dimension(640,1040)); + this.pack(); + this.setResizable(true); + this.setVisible(true); + } + + public ImportConfig getActiveConfig() { + String item = (String)confignameField.getSelectedItem(); + ImportConfig cfg = configs.get(item); + return cfg; + } + + private void readConfigs() { + // Find all configs and read them + configs = new HashMap(); + + //TODO: Find a suitable location for the CONFIG_DIR constant and make it available to the classes that needs it + File dir = new File("."); + File[] files = dir.listFiles(); + for (File f : files) { + if (f.getName().endsWith(".import")) { + try { + ImportConfig cfg = ImportConfigHandler.loadConfig(f); + configs.put(f.getName(),cfg); + } catch (ClassNotFoundException | IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, + "Could not open config file "+f.toString()+". If it is open in another program, please close it and try again."); + } + } + } + + } + + // This methods updates the GUI components from an ImportConfig object + private void updateUi(ImportConfig cfg) { + + if (cfg==null) { + return; + } + + configTypeBox.setSelectedIndex(cfg.getImportType()); + authTypeBox.setSelectedIndex(cfg.getAuthType()); + flexibleSourceBox.setSelectedIndex(cfg.getDataSourceFlexible()); + + infileField.setText(cfg.getDatafile()); + databaseServerField.setText(cfg.getDatabaseServer()); + indatabaseField.setText(cfg.getDatabase()); + intableField.setText(cfg.getDatatable()); + queryField.setText(cfg.getSqlQuery()); + usernameField.setText(cfg.getUsername()); + passwordField.setText(new String(cfg.getPassword())); + subjectBox.setSelectedItem(cfg.getSubject()); + + scheduleBox.setSelectedIndex(cfg.getScheduleUnit()); + scheduleField.setText(Integer.toString(cfg.getScheduleAmount())); + + updateMappingTab(cfg.getSubject(),true,false); + + LinkedHashMap dataMap = cfg.getMap(); + for (String k : dataMap.keySet()) { + String value = dataMap.get(k); + mapPanelHashMap.get(k).setMappingField(value); + } + + LinkedHashMap constants = cfg.getConstants(); + for (String k : constants.keySet()) { + String value = constants.get(k); + mapPanelHashMap.get(k).setConstant(value); + } + + } + + + // Populate the first panel, for import configuration. + private void populate(JPanel cfgPanel) { + + JPanel subjectPanel = new JPanel(); + JLabel subjectLabel = new JLabel("Subject for the import: "); + subjectBox = new JComboBox(); + File dir = new File("."); + File[] files = dir.listFiles(); + + // Check which subjects that are available and add them to the dropdown + for (File f : files) { + if (f.getName().endsWith(".meta")) { + String name = f.getName().substring(0,f.getName().length()-5); + subjectBox.addItem(name); + } + } + + subjectPanel.add(subjectLabel); + subjectPanel.add(subjectBox); + cfgPanel.add(subjectPanel); + + JPanel configTypePanel = new JPanel(); + JLabel configTypeLabel = new JLabel("Type of data source for import: "); + String[] options = {"SQL","SQLite","Excel","csv"}; + configTypeBox = new JComboBox(options); + configTypePanel.add(configTypeLabel); + configTypePanel.add(configTypeBox); + cfgPanel.add(configTypePanel); + + JPanel authTypePanel = new JPanel(); + JLabel authTypeLabel = new JLabel("Authentication method (for SQL or SQLite): "); + String[] options2 = {"None/Integrated","Password"}; + authTypeBox = new JComboBox(options2); + authTypePanel.add(authTypeLabel); + authTypePanel.add(authTypeBox); + cfgPanel.add(authTypePanel); + + JPanel flexibleSourcePanel = new JPanel(); + JLabel flexibleSourceLabel = new JLabel("Choose data source (file/database+table) every time the import is run? "); + String[] options3 = {"No","Yes"}; + flexibleSourceBox = new JComboBox(options3); + flexibleSourcePanel.add(flexibleSourceLabel); + flexibleSourcePanel.add(flexibleSourceBox); + cfgPanel.add(flexibleSourcePanel); + + JPanel infilePanel = new JPanel(); + JLabel infileLabel = new JLabel("File for CSV/Excel/SQLite import "); + infileField = new JTextField(""); + infileField.setPreferredSize(new Dimension(240, 22)); + JButton chooseInfileButton = new JButton("Browse"); + chooseInfileButton.setActionCommand("browseFile"); + chooseInfileButton.addActionListener(this); + infilePanel.add(infileLabel); + infilePanel.add(infileField); + infilePanel.add(chooseInfileButton); + cfgPanel.add(infilePanel); + + // For SQL databases, the apropriate drivers must be available. Right now MySQL and Sqlserver drivers are included. + String serverToolTipText = "Must be prefixed with protocol:// and end with :port
For example: mysql://localhost:1433
Supported protocols:
sqlserver
mysql"; + JPanel databaseServerPanel = new JPanel(); + JLabel databaseServerLabel = new JLabel("Database server for SQL import "); + databaseServerField = new JTextField(""); + databaseServerField.setPreferredSize(new Dimension(240, 22)); + databaseServerField.setToolTipText(serverToolTipText); + databaseServerPanel.add(databaseServerLabel); + databaseServerPanel.add(databaseServerField); + databaseServerPanel.setToolTipText(serverToolTipText); + cfgPanel.add(databaseServerPanel); + + JPanel indatabasePanel = new JPanel(); + JLabel indatabaseLabel = new JLabel("Database for SQL import "); + indatabaseField = new JTextField(""); + indatabaseField.setPreferredSize(new Dimension(240, 22)); + indatabasePanel.add(indatabaseLabel); + indatabasePanel.add(indatabaseField); + cfgPanel.add(indatabasePanel); + + + // TODO: Dynamically read sheet name from Excel + JPanel intablePanel = new JPanel(); + JLabel intableLabel = new JLabel("Table/view for SQL import, sheet name for Excel import "); + intableField = new JTextField(""); + intableField.setPreferredSize(new Dimension(140, 22)); + intablePanel.add(intableLabel); + intablePanel.add(intableField); + cfgPanel.add(intablePanel); + + JPanel queryPanel = new JPanel(); + JLabel queryLabel = new JLabel("Filter to be used with SQL (using WHERE clause) "); + queryField = new JTextField(""); + queryField.setPreferredSize(new Dimension(200, 22)); + queryPanel.add(queryLabel); + queryPanel.add(queryField); + cfgPanel.add(queryPanel); + + JPanel usernamePanel = new JPanel(); + JLabel usernameLabel = new JLabel("Username (if authentication is used) "); + usernameField = new JTextField(""); + usernameField.setPreferredSize(new Dimension(200, 22)); + usernamePanel.add(usernameLabel); + usernamePanel.add(usernameField); + cfgPanel.add(usernamePanel); + + JPanel passwordPanel = new JPanel(); + JLabel passwordLabel = new JLabel("Password (if authentication is used) "); + passwordField = new JPasswordField(); + passwordField.setPreferredSize(new Dimension(200, 22)); + passwordPanel.add(passwordLabel); + passwordPanel.add(passwordField); + cfgPanel.add(passwordPanel); + + JPanel schedulePanel = new JPanel(); + JLabel scheduleLabel = new JLabel("Import, link, and submit to configured systems every"); + scheduleField = new JTextField(""); + scheduleField.setPreferredSize(new Dimension(80, 22)); + String[] options4 = {"- (Not enabled)","Minutes","Hours","Days"}; + scheduleBox = new JComboBox(options4); + schedulePanel.add(scheduleLabel); + schedulePanel.add(scheduleField); + schedulePanel.add(scheduleBox); + cfgPanel.add(schedulePanel); + } + + // Actions + @Override + public void actionPerformed(ActionEvent e) { + + String command = e.getActionCommand(); + + // Close button, closes the GUI + if (command.equals("close")) { + this.dispose(); + + // Load the headers from the configured data source into the mappings tab + } else if (command.equals("loadHeaders")) { + int tab = tabs.getSelectedIndex(); + if (tab==1) { + String subject = (String) subjectBox.getSelectedItem(); + updateMappingTab(subject,true,true); + } + + // Save configs + } else if (command.equals("save")) { + + ImportConfig cfg = createConfig(); + String selected = (String)confignameField.getSelectedItem(); + if (selected!=null) { + configs.put(selected,cfg); + } + + for (String k : configs.keySet()) { + ImportConfig cfg2 = configs.get(k); + File f = new File(k); + if (cfg2!=null && f!=null) { + try { + ImportConfigHandler.saveConfig(f, cfg2); + } catch (IOException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(null, + "Could not save to config file "+f.toString()+". If it is open in another program, please close it and try again."); + } + } + } + + // Revert to saved state + } else if (command.equals("revert")) { + for (String name : configs.keySet()) { + File f = new File(name); + if (f.exists()) { + try { + ImportConfig cfg = ImportConfigHandler.loadConfig(f); + configs.put(name,cfg); + } catch (ClassNotFoundException | IOException e1) { + + e1.printStackTrace(); + } + } else { + configs.put(name,new ImportConfig()); + } + } + ImportConfig cfg = configs.get((String)confignameField.getSelectedItem()); + updateUi(cfg); + + // Browse for a file to import from + } else if (command.equals("browseFile")) { + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + + if (configTypeBox.getSelectedItem().equals("csv")) { + FileFilter filterCsv = new FileNameExtensionFilter("CSV file (.csv)","csv"); + chooser.addChoosableFileFilter(filterCsv); + } else if (configTypeBox.getSelectedItem().equals("Excel")) { + FileFilter filterExcel = new FileNameExtensionFilter("Excel file (.xlsx)","xlsx"); + chooser.addChoosableFileFilter(filterExcel); + } else if (configTypeBox.getSelectedItem().equals("SQLite")) { + FileFilter filterExcel = new FileNameExtensionFilter("SQLite database (.db, .sqlite)","db","sqlite"); + chooser.addChoosableFileFilter(filterExcel); + } else { + return; + } + + chooser.setAcceptAllFileFilterUsed(true); + chooser.setDialogTitle("Choose file for import"); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + chooser.setAcceptAllFileFilterUsed(true); + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + infileField.setText(chooser.getSelectedFile().toString()); + } + + // If another config is selected, update GUI to reflect the data in this config + } else if (command.equals("selection")) { + + // Put data for previously selected config into an object + ImportConfig cfgOld = createConfig(); + if (oldSelection!=null) { + configs.put(oldSelection,cfgOld); + } + + String item = (String)confignameField.getSelectedItem(); + ImportConfig cfg = configs.get(item); + updateUi(cfg); + + // Make the newly selected config the one to save to an object on next selection action + oldSelection = item; + + // Create new config + } else if (command.equals("new")) { + + // Get user input for config name + String s = (String)JOptionPane.showInputDialog( + this, + "Choose a name for the config:", + "Create new config", + JOptionPane.PLAIN_MESSAGE + ); + + if ((s != null) && (s.length() > 0)) { + if (!s.endsWith(".import")) { + s = s + ".import"; + } + for (String k : configs.keySet()) { + if (s.equals(k)) { + JOptionPane.showMessageDialog(this, + "This config name already exists."); + return; + } + } + + // Create config and update GUI + ImportConfig cfg = new ImportConfig(); + configs.put(s,cfg); + confignameField.addItem(s); + confignameField.setSelectedItem(s); + updateUi(cfg); + } + + + // Rename config + } else if (command.equals("rename")) { + + // Get old name + String name = (String)confignameField.getSelectedItem(); + if (name==null) { + return; + } + + // Get user input for new name + String s = (String)JOptionPane.showInputDialog( + this, + "Choose a new name for config "+name, + "Rename config", + JOptionPane.PLAIN_MESSAGE + ); + + if ((s != null) && (s.length() > 0)) { + if (!s.endsWith(".import")) { + s = s + ".import"; + } + for (String k : configs.keySet()) { + if (s.equals(k)) { + JOptionPane.showMessageDialog(this, + "This config name already exists, choose another name."); + return; + } + } + + // Create new config from current data shown in GUI + ImportConfig cfg = createConfig(); + + // If config is saved to file, save to new file and get rid of the old one + // TODO: Potential issue, if the new file is created and the delete then fails, there is a duplication. + File oldFile = new File(name); + File newFile = new File(s); + if (oldFile.exists()) { + try { + ImportConfigHandler.saveConfig(newFile, cfg); + oldFile.delete(); + } catch (IOException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(this, + "Writing to file "+s+" failed. Aborting rename."); + return; + } + } + + // Replace config in HashMap + configs.remove(name); + configs.put(s,cfg); + + // Reflect the name change in the GUI + confignameField.removeItem(name); + confignameField.addItem(s); + confignameField.setSelectedItem(s); + updateUi(cfg); + } + + + // Delete config (This is only a logical deletion, file will be renamed to .import.bak and will not be visible any more) + // It can be restored through the file system by removing the .bak + } else if (command.equals("delete")) { + String name = (String)confignameField.getSelectedItem(); + if (name==null) { + return; + } + + // Ask user to confirm + int n = JOptionPane.showConfirmDialog( + this, + "Are you sure? This will rename the config file to "+name+".bak\n and it will no longer be visible.", + "Delete config?", + JOptionPane.YES_NO_OPTION); + if (n==JOptionPane.YES_OPTION) { + // TODO: This is replication of code with the rename command, can be extracted to method + File oldFile = new File(name); + File newFile = new File(name+".bak"); + ImportConfig cfg = createConfig(); + if (oldFile.exists()) { + try { + ImportConfigHandler.saveConfig(newFile, cfg); + oldFile.delete(); + } catch (IOException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(this, + "Deletion failed."); + return; + + } + } + + + oldSelection = null; + confignameField.removeItem(name); + try { + // Try to set the selected config to the first item in the dropdown + confignameField.setSelectedIndex(0); + ImportConfig cfg2 = configs.get((String)confignameField.getSelectedItem()); + updateUi(cfg2); + String item = (String)confignameField.getSelectedItem(); + oldSelection = item; + } catch (Exception e2) { + // If no other configs exist, generate an empty one + ImportConfig cfg2 = new ImportConfig(); + updateUi(cfg2); + } + + } + + } + } + + // This method updates the mapping tab with the headings from the selected subject metadata file + // and the headings from the selected data source (if it is valid) + private void updateMappingTab(String subject, boolean forceUpdate, boolean readHeadersFromSource) { + + //Get the selected config + ImportConfig cfg = configs.get(confignameField.getSelectedItem()); + + //TODO: This base directory should be in global field CONFIG_DIR + File dir = new File("."); + File[] files = dir.listFiles(); + for (File f : files) { + // Find the corresponding subject metadata file + if (f.getName().equals(subject+".meta")) { + + // Try to read all headers from data source, just add empty if data source returned null header + ArrayList columns = new ArrayList(); + columns.add(""); + + ArrayList header=null; + + if (readHeadersFromSource) { + header = readDataHeader(); + ImportConfig activeCfg = getActiveConfig(); + if (activeCfg!=null) { + activeCfg.setDataSourceHeaders(header); + } + } else { + ImportConfig activeCfg = getActiveConfig(); + if (activeCfg!=null) { + header = activeCfg.getDatasourceHeaders(); + } + if (header==null) { + header = readDataHeader(); + if (activeCfg!=null) { + activeCfg.setDataSourceHeaders(header); + } + } + } + + if (header!=null) { + columns.addAll(header); + } + + // Open metadata file and step through the fields, adding a controlled vocabulary when provided + // TODO: This is a bit hacky, it entagles GUI operations with file parsing, should be rewritten + ArrayList fields = new ArrayList(); + ArrayList lines = new ArrayList(); + BufferedReader br; + try { + + // Read all lines from metadata file + br = new BufferedReader(new FileReader(f)); + String line; + while ((line=br.readLine())!=null) { + lines.add(line); + } + br.close(); + + lines.add(UPLOAD_COLUMN+"=Yes,No"); + lines.add(BASE_FILE_COLUMN); + lines.add(ASSEMBLY_FILE_COLUMN); + lines.add(READ_FILES_COLUMN); + + // Iterate over the fields + for (String field : lines) { + + // Check if there is a '=' present, if so, the field name is everything up to it + int dividerIndex = field.indexOf("="); + String[] vocabulary=null; + if (dividerIndex!=-1) { + vocabulary = field.substring(dividerIndex+1).split(",",-1); + field = field.substring(0, dividerIndex); + } + fields.add(field); + + // Check if this is a field not previously in the GUI, or if the method was called with a force update flag + if (!mapPanelHashMap.containsKey(field) || forceUpdate) { + + // Generate a new panel, or get an existing one + ImportMapPanel panel; + if (mapPanelHashMap.containsKey(field)) { + // panel already exists, update + panel = mapPanelHashMap.get(field); + panel.setMappingFields(columns); + + } else { + // New panel, generate it + + // Get map between import values and metadata values if there is a controlled vocabulary + LinkedHashMap valueMap = null; + if (cfg!=null) { + valueMap = cfg.getValueMap().get(field); + } + panel = new ImportMapPanel(field,columns,vocabulary, valueMap); + } + + // Set the mapping for this panel + if (cfg!=null) { + String value = cfg.getMap().get(field); + if (value!=null) { + panel.setMappingField(value); + } + } + + // Add panel to HashMap and to GUI + mapPanelHashMap.put(field,panel); + mapPanel.add(panel); + } + } + + // Iterate over all existing panels, if it is not in the metadata set, remove it from GUI and HashMap + for (String k : new LinkedHashSet(mapPanelHashMap.keySet())) { + if (fields.indexOf(k)==-1) { + mapPanel.remove(mapPanelHashMap.get(k)); + mapPanelHashMap.remove(k); + } + } + + } catch (IOException e) { + e.printStackTrace(); + continue; + + } + } + } + } + + // Read the header from the import data source + private ArrayList readDataHeader() { + + System.out.println("Reading headers from source"); + ArrayList header=new ArrayList(); + + // Get parameters from GUI + File infile = new File (infileField.getText()); + String database = indatabaseField.getText(); + String databaseServer = databaseServerField.getText(); + String table = intableField.getText(); + int dataType = configTypeBox.getSelectedIndex(); + + + switch (dataType) { + + // CSV + case ImportConfig.IMPORT_CSV: + if (!infile.exists()) { + error("File does not exist"); + return header; + } + header = ImportTools.readCsvHeader(infile); + break; + + //Excel + case ImportConfig.IMPORT_EXCEL: + if (!infile.exists()) { + error("File does not exist"); + return header; + } + if (table.equals("")) { + error("Excel sheet must be chosen"); + return header; + } + header = ImportTools.readExcelHeader(infile, table); + break; + + //SQLite + case ImportConfig.IMPORT_SQLITE: + if (!infile.exists()) { + error("File does not exist"); + return header; + } + + if (table.equals("")) { + error("SQLite table must be chosen"); + return header; + } + header = ImportTools.readSqliteHeader(infile.toString(), table); + break; + + // SQL + case ImportConfig.IMPORT_SQL: + if (databaseServer.equals("")) { + return header; + } + if (database.equals("")) { + error("SQL database must be chosen"); + return header; + } + if (table.equals("")) { + error("SQL table must be chosen"); + return header; + } + int authMethod = authTypeBox.getSelectedIndex(); + String username = usernameField.getText(); + char[] password = passwordField.getPassword(); + ImportSqlAuth auth = new ImportSqlAuth(authMethod, username, password); + header = ImportTools.readSqlHeader(databaseServer, database, table, auth); + break; + + } + + + return header; + } + + private void error(String message) { + JOptionPane.showMessageDialog(this, message); + } + + // Generate an ImportConfig object from the current GUI data + private ImportConfig createConfig() { + + ImportConfig activeConfig = getActiveConfig(); + ArrayList datasourceHeaders = activeConfig.getDatasourceHeaders(); + ImportConfig cfg = new ImportConfig(); + cfg.setDataSourceHeaders(datasourceHeaders); + cfg.setImportType(configTypeBox.getSelectedIndex()); + cfg.setAuthType(authTypeBox.getSelectedIndex()); + cfg.setDataSourceFlexible(flexibleSourceBox.getSelectedIndex()); + cfg.setDatafile(infileField.getText()); + cfg.setDatabaseServer(databaseServerField.getText()); + cfg.setDatabase(indatabaseField.getText()); + cfg.setDatatable(intableField.getText()); + cfg.setSqlQuery(queryField.getText()); + cfg.setUsername(usernameField.getText()); + cfg.setPassword(passwordField.getPassword()); + cfg.setSubject((String)subjectBox.getSelectedItem()); + + int scheduleAmount = 0; + try { + scheduleAmount = Integer.parseInt(scheduleField.getText()); + } catch (Exception e) { + scheduleAmount = 0; + } + cfg.setScheduleAmount(scheduleAmount); + cfg.setScheduleUnit(scheduleBox.getSelectedIndex()); + + LinkedHashMap> valueMapMap = new LinkedHashMap>(); + LinkedHashMap dataMap = new LinkedHashMap(); + for (String k : mapPanelHashMap.keySet()) { + dataMap.put(k, mapPanelHashMap.get(k).getMappingFieldname()); + valueMapMap.put(k, mapPanelHashMap.get(k).getValueMap()); + } + cfg.setMap(dataMap); + cfg.setValueMap(valueMapMap); + + LinkedHashMap constants = new LinkedHashMap(); + for (String k : mapPanelHashMap.keySet()) { + constants.put(k, mapPanelHashMap.get(k).getConstant()); + } + cfg.setConstants(constants); + + return cfg; + } + + // Main method for running this GUI stand alone + public static void main(String[] args) { + try { + // Set System L&F + UIManager.setLookAndFeel( + UIManager.getSystemLookAndFeelClassName()); + } + catch (UnsupportedLookAndFeelException e) { + + } + catch (ClassNotFoundException e) { + + } + catch (InstantiationException e) { + + } + catch (IllegalAccessException e) { + + } + + ImportConfigGUI gui = new ImportConfigGUI(true); + gui.init(); + } + + +} diff --git a/src/eu/europa/ecdc/enauploader/ImportConfigHandler.java b/src/eu/europa/ecdc/enauploader/ImportConfigHandler.java new file mode 100644 index 0000000..bb9a932 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ImportConfigHandler.java @@ -0,0 +1,29 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +// Read and write routine for ImportConfig files. +// These can be replaced if another file format than serialized Java objects is to be implemented + +public class ImportConfigHandler { + + public static ImportConfig loadConfig(File configFile) throws IOException, ClassNotFoundException { + FileInputStream streamIn = new FileInputStream(configFile); + ObjectInputStream objectinputstream = new ObjectInputStream(streamIn); + ImportConfig config = (ImportConfig) objectinputstream.readObject(); + objectinputstream.close(); + return config; + } + + public static void saveConfig(File configFile, ImportConfig config) throws IOException { + FileOutputStream fout = new FileOutputStream(configFile); + ObjectOutputStream oos = new ObjectOutputStream(fout); + oos.writeObject(config); + oos.close(); + } +} diff --git a/src/eu/europa/ecdc/enauploader/ImportMapPanel.java b/src/eu/europa/ecdc/enauploader/ImportMapPanel.java new file mode 100644 index 0000000..6abe4f4 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ImportMapPanel.java @@ -0,0 +1,213 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.LinkedHashMap; + +import javax.swing.JButton; +import javax.swing.JComboBox; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTable; +import javax.swing.JTextField; +import javax.swing.table.DefaultTableModel; + +// This class implements a panel for the mapping of a single data field +public class ImportMapPanel extends JPanel implements ActionListener { + + private static final long serialVersionUID = 6385671140689063455L; + private String name; + private JComboBox mappingFieldnameBox; + private String[] vocabulary; + private JTextField constantField; + private JComboBox constantBox; + boolean multiChoice; + private LinkedHashMap valueMap; + + + ImportMapPanel(String name, ArrayList options,String[] vocabulary, LinkedHashMap valueMap) { + this.name = name; + this.vocabulary = vocabulary; + + // If the mapping of values between controlled vocabularies is empty, generate a default one + if (valueMap==null && vocabulary != null) { + valueMap = new LinkedHashMap(); + for (String v : vocabulary) { + valueMap.put(v,v); + } + } + + this.valueMap = valueMap; + + // Init GUI components + this.setLayout(new FlowLayout(FlowLayout.RIGHT)); + mappingFieldnameBox = new JComboBox(); + setMappingFields(options); + + JLabel label = new JLabel(this.name); + + // For free text, use a JtextField, for controlled vocabularies, use a JComboBox for the constant field + if (vocabulary==null || vocabulary.length==0) { + constantField = new JTextField(""); + constantField.setPreferredSize(new Dimension(80,25)); + multiChoice=false; + } else { + constantBox = new JComboBox(); + constantBox.addItem(""); + for (String c : this.vocabulary) { + constantBox.addItem(c); + } + constantBox.setPreferredSize(new Dimension(80,25)); + multiChoice=true; + } + + + this.add(label); + this.add(mappingFieldnameBox); + if (multiChoice) { + this.add(constantBox); + } else { + this.add(constantField); + } + + // If there is a controlled vocabulary, enable the button for mapping to it + JButton valueMappingButton = new JButton("Map values"); + if (vocabulary==null || vocabulary.length==0) { + valueMappingButton.setEnabled(false); + } else { + valueMappingButton.setEnabled(true); + } + valueMappingButton.setActionCommand("map"); + valueMappingButton.addActionListener(this); + + this.add(valueMappingButton); + + this.setPreferredSize(new Dimension(600,30)); + } + + // Get the mapping field name + public String getMappingFieldname() { + return (String) mappingFieldnameBox.getSelectedItem(); + } + + // Get the value map + public LinkedHashMap getValueMap() { + return valueMap; + } + + // Get the constant field value + public String getConstant() { + if (multiChoice) { + return (String)constantBox.getSelectedItem(); + } else { + return constantField.getText(); + } + } + + // Get the field name (from metadata file) + public String getName() { + return name; + } + + // Set the possible fields to map from + public void setMappingFields(ArrayList columns) { + mappingFieldnameBox.removeAllItems(); + for (String option : columns) { + mappingFieldnameBox.addItem(option); + } + repaint(); + } + + + // Set the choice for field to map from + public void setMappingField(String value) { + mappingFieldnameBox.setSelectedItem(value); + } + + // Set the constant value + public void setConstant(String value) { + if (multiChoice) { + constantBox.setSelectedItem(value); + } else { + constantField.setText(value); + } + + } + + + // Handler for event for the value mapping button, it opens a dialog with a table of mappings + // TODO: Make this nicer looking and add JComboBox for controlled vocabulary + @Override + public void actionPerformed(ActionEvent arg0) { + + // Generate data for mapping table + String[] headers = {"Local value","TESSy value"}; + String[][] data = new String[valueMap.size()][headers.length]; + int c = 0; + for (String k : valueMap.keySet()) { + String[] row = new String[headers.length]; + row[0] = k; + row[1] = valueMap.get(k); + data[c] = row; + c++; + } + + // Create table + DefaultTableModel model = new DefaultTableModel(data,headers); + JTable table = new JTable(model); + JScrollPane scroller = new JScrollPane(table); + JPanel panel = new JPanel(); + panel.add(scroller); + + // Button for a dding a new rom to the mapping + JButton addButton = new JButton("Add row"); + addButton.setActionCommand("add"); + addButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + model.addRow(new String[2]); + + } + }); + panel.add(addButton); + + // Button for removing a row from the mapping + JButton removeButton = new JButton("Remove row"); + removeButton.setActionCommand("remove"); + removeButton.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + model.removeRow(table.getSelectedRow()); + } + }); + panel.add(removeButton); + + //Button for saving the value map + JButton saveButton = new JButton("Save"); + saveButton.setActionCommand("save"); + saveButton.addActionListener(new ActionListener() { + + @Override + public void actionPerformed(ActionEvent e) { + for (int i = 0 ;i nextActions; + private HashMap importSubjects; + private HashMap intervals; + + private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + + // Constructor, ties the scheduler to a GUI + ImportScheduler(EcdcUploaderGUI gui) { + super(gui, null, null, null, null, null); + + intervals = new HashMap(); + nextActions = new HashMap(); + importSubjects = new HashMap(); + } + + // Go through all the import configs and find any requests for scheduling + // Only update if they have changed, to not interrupt running schedules + public int setImportConfigHash(HashMap importConfigHash) { + + log("Loading scheduled imports and submissions..."); + int schedules = 0; + for (String configName : importConfigHash.keySet()) { + ImportConfig cfg = importConfigHash.get(configName); + + // Calculate interval in seconds + long interval = cfg.getScheduleAmount() * unitAmounts[cfg.getScheduleUnit()]; + Long oldInterval = intervals.get(configName); + if (oldInterval != null && interval == oldInterval) { + //Interval is unchanged, do not update + continue; + } + + // If interval is negative, no scheduling has been configured. Get rid of any existing schedule for this config + if (interval<=0) { + intervals.put(configName, null); + nextActions.put(configName, null); + importSubjects.put(configName,null); + + // If scheduling, calculate the time for next import/upload + } else { + Date nextAction = new Date( System.currentTimeMillis() + interval * 1000); + intervals.put(configName, interval); + nextActions.put(configName, nextAction); + importSubjects.put(configName,cfg.getSubject()); + schedules++; + SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + log("Scheduled "+configName+" for "+df.format(nextAction)); + } + } + log("Done loading. "+Integer.toString(schedules)+" different configurations scheduled."); + return schedules; + } + + // Main method for this worker, it waits until it is time to import/upload and then does so + @Override + protected Object doInBackground() throws Exception { + + setTitle("Import and submission scheduler"); + setStatus("Waiting for scheduled jobs"); + setProgress(5); + + // Run forever + while (true) { + + Date now = new Date(); + + // Iterate through nextActions HashMap + for (String configName : nextActions.keySet()) { + setStatus("Checking scheduled jobs"); + setProgress(15); + // Check if the time for the next import/upload is non-null and in the past, if so, perform it + Date nextAction = nextActions.get(configName); + if (nextAction == null) { + continue; + } + if (now.after(nextAction)) { + setStatus("Performing import and submission for config "+configName); + log("Performing import and submission for config "+configName); + setProgress(45); + Long interval = intervals.get(configName); + importData(configName); + + + // Calculate time for next action and schedule it + nextAction = new Date(now.getTime() + interval * 1000); + log("Setting next scheduled time for "+configName+" to "+dateFormat.format(nextAction)); + nextActions.put(configName, nextAction); + + //TODO TEMP for DEV + //return null; + } + + } + + setStatus("Waiting for scheduled jobs"); + setProgress(5); + // Wait 10 seconds until next check + Thread.sleep(10000); + } + } + + // Trigger import and upload from the GUI + private void importData(String configName) { + // TODO + EcdcAutomationWorker worker = gui.getEcdcAutomationWorker(configName); + if (worker!=null) { + System.out.println("Starting scheduled activity"); + worker.execute(); + log("Job launched, waiting for results"); + setStatus("Job launched for "+configName+" waiting..."); + setProgress(60); + boolean done = false; + while(!done) { + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + if (worker.isDone()) { + done = true; + log("Finished scheduled activity"); + } + + } + + } else { + log("Null AutomationWorker, job aborted. Please check import config for errors."); + } + + } +} diff --git a/src/eu/europa/ecdc/enauploader/ImportSqlAuth.java b/src/eu/europa/ecdc/enauploader/ImportSqlAuth.java new file mode 100644 index 0000000..e7ea953 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ImportSqlAuth.java @@ -0,0 +1,40 @@ +package eu.europa.ecdc.enauploader; + +// Class for holding authentication information for importing from SQL +public class ImportSqlAuth { + + private int authMethod; + private String username; + private char[] password; + + public ImportSqlAuth(int authMethod, String username, char[] password) { + this.setAuthMethod(authMethod); + this.setUsername(username); + this.setPassword(password); + } + + public int getAuthMethod() { + return authMethod; + } + + public void setAuthMethod(int authMethod) { + this.authMethod = authMethod; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public char[] getPassword() { + return password; + } + + public void setPassword(char[] password) { + this.password = password; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/ImportTools.java b/src/eu/europa/ecdc/enauploader/ImportTools.java new file mode 100644 index 0000000..17aabc7 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/ImportTools.java @@ -0,0 +1,486 @@ +package eu.europa.ecdc.enauploader; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileReader; +import java.io.IOException; +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.DriverManager; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; + +import javax.swing.JTable; +import javax.swing.table.DefaultTableModel; + +import org.apache.poi.hssf.usermodel.HSSFDateUtil; +import org.apache.poi.ss.usermodel.CellType; +import org.apache.poi.ss.usermodel.DataFormatter; +import org.apache.poi.ss.usermodel.FormulaEvaluator; +import org.apache.poi.xssf.usermodel.XSSFCell; +import org.apache.poi.xssf.usermodel.XSSFRow; +import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +// Class for importing data from various sources +public class ImportTools { + + private static final String SQL_DRIVER_PREFIX = "jdbc:"; + private static final String SQLITE_PREFIX = "sqlite://"; + + + + + // Map the values using the configured valueMap + static ArrayList mapValues(ArrayList data, + ArrayList fields, ArrayList indices, LinkedHashMap> valueMap) { + + // Iterate through the data rows + for (int j = 0;j valueMapLocal = valueMap.get(field); + + // If there is no value map, do nothing + if (valueMapLocal==null) { + continue; + } + // if the old value is in the valueMap, map it and note the entry as updated + if (valueMapLocal.containsKey(row[i])) { + row[i] = valueMapLocal.get(row[i]); + updated = true; + } + + } + + // If this entry is updated, write into memory + if (updated) { + data.set(j, row); + } + } + + return data; + } + + + // Import from CSV + static ArrayList importCsv(ImportConfig cfg, ArrayList oldEntries, ArrayList fields, EcdcJob job, File importFile) { + File file = importFile; + ArrayList data = new ArrayList(); + + try { + BufferedReader br = new BufferedReader(new FileReader(file)); + + String line; + + while ((line = br.readLine())!=null) { + String[] rowData = parseLine(line); + data.add(rowData); + } + br.close(); + + } catch (IOException e) { + if (job!=null) { + job.log("IOException, import failed"); + job.log(e.getMessage()); + } + e.printStackTrace(); + } + return data; + } + + + // Import from Excel + static ArrayList importExcel(ImportConfig cfg, ArrayList oldEntries, ArrayList fields, EcdcJob job, File importFile) { + + File file = importFile; + String sheetName = cfg.getDatatable(); + ArrayList data = new ArrayList(); + System.out.println(fields.size()); + ArrayList indices = new ArrayList(); + for (int i = 0;i cols){ + cols = tmp; + startRow = i; + } + } + } + System.out.println(startRow); + row = sheet.getRow(startRow); + if(row != null) { + for(int c = 0; c < cols; c++) { + cell = row.getCell((short)c); + if(cell != null) { + String value = cell.getStringCellValue(); + int index = fields.indexOf(value); + if (index!=-1) { + indices.set(index, c); + } + } + } + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + for(int i = startRow + 1; i < rows; i++) { + row = sheet.getRow(i); + if(row != null) { + cols = sheet.getRow(i).getPhysicalNumberOfCells(); + String[] datarow = new String[indices.size()]; + int n = 0; + for(int c : indices) { + cell = row.getCell((short)c); + if(cell != null) { + String value; + + if (cell.getCellType() == CellType.NUMERIC && HSSFDateUtil.isCellDateFormatted(cell)) { + + value = sdf.format(cell.getDateCellValue()); + } else { + objFormulaEvaluator.evaluate(cell); // This will evaluate the cell, And any type of cell will return string value + value = objDefaultFormat.formatCellValue(cell,objFormulaEvaluator); + } + + datarow[n] = value; + System.out.print(value+"\t"); + + } + n++; + System.out.println(n); + } + data.add(datarow); + } + } + + wb.close(); + return data; + } catch (IOException e) { + if (job!=null) { + job.log("IOException, import failed"); + job.log(e.getMessage()); + } + e.printStackTrace(); + } + + return null; + + } + + + + static ArrayList importSql(ImportConfig cfg, ArrayList oldEntries, ArrayList fields, EcdcJob job) { + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + } catch (ClassNotFoundException e) { + if (job!=null) { + job.log("ClassNotFoundException, import failed"); + job.log(e.getMessage()); + } + e.printStackTrace(); + } + + ArrayList data = new ArrayList(); + + try { + String database = cfg.getDatabase(); + String databaseServer = cfg.getDatabaseServer().toLowerCase(); + if (databaseServer.startsWith("sqlserver")) { + database = SQL_DRIVER_PREFIX+databaseServer+";DatabaseName="+database; + } else if (databaseServer.startsWith("mysql")) { + database = SQL_DRIVER_PREFIX+databaseServer+"?DatabaseName="+database; + } + + + System.out.println(database); + Connection connection; + + if (cfg.getAuthType()==ImportConfig.AUTH_NONE) { + connection = DriverManager.getConnection(database+";integratedSecurity=true"); + } else if (cfg.getAuthType()==ImportConfig.AUTH_PASSWORD) { + connection = DriverManager.getConnection(database, cfg.getUsername(), new String(cfg.getPassword())); + } else { + return null; + } + + String query = constructQuery(cfg,fields); + + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(query); + while (resultSet.next()) { + + String[] row = new String[fields.size()]; + for (int i=1;i<= fields.size();i++) { + row[i-1] = resultSet.getString(i); + } + data.add(row); + + } + + } catch (SQLException e) { + if (job!=null) { + job.log("SQLException, import failed"); + job.log(e.getMessage()); + } + e.printStackTrace(); + return null; + } + + return data; + } + + static ArrayList importSqlite(ImportConfig cfg, ArrayList oldEntries, ArrayList fields, EcdcJob job) { + ArrayList data = new ArrayList(); + Connection connection; + try { + + connection = DriverManager.getConnection(SQL_DRIVER_PREFIX+SQLITE_PREFIX+cfg.getDatafile().replace("\\","/")); + + + String query = constructQuery(cfg,fields); + + Statement stmt = connection.createStatement(); + ResultSet resultSet = stmt.executeQuery(query); + while (resultSet.next()) { + + String[] row = new String[fields.size()]; + for (int i=1;i<= fields.size();i++) { + row[i-1] = resultSet.getString(i); + } + data.add(row); + + } + + } catch (SQLException e) { + if (job!=null) { + job.log("SQLException, import failed"); + job.log(e.getMessage()); + } + e.printStackTrace(); + return null; + } + + return data; + } + + + private static String constructQuery(ImportConfig cfg, ArrayList fields) { + String query = "SELECT "; + boolean first = true; + for (String f : fields) { + if (!first) { + query = query + ", "; + } else { + first = false; + } + query = query +"["+ f+"]"; + } + query = query + " FROM "+cfg.getDatatable(); + if (!cfg.getSqlQuery().equals("")) { + String filter = cfg.getSqlQuery(); + if (filter.contains(";")) { + filter = filter.substring(0, filter.indexOf(";")); + } + + query = query + " WHERE "+filter; + } + query = query + ";"; + return query; + } + + + + public static ArrayList readCsvHeader(File file) { + ArrayList headers = new ArrayList(); + try { + BufferedReader br = new BufferedReader(new FileReader(file)); + String line = br.readLine(); + String[] fields = parseLine(line); + for (String f : fields) { + headers.add(f); + } + br.close(); + return headers; + } catch (IOException e) { + e.printStackTrace(); + } + + return null; + } + + public static ArrayList readExcelHeader(File file, String sheetName) { + ArrayList headers = new ArrayList(); + FileInputStream fs; + try { + fs = new FileInputStream(file); + XSSFWorkbook wb = new XSSFWorkbook(fs); + XSSFSheet sheet = wb.getSheet(sheetName); + XSSFRow row; + XSSFCell cell; + + int rows; // No of rows + rows = sheet.getPhysicalNumberOfRows(); + + int cols = 0; // No of columns + int tmp = 0; + int startRow = 0; + + // This trick ensures that we get the data properly even if it doesn't start from first few rows + for(int i = 0; i < 5 && i < rows; i++) { + row = sheet.getRow(i); + if(row != null) { + tmp = sheet.getRow(i).getPhysicalNumberOfCells(); + if(tmp > cols){ + cols = tmp; + startRow = i; + } + } + } + System.out.println(startRow); + row = sheet.getRow(startRow); + if(row != null) { + for(int c = 0; c < cols; c++) { + cell = row.getCell((short)c); + if(cell != null) { + String value = cell.getStringCellValue(); + headers.add(value); + } + } + } + wb.close(); + return headers; + } catch (IOException e) { + + e.printStackTrace(); + } + + return null; + } + + public static ArrayList readSqliteHeader(String path, String table) { + ArrayList headers = new ArrayList(); + + Connection connection; + try { + System.out.println(SQL_DRIVER_PREFIX+SQLITE_PREFIX+path.replace("\\","/")); + connection = DriverManager.getConnection(SQL_DRIVER_PREFIX+SQLITE_PREFIX+path.replace("\\","/")); + DatabaseMetaData md = connection.getMetaData(); + ResultSet rset = md.getColumns(null, null, table, null); + while (rset.next()) + { + headers.add(rset.getString("COLUMN_NAME")); + } + return headers; + } catch (SQLException e) { + e.printStackTrace(); + return null; + } + } + + public static ArrayList readSqlHeader(String databaseServer,String database, String table, ImportSqlAuth auth) { + + try { + Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + + String dbName = database; + databaseServer = databaseServer.toLowerCase(); + if (databaseServer.startsWith("sqlserver")) { + database = SQL_DRIVER_PREFIX+databaseServer+";DatabaseName="+database; + } else if (databaseServer.startsWith("mysql")) { + database = SQL_DRIVER_PREFIX+databaseServer+"?DatabaseName="+database; + } + + + System.out.println(database); + Connection connection; + try { + if (auth.getAuthMethod()==ImportConfig.AUTH_NONE) { + connection = DriverManager.getConnection(database+";integratedSecurity=true"); + } else if (auth.getAuthMethod()==ImportConfig.AUTH_PASSWORD) { + connection = DriverManager.getConnection(database, auth.getUsername(), new String(auth.getPassword())); + } else { + return null; + } + + return readGeneralSqlHeaders(connection,dbName,table); + } catch (SQLException e) { + e.printStackTrace(); + return null; + } + } + + + private static ArrayList readGeneralSqlHeaders(Connection connection, String db, String table) throws SQLException { + ArrayList headers = new ArrayList(); + + DatabaseMetaData md = connection.getMetaData(); + ResultSet rset = md.getColumns(null, null, table, null); + while (rset.next()) + { + headers.add(rset.getString("COLUMN_NAME")); + } + + + return headers; + } + + private static String[] parseLine(String l2) { + String otherThanQuote = " [^\"] "; + String quotedString = String.format(" \" %s* \" ", otherThanQuote); + String regex = String.format("(?x) "+ // enable comments, ignore white spaces + ", "+ // match a comma + "(?= "+ // start positive look ahead + " (?: "+ // start non-capturing group 1 + " %s* "+ // match 'otherThanQuote' zero or more times + " %s "+ // match 'quotedString' + " )* "+ // end group 1 and repeat it zero or more times + " %s* "+ // match 'otherThanQuote' + " $ "+ // match the end of the string + ") ", // stop positive look ahead + otherThanQuote, quotedString, otherThanQuote); + + String[] tokens = l2.split(regex, -1); + return tokens; + } +} \ No newline at end of file diff --git a/src/eu/europa/ecdc/enauploader/JCIFSEngine.java b/src/eu/europa/ecdc/enauploader/JCIFSEngine.java new file mode 100644 index 0000000..5128ff1 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/JCIFSEngine.java @@ -0,0 +1,45 @@ +package eu.europa.ecdc.enauploader; +import java.io.IOException; + +import jcifs.ntlmssp.NtlmFlags; +import jcifs.ntlmssp.Type1Message; +import jcifs.ntlmssp.Type2Message; +import jcifs.ntlmssp.Type3Message; +import jcifs.util.Base64; + +import org.apache.http.impl.auth.NTLMEngine; +import org.apache.http.impl.auth.NTLMEngineException; + +public final class JCIFSEngine implements NTLMEngine { + + private static final int TYPE_1_FLAGS = + NtlmFlags.NTLMSSP_NEGOTIATE_56 | + NtlmFlags.NTLMSSP_NEGOTIATE_128 | + NtlmFlags.NTLMSSP_NEGOTIATE_NTLM2 | + NtlmFlags.NTLMSSP_NEGOTIATE_ALWAYS_SIGN | + NtlmFlags.NTLMSSP_REQUEST_TARGET; + + public String generateType1Msg(final String domain, final String workstation) + throws NTLMEngineException { + final Type1Message type1Message = new Type1Message(TYPE_1_FLAGS, domain, workstation); + return Base64.encode(type1Message.toByteArray()); + } + + public String generateType3Msg(final String username, final String password, + final String domain, final String workstation, final String challenge) + throws NTLMEngineException { + Type2Message type2Message; + try { + type2Message = new Type2Message(Base64.decode(challenge)); + } catch (final IOException exception) { + throw new NTLMEngineException("Invalid NTLM type 2 message", exception); + } + final int type2Flags = type2Message.getFlags(); + final int type3Flags = type2Flags + & (0xffffffff ^ (NtlmFlags.NTLMSSP_TARGET_TYPE_DOMAIN | NtlmFlags.NTLMSSP_TARGET_TYPE_SERVER)); + final Type3Message type3Message = new Type3Message(type2Message, password, domain, + username, workstation, type3Flags); + return Base64.encode(type3Message.toByteArray()); + } + +} \ No newline at end of file diff --git a/src/eu/europa/ecdc/enauploader/JCIFSNTLMSchemeFactory.java b/src/eu/europa/ecdc/enauploader/JCIFSNTLMSchemeFactory.java new file mode 100644 index 0000000..2210142 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/JCIFSNTLMSchemeFactory.java @@ -0,0 +1,17 @@ +package eu.europa.ecdc.enauploader; + +import org.apache.http.auth.AuthScheme; +import org.apache.http.auth.AuthSchemeProvider; +import org.apache.http.impl.auth.NTLMScheme; +import org.apache.http.protocol.HttpContext; + +public class JCIFSNTLMSchemeFactory implements AuthSchemeProvider { + + @Override + public AuthScheme create(final HttpContext context) { + return new NTLMScheme(new JCIFSEngine()); + } + + + +} \ No newline at end of file diff --git a/src/eu/europa/ecdc/enauploader/JTableOutputHandler.java b/src/eu/europa/ecdc/enauploader/JTableOutputHandler.java new file mode 100644 index 0000000..71251f3 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/JTableOutputHandler.java @@ -0,0 +1,25 @@ +package eu.europa.ecdc.enauploader; + +import javax.swing.JTable; + +public class JTableOutputHandler extends OutputHandler { + + + private JTable outTable; + + JTableOutputHandler (JTable table) { + outTable = table; + } + + @Override + public void write(String value, int row, int col) { + outTable.setValueAt(value, row, col); + System.out.println(value); + } + + @Override + public void close() { + + + } +} diff --git a/src/eu/europa/ecdc/enauploader/JTextActionArea.java b/src/eu/europa/ecdc/enauploader/JTextActionArea.java new file mode 100644 index 0000000..b5f0acc --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/JTextActionArea.java @@ -0,0 +1,42 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; + +import javax.swing.JComboBox; +import javax.swing.JTextArea; + +public class JTextActionArea extends JTextArea implements ActionListener { + + + + public JTextActionArea(String string, boolean edit) { + super(string); + this.setEditable(edit); + } + + @Override + public void actionPerformed(ActionEvent e) { + setText(""); + JComboBox box = (JComboBox)e.getSource(); + String value = box.getSelectedItem().toString(); + try { + String line; + BufferedReader br = new BufferedReader(new FileReader(new File(value))); + while ((line = br.readLine())!=null) { + if (!line.equals("")) { + append(line+"\n"); + } + } + br.close(); + } catch (IOException e2) { + + e2.printStackTrace(); + } + } + +} diff --git a/src/eu/europa/ecdc/enauploader/OutputHandler.java b/src/eu/europa/ecdc/enauploader/OutputHandler.java new file mode 100644 index 0000000..ad8b3cf --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/OutputHandler.java @@ -0,0 +1,10 @@ +package eu.europa.ecdc.enauploader; + +public abstract class OutputHandler { + + + + public abstract void write(String value, int row, int col); + public abstract void close(); + +} diff --git a/src/eu/europa/ecdc/enauploader/Run.java b/src/eu/europa/ecdc/enauploader/Run.java index fb90844..49e1905 100644 --- a/src/eu/europa/ecdc/enauploader/Run.java +++ b/src/eu/europa/ecdc/enauploader/Run.java @@ -2,12 +2,8 @@ import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; -import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; -import java.nio.file.CopyOption; -import java.nio.file.Files; -import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.HashMap; diff --git a/src/eu/europa/ecdc/enauploader/Submission.java b/src/eu/europa/ecdc/enauploader/Submission.java index 884c356..792d1e1 100644 --- a/src/eu/europa/ecdc/enauploader/Submission.java +++ b/src/eu/europa/ecdc/enauploader/Submission.java @@ -51,15 +51,18 @@ public void init() { public void setlogArea(JTextArea logger) { logArea = logger; } + public void useProductionServer(boolean p) { - if (p = true) { + if (p) { // production API API_URL = "https://www.ebi.ac.uk/ena/submit/drop-box/submit/?auth=ENA"; + System.out.println(API_URL); } else { // test API API_URL = "https://www-test.ebi.ac.uk/ena/submit/drop-box/submit/?auth=ENA"; } + System.out.println(API_URL); } public void setLogin(String l, String pwd) { @@ -156,18 +159,33 @@ public void writeXml(File f) { } - public boolean submit() { + return submit(null); + } + + public boolean submit(EcdcJob sourceJob) { if (!uploaded) { System.out.println("DATA FILES HAVE NOT SUCCESSFULLY BEEN UPLOADED!"); + if (sourceJob!=null) { + sourceJob.log("Data files have not been successfully uploaded to ENA, aborting ENA submission"); + } return false; } + if (sourceJob!=null) { + sourceJob.log("Initializing ENA submission"); + } init(); + if (sourceJob!=null) { + sourceJob.log("Writing ENA xml files"); + } writeXml(); - curlFiles(); + if (sourceJob!=null) { + sourceJob.log("Uploading ENA xml files"); + } + curlFiles(sourceJob); return true; } @@ -206,14 +224,16 @@ public void uploadFiles() { } } + - private void curlFiles() { + private void curlFiles(EcdcJob sourceJob) { if (logArea==null) { System.out.println("Submitting XML files..."); } else { logArea.append("Submitting XML files..."+"\n"); } + ArrayList commands = new ArrayList(); commands.add(CURL_PATH); @@ -233,12 +253,32 @@ private void curlFiles() { } + + commands.add("\""+API_URL+"%20"+LOGIN+"%20"+PASSWORD+"\""); + ProcessBuilder pb = new ProcessBuilder(commands); pb.redirectErrorStream(true); + for (String c : commands) { + if (logArea==null) { + System.out.print(c+" "); + } else { + logArea.append(c+" "); + } + if (sourceJob!=null) { + sourceJob.log(c); + } + } + if (logArea==null) { + System.out.println(""); + } else { + logArea.append("\n"); + } + + Process p; try { p = pb.start(); @@ -253,6 +293,9 @@ private void curlFiles() { } else { logArea.append(line+"\n"); } + if (sourceJob!=null) { + sourceJob.log(line); + } if (line.matches(".*accession=.*")) { Pattern aliasPat = Pattern.compile("alias=\"([^\"]+)\""); Matcher aliasMat = aliasPat.matcher(line); @@ -285,6 +328,9 @@ private void curlFiles() { } else { logArea.append("CURL program could not be found, please check paths.txt and check that curl is in the specified location and runs under your operating system."+"\n"); } + if (sourceJob!=null) { + sourceJob.log("CURL program could not be found, please check CURL path in upload config and check that curl is in the specified location and runs under your operating system."); + } } catch (InterruptedException e) { e.printStackTrace(); diff --git a/src/eu/europa/ecdc/enauploader/SubmissionWorker.java b/src/eu/europa/ecdc/enauploader/SubmissionWorker.java new file mode 100644 index 0000000..34892a9 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/SubmissionWorker.java @@ -0,0 +1,1180 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.Color; +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.UUID; +import java.util.zip.GZIPOutputStream; + +import javax.swing.JTable; +import javax.swing.JTextArea; +import javax.swing.SwingWorker; +import javax.xml.bind.DatatypeConverter; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.vfs2.FileObject; +import org.apache.commons.vfs2.FileSystemManager; +import org.apache.commons.vfs2.FileSystemOptions; +import org.apache.commons.vfs2.Selectors; +import org.apache.commons.vfs2.VFS; +import org.apache.commons.vfs2.impl.StandardFileSystemManager; +import org.apache.commons.vfs2.provider.sftp.SftpFileSystemConfigBuilder; + +import it.sauronsoftware.ftp4j.FTPClient; +import it.sauronsoftware.ftp4j.FTPException; + +public class SubmissionWorker extends SwingWorker { + + private String center; + private String projectId; + //private JTable table; + private File dataDir; + private String login; + private String pass; + private boolean prod; + private boolean anonymize; + private String delimiter; + private String enaChecklist; + private JTextArea logArea; + private String ftpHost; + private String curlPath; + private String tmpPath; + private boolean ftpExist; + private String[][] metadata; + private String[] header; + private OutputHandler outHandler; + private TessyBatch batch; + private boolean submitEna; + private boolean submitTessy; + private ENAuploaderGUI gui; + private boolean submitSftp; + private String sftpHost; + private String sftpLogin; + private String sftpPass; + + // String center, String projectId, JTable table, File dataDir,String login,String pass, boolean prod, boolean anonymize, String delimiter, String enaChecklist + SubmissionWorker (String cent, String proj, String[][] metad,String[] head, File dataD,String log,String p, boolean pr, boolean anon, boolean existFtp, String delim, String enaCheck, JTextArea logA, String tmpP, String curlP, String ftpH, OutputHandler outH, TessyBatch bat, String sftpH, String sftpL, String sftpP, boolean ftpB, boolean enaB, boolean tessyB, ENAuploaderGUI gu) { + + sftpHost = sftpH; + sftpLogin = sftpL; + sftpPass = sftpP; + submitSftp = ftpB; + submitEna = enaB; + submitTessy = tessyB; + batch = bat; + outHandler = outH; + center = cent; + projectId = proj; + //table = tab; + metadata = metad; + header = head; + dataDir = dataD; + login = log; + pass = p; + prod = pr; + anonymize = anon; + ftpExist = existFtp; + delimiter = delim; + enaChecklist = enaCheck; + logArea = logA; + ftpHost = ftpH; + curlPath = curlP; + tmpPath = tmpP; + gui = gu; + + } + + @Override + protected void done() { + if (gui != null) { + gui.save(); + } + } + + @Override + protected Object doInBackground() throws Exception { + + SimpleDateFormat timestamp = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + if (logArea!=null) { + logArea.append("Submission started...\n"); + } + + + + + + + + + + + if (submitEna) { + File[] dataFiles = dataDir.listFiles(); + + if (logArea!=null) { + logArea.append("Submitting to ENA: "+projectId+"\n"); + } else { + System.out.println("Submitting to ENA: "+projectId); + } + + + boolean notDone = true; + int i = -1; + while (notDone) { + + + i++; + int row = i; + + if (i>=metadata.length) { + break; + } + String id = metadata[i][0]; + + + String acc1 = metadata[i][header.length-8]; + if (logArea!=null) { + logArea.append(acc1+"\n"); + } else { + System.out.println(acc1); + } + String acc2 = metadata[i][header.length-9]; + String acc3 = metadata[i][header.length-10]; + if (id == null || id.equals("")) { + break; + } + if (!(acc1 == null || acc1.equals(""))) { + continue; + } + if (!(acc2 == null || acc3.equals(""))) { + continue; + } + if (!(acc2 == null || acc3.equals(""))) { + continue; + } + + UUID uuid = UUID.randomUUID(); + String randomUUIDString = uuid.toString(); + String sname = center+"_"+randomUUIDString; + + //Create new submission + Submission s = new Submission(center,"sub_"+sname); + s.setFtpExist(ftpExist); + s.setFtpHost(ftpHost); + s.setCurlPath(curlPath); + s.setTmpPath(tmpPath); + s.setlogArea(logArea); + + if (prod) { + s.useProductionServer(true); + } + if (!login.equals("") && !pass.equals("")) { + s.setLogin(login, pass); + } + + + + + + if (logArea!=null) { + logArea.append(id+"\n"); + } else { + System.out.println(id); + } + + String filePattern = metadata[i][header.length-12]; + String rUUIDString; + + + if (anonymize) { + rUUIDString = UUID.randomUUID().toString(); + + } else { + rUUIDString = id; + } + + + String instrument = metadata[i][header.length-14]; + String taxon = metadata[i][header.length-13]; + SampleWrapper wrap = new SampleWrapper(center,projectId, rUUIDString,s); + wrap.experiment.setInstrument(instrument); + wrap.sample.setTaxon(taxon); + wrap.sample.setAttribute("checklist",enaChecklist); + + + for (int k = 1;k 0) { + try { + System.out.println("Using FTP for files"); + + + + + client.connect(s.FTP_HOST); + + + + + client.login(s.LOGIN, s.PASSWORD); + + + String[] filesList = client.listNames(); + for(String f: filesList) { + + if (!f.matches(".*fastq.*") || f.matches(".*md5$")) { + continue; + } + boolean foundFile = false; + if (f.toLowerCase().startsWith(filePattern.toLowerCase()+delimiter)) { + System.out.println(f); + foundFile = true; + } + if (foundFile) { + if (logArea==null) { + System.out.println(id+"\tAdding file: "+f); + } else { + logArea.append(id+"\tAdding file: "+f+"\n"); + } + File ff = new File(f); + wrap.run.addFile(ff,ff); + foundFiles++; + File md5Local = new File(s.TMP_PATH+"/tmp.md5"); + + try { + client.download(f+".md5", md5Local); + String line; + BufferedReader br = new BufferedReader(new FileReader(md5Local)); + while ((line = br.readLine())!=null) { + if (!line.equals("")) { + wrap.run.setMd5Hex(ff.getName(),line.trim()); + } + } + br.close(); + } catch (FTPException fe) { + if (logArea==null) { + System.out.println("MD5-files must exist on the FTP when using pre-uploaded FTP data files. Aborting submission."); + } else { + logArea.append("MD5-files must exist on the FTP when using pre-uploaded FTP data files.\nAborting submission.\n"); + } + fe.printStackTrace(); + return null; + } catch (Exception e) { + wrap.run.setMd5Hex(ff.getName(),""); + e.printStackTrace(); + } + + } + } + client.disconnect(true); + failed = false; + } catch (FTPException fe) { + if (logArea==null) { + System.out.println("FTP error."); + } else { + logArea.append("FTP error."); + } + fe.printStackTrace(); + failed = true; + tries--; + System.out.println(tries); + Thread.sleep(5000); + } + } + } else { + for (File f : dataFiles) { + if (!f.getName().toLowerCase().matches(".*fastq.*")) { + continue; + } + + boolean foundFile = false; + + System.out.println(f.getName().toLowerCase()); + System.out.println(filePattern.toLowerCase()+delimiter); + if (f.getName().toLowerCase().startsWith(filePattern.toLowerCase()+delimiter)) { + foundFile = true; + } + + if (foundFile) {if (logArea!=null) { + logArea.append(id+"\tAdding file: "+f.getName()+"\n"); + } else { + System.out.println(id+"\tAdding file: "+f.getName()); + } + + + + FileInputStream fis = new FileInputStream(f); + String checksum = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis); + fis.close(); + wrap.run.addFile(f); + wrap.run.setMd5Hex(f.getName(), checksum); + foundFiles++; + } + } + } + + if (foundFiles==0) { + outHandler.write("No files found",i,header.length-1); + + if (logArea!=null) { + logArea.append("No files found\n"); + } else { + System.out.println("No files found\n"); + } + + continue; + } + + + + s.addEntry(wrap); + + + s.uploadFiles(); + + String sampleAcc = ""; + String experimentAcc = ""; + String runAcc = ""; + + if (s.submit()) { + sampleAcc = wrap.getSample().getAccession(); + experimentAcc = wrap.getExperiment().getAccession(); + runAcc = wrap.getRun().getAccession(); + if (sampleAcc.equals("")) { + if (logArea!=null) { + logArea.append("ERROR: Submission failed.\n"); + } else { + System.out.println("ERROR: Submission failed."); + } + } else { + + if (logArea!=null) { + logArea.append("Submission complete.\n"); + } else { + System.out.println("Submission complete."); + } + } + + } else { + + if (logArea!=null) { + logArea.append("ERROR: Submission failed. Aborting.\n"); + } else { + System.out.println("ERROR: Submission failed. Aborting."); + } + return null; + } + + + + + + + String fileStr = ""; + ArrayList origFiles = wrap.getRun().getOriginalFiles(); + for (File f : origFiles) { + if (!fileStr.equals("")) { + fileStr = fileStr + "|"; + } + fileStr = fileStr + f.getName(); + } + + String ts = timestamp.format(new Date()); + outHandler.write(fileStr,row,header.length-7); + outHandler.write(runAcc,row,header.length-8); + outHandler.write(experimentAcc,row,header.length-9); + outHandler.write(sampleAcc,row,header.length-10); + outHandler.write(rUUIDString,row,header.length-11); + outHandler.write(ts,row,1); + metadata[row][header.length-7] = fileStr; + metadata[row][header.length-8] = runAcc; + metadata[row][header.length-9] = experimentAcc; + metadata[row][header.length-10] = sampleAcc; + metadata[row][header.length-11] = rUUIDString; + metadata[row][1] = ts; + + + outHandler.close(); + if (gui != null) { + gui.save(); + } + + + } + + } + + if (submitTessy) { + boolean submit = true; + boolean notDone = true; + int i = -1; + ArrayList submittedRows = new ArrayList(); + + if (logArea!=null) { + logArea.append("Submitting to TESSy: "+batch.getCredentials().getHostname()+batch.getCredentials().getTarget()+"\n"); + } else { + System.out.println("Submitting to TESSy: "+batch.getCredentials().getHostname()+batch.getCredentials().getTarget()); + } + File[] dataFiles = dataDir.listFiles(); + while (notDone) { + + + i++; + int row = i; + + System.out.println(i); + if (i>=metadata.length) { + break; + } + + + String filePattern = metadata[i][header.length-12]; + String runAcc = metadata[i][header.length-8]; + + if (runAcc==null) { + runAcc = ""; + } + + String id = metadata[i][0]; + String tessyId = metadata[i][header.length-2]; + + System.out.println("TESSy: "+id+" "+runAcc+" TESSy id: "+tessyId); + if (tessyId != null && !tessyId.equals("")) { + String val1 = metadata[i][header.length-4]; + String val2 = metadata[i][1]; + try { + if (val1!=null && val2!=null) { + Date d1 = timestamp.parse(val1); + Date d2 = timestamp.parse(val2); + if (d2.after(d1)) { + String val1b = metadata[i][header.length-3]; + Date d1b = timestamp.parse(val1b); + if (d1.after(d1b)) { + continue; + } + } else { + continue; + } + } + } catch (Exception e) { + continue; + } + } + + submittedRows.add(row); + + HashMap metaD = new HashMap(); + for (int k = 1;k "+metaD.get(k)); + } + + if (!metaD.containsKey("DateUsedForStatistics") || !metaD.get("DateUsedForStatistics").matches("[0-9][0-9][0-9][0-9][-][0-9][0-9][-][0-9][0-9]")) { + outHandler.write("DateUsedForStatistics Missing/Misformatted",row,header.length-5); + + submit = false; + continue; + } + if (!metaD.containsKey("ReportingCountry") || metaD.get("ReportingCountry").equals("")) { + outHandler.write("ReportingCountry Missing",row,header.length-5); + submit = false; + continue; + } + + String countryFull = metaD.get("ReportingCountry"); + String country = countryToCode(countryFull); + //metaD.put("ReportingCountry", country); + + + + TessyIsolate obc = new TessyIsolate(id,metaD.get("DateUsedForStatistics"),country); + metaD.remove("DateUsedForStatistics"); + metaD.remove("ReportingCountry"); + for (String key: metaD.keySet()) { + obc.setField(key, metaD.get(key)); + } + + if (metaD.containsKey("WgsAssembler") && !metaD.get("WgsAssembler").equals("")) { + + + for (File f : dataFiles) { + if (!f.getName().toLowerCase().matches(".*fasta.*")) { + continue; + } + + if (f.getName().toLowerCase().startsWith(filePattern.toLowerCase()+delimiter)) { + + File f2 = f; + if (!f.getName().endsWith(".gz")) { + f2 = new File(f.toString()+".gz"); + compressGzipFile(f,f2); + } + + byte[] fileContents = Files.readAllBytes(f2.toPath()); + + String assemblyBase64String = DatatypeConverter.printBase64Binary(fileContents); + obc.setField("WgsAssembly", assemblyBase64String); + obc.setField("WgsProtocol",prot); + + if (logArea!=null) { + logArea.append(id+"\tAdding assembly file: "+f.getName()+"\n"); + } else { + System.out.println(id+"\tAdding assembly file: "+f.getName()); + } + break; + } + } + + + } + + if (logArea!=null) { + logArea.append("Adding to batch "+batch.getBatchId()+": "+id+"\n"); + } else { + System.out.println("Submitting to TESSy: "+batch.getCredentials().getHostname()+batch.getCredentials().getTarget()); + } + + batch.addIsolate(obc); + + + } + + System.out.println("SUBMIT: "+Boolean.toString(submit)); + if (!submit) { + if (logArea!=null) { + logArea.append("There are pre-validation errors, aborting.\n"); + } else { + System.out.println("There are pre-validation errors, aborting."); + } + if (gui!=null) { + gui.save(); + } + return null; + } + + if (logArea!=null) { + logArea.append("Getting unused batch Id\n"); + } else { + System.out.println("Getting unused batch Id"); + } + batch.setId(getBatchid()); + + + + if (logArea!=null) { + logArea.append("Testing batch: "+batch.getBatchId()+"\n"); + } else { + System.out.println("Testing batch: "+batch.getBatchId()); + } + HashMap res = batch.test(); + + + for (String k : res.keySet()) { + String val = ""; + int num = -1; + for (int ii = 0;ii=0) { + + val = val.replace(",",""); + outHandler.write(val,num,header.length-5); + } else { + if (logArea!=null) { + logArea.append(val+"\n"); + } else { + System.out.println(val); + } + } + } + for (String k : res.keySet()) { + TessyValidationResult r = res.get(k); + if (!r.pass()) { + System.out.println("There are errors, quitting."); + if (logArea!=null) { + logArea.append("There are errors in batch : "+batch.getBatchId()+", aborting\n"); + } else { + System.out.println("There are errors in batch : "+batch.getBatchId()+", aborting"); + } + if (gui!=null) { + gui.save(); + } + return null; + } + } + + for (int srow : submittedRows) { + outHandler.write(batch.getBatchId(),srow,header.length-6); + } + if (gui != null) { + gui.save(); + } + boolean uploaded = batch.upload(); + if (!uploaded) { + if (logArea!=null) { + logArea.append("TESSy upload failed, aborting"+"\n"); + } else { + System.out.println("TESSy upload failed, aborting"); + } + for (int srow : submittedRows) { + outHandler.write("",srow,header.length-6); + } + if (gui != null) { + gui.save(); + } + + return null; + } + + + + + + boolean done = false; + while (!done) { + + + done = batch.checkValidation(); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + + e.printStackTrace(); + } + } + + System.out.println("Validation results available."); + + + + + res = batch.getValidation(); + for (String k : res.keySet()) { + TessyValidationResult r = res.get(k); + System.out.println(k); + String guid = r.getGuid(); + System.out.println(guid); + System.out.print(r.getErrorNum()); + System.out.print("\t"); + System.out.print(r.getWarningNum()); + System.out.print("\t"); + System.out.print(r.getRemarkNum()); + System.out.println(""); + if (!r.pass()) { + System.out.println("There are errors, quitting."); + return null; + } + } + + System.out.println("Validation OK, ready for approval."); + + String ts = timestamp.format(new Date()); + for (String k : res.keySet()) { + TessyValidationResult r = res.get(k); + int num = -1; + for (int ii = 0;ii=metadata.length) { + break; + } + String uid = metadata[i][header.length-1]; + if (uid!=null && !uid.equals("") && !uid.equals("no files found") && !uid.equals("no TESSy id found") && !uid.equals("upload error")) { + continue; + } + String id = metadata[i][0]; + String filebase = metadata[i][header.length-12]; + ArrayList uploadFiles = new ArrayList(); + for (File f : dataFiles) { + if (f.getName().startsWith(filebase+delimiter)) { + uploadFiles.add(f); + } + } + if (uploadFiles.isEmpty()) { + outHandler.write("no files found",i,header.length-1); + continue; + } + + String ftpUUIDString = metadata[i][header.length-2]; + + if (ftpUUIDString==null || ftpUUIDString.equals("")) { + outHandler.write("no TESSy id found",i,header.length-1); + continue; + } + + int ii = 0; + FILE: for (File f : uploadFiles) { + ii++; + String newName = ftpUUIDString; + if (uploadFiles.size()>1) { + newName = newName + ".R"+Integer.toString(ii); + } + if (f.getName().toLowerCase().matches(".*fastq.*")) { + newName = newName+".fastq"; + } else if (f.getName().toLowerCase().matches(".*fasta.*")) { + newName = newName+".fasta"; + } + + if (f.getName().endsWith("gz")) { + newName = newName+".gz"; + } + + long filesizeLocal = f.length(); + FileInputStream fis = new FileInputStream(f); + String checksum = org.apache.commons.codec.digest.DigestUtils.md5Hex(fis); + fis.close(); + String md5File = tmpPath+"/"+newName+".md5"; + BufferedWriter bw = new BufferedWriter(new FileWriter(md5File)); + bw.write(checksum); + bw.close(); + + //StandardFileSystemManager manager = new StandardFileSystemManager(); + FileSystemManager fsManager; + try { + + FileSystemOptions fsOptions = new FileSystemOptions(); + SftpFileSystemConfigBuilder.getInstance().setStrictHostKeyChecking(fsOptions, "no"); + SftpFileSystemConfigBuilder.getInstance().setTimeout(fsOptions, 30000); + fsManager = VFS.getManager(); + + + String uri = "sftp://"+sftpLogin+":"+sftpPass+"@"+sftpHost+":22/autoupload/"+newName; + String uriMd5 = "sftp://"+sftpLogin+":"+sftpPass+"@"+sftpHost+":22/autoupload/"+(new File(md5File)).getName(); + FileObject localFile = fsManager.resolveFile(f.getAbsolutePath()); + FileObject fo = fsManager.resolveFile(uri, fsOptions); + + if (logArea!=null) { + logArea.append("Uploading to SFTP: "+localFile.toString()+"\n"); + } else { + System.out.println("Uploading to SFTP: "+localFile.toString()); + } + + fo.copyFrom(localFile, Selectors.SELECT_SELF); + + FileObject localFileMd5 = fsManager.resolveFile(md5File); + FileObject foMd5 = fsManager.resolveFile(uriMd5, fsOptions); + foMd5.copyFrom(localFileMd5, Selectors.SELECT_SELF); + + long filesizeUploaded = fo.getContent().getSize(); + if (filesizeUploaded != filesizeLocal) { + outHandler.write("upload error",i,header.length-1); + break FILE; + } + if (!foMd5.exists()) { + outHandler.write("upload error",i,header.length-1); + break FILE; + } + + + } catch (Exception e) { + e.printStackTrace(); + outHandler.write("upload error",i,header.length-1); + break FILE; + + } + + + + } + + String ts = timestamp.format(new Date()); + outHandler.write(ts,i,header.length-1); + metadata[i][header.length-1] = ts; + + } + + + } + + + + + + return null; + } + + private String getWgsProtocol(String instrument) { + instrument = instrument.toLowerCase(); + System.out.println(instrument); + + if (instrument.startsWith("illumina hiseq") || instrument.startsWith("hiseq")) { + return "HISEQ_2x100"; + } else if (instrument.startsWith("illumina miseq") || instrument.startsWith("miseq")) { + return "MISEQ_2x250"; + } else if (instrument.startsWith("illumina nextseq") || instrument.startsWith("nextseq")) { + return "NEXTSEQ_2x150"; + } else if (instrument.startsWith("illumina novaseq") || instrument.startsWith("novaseq")) { + return "NEXTSEQ_2x150"; + } else if (instrument.startsWith("ion")) { + return "IONTORRENT"; + } else { + return "ERROR"; + } + } + + private String codeToCountry(String countryCode) { + if (countryCode.length()>2) { + return countryCode; + } + countryCode = countryCode.toUpperCase(); + switch (countryCode) { + case "SE": + return "Sweden"; + case "FI": + return "Finland"; + case "DK": + return "Denmark"; + case "AT": + return "Austria"; + case "FR": + return "France"; + case "UK": + return "United Kingdom"; + case "NL": + return "The Netherlands"; + case "ES": + return "Spain"; + case "IT": + return "Italy"; + case "PL": + return "Poland"; + case "IE": + return "Ireland"; + case "IS": + return "Iceland"; + case "EL": + return "Greece"; + case "NO": + return "Norway"; + case "PT": + return "Portugal"; + case "SI": + return "Switzerland"; + case "DE": + return "Germany"; + case "CZ": + return "Czech republic"; + case "BG": + return "Bulgaria"; + case "LU": + return "Luxembourg"; + case "BE": + return "Belgium"; + case "HU": + return "Hungary"; + case "EE": + return "Estonia"; + case "LT": + return "Lithuania"; + case "LV": + return "Latvia"; + case "HR": + return "Croatia"; + case "MT": + return "Malta"; + case "CY": + return "Cyprus"; + case "RO": + return "Romania"; + case "SK": + return "Slovakia"; + + + + + default: + return ""; + } + + } + + private String countryToCode(String countryFull) { + if (countryFull.length()==2) { + return countryFull; + } + countryFull = countryFull.toLowerCase(); + switch (countryFull) { + case "sweden": + return "SE"; + case "finland": + return "FI"; + case "denmark": + return "DK"; + case "austria": + return "AT"; + case "france": + return "FR"; + case "united kingdom": + return "UK"; + case "scotland": + return "UK"; + case "england": + return "UK"; + case "wales": + return "UK"; + case "the netherlands": + return "NL"; + case "netherlands": + return "NL"; + case "spain": + return "ES"; + case "italy": + return "IT"; + case "poland": + return "PL"; + case "ireland": + return "IE"; + case "iceland": + return "IS"; + case "greece": + return "EL"; + case "norway": + return "NO"; + case "portugal": + return "PT"; + case "switzerland": + return "SI"; + case "germany": + return "DE"; + case "czech republic": + return "CZ"; + case "bulgaria": + return "BG"; + case "luxembourg": + return "LU"; + case "belgium": + return "BE"; + case "hungary": + return "HU"; + case "estonia": + return "EE"; + case "lithuania": + return "LT"; + case "latvia": + return "LV"; + case "croatia": + return "HR"; + case "malta": + return "MT"; + case "cyprus": + return "CY"; + case "romania": + return "RO"; + case "slovakia": + return "SK"; + + + + + default: + return ""; + } + + } + + private String getBatchid() { + + + + TessyIsolate iso = new TessyIsolate("","",""); + iso.setCredentials(batch.getCredentials()); + ArrayList content = new ArrayList(); + content.add(""); + String response = iso.submitXml(content); + String[] lines = response.split("\n",-1); + for (String l : lines) { + if (l.matches(".*.*")) { + String batchStr = l.replaceAll(".*","").replaceAll(".*",""); + int batchnum = Integer.parseInt(batchStr); + batchnum++; + batchStr = Integer.toString(batchnum); + return batchStr; + } + } + return ""; + + + } + + private void compressGzipFile(File file, File gzipFile) { + try { + FileInputStream fis = new FileInputStream(file); + FileOutputStream fos = new FileOutputStream(gzipFile); + GZIPOutputStream gzipOS = new GZIPOutputStream(fos); + byte[] buffer = new byte[1024]; + int len; + while((len=fis.read(buffer)) != -1){ + gzipOS.write(buffer, 0, len); + } + //close resources + gzipOS.close(); + fos.close(); + fis.close(); + } catch (IOException e) { + e.printStackTrace(); + } + + } + +} diff --git a/src/eu/europa/ecdc/enauploader/TessyBatch.java b/src/eu/europa/ecdc/enauploader/TessyBatch.java new file mode 100644 index 0000000..4b44388 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/TessyBatch.java @@ -0,0 +1,726 @@ +package eu.europa.ecdc.enauploader; + +import java.io.Serializable; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; + +import org.apache.commons.codec.binary.Base64; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.NTCredentials; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.AuthSchemes; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.TrustStrategy; +import org.apache.http.util.EntityUtils; + +import eu.europa.ecdc.enauploader.TessyIsolate.DefaultTrustManager; + +public class TessyBatch implements Serializable { + + + private static final long serialVersionUID = 1658151869052753489L; + ArrayList isolates; + private static final int TEST = 1; + private static final int UPLOAD = 2; + private static final int CHECK_VALIDATION = 3; + private static final int VALIDATION = 4; + private static final int APPROVE = 5; + private static final int REJECT = 6; + + private String reportingCountry; + private String contact; + private String version; + private String subject; + private String dataSource; + private String batchId; + private TessyCredentials tessyCredentials; + private boolean haltWarn; + private boolean haltRemark; + private String state; + private HashMap validation; + private String lastResultString; + private String lastMessageString; + + + public void setValidationResults(HashMap validation) { + this.validation = validation; + } + + public HashMap getValidationResults() { + return validation; + } + + public static void main(String[] args) { + + TessyCredentials cred = new TessyCredentials(); + cred.setUsername("Provider_PT"); + char[] pwd = {'T','e','s','t','0','0','0','1'}; + cred.setPassword(pwd); + cred.setDomain("idmdevdmz"); + cred.setHostname("tessy.idmdevdmz.local"); + cred.setTarget("/TessyTESTWebService/TessyUpload.asmx"); + + + + + TessyIsolate obc = new TessyIsolate("Test0028","2018-02-13","PT"); + obc.setField("Gender", "F"); + obc.setField("Age", "56"); + obc.setField("Imported", "N"); + obc.setField("DateOfSampling", "2018-02-13"); + obc.setField("DateOfReceiptReferenceLab", "2018-02-16"); + + TessyIsolate obc2 = new TessyIsolate("Test0029","2018-02-03","PT"); + obc2.setField("Gender", "M"); + obc2.setField("Age", "71"); + obc2.setField("Imported", "Y"); + obc2.setField("DateOfSampling", "2018-02-03"); + obc2.setField("DateOfReceiptReferenceLab", "2018-02-07"); + + TessyBatch bat = new TessyBatch("124","PT","Erik Alm","PT-MOLSURV","3","SALMISO"); + bat.setTessyCredentials(cred); + bat.addIsolate(obc); + bat.addIsolate(obc2); + + HashMap res = bat.test(); + + for (String k : res.keySet()) { + TessyValidationResult r = res.get(k); + System.out.println(k); + System.out.print(r.getErrorNum()); + System.out.print("\t"); + System.out.print(r.getWarningNum()); + System.out.print("\t"); + System.out.print(r.getRemarkNum()); + System.out.println(""); + for (String e : r.getErrors()) { + System.out.println(e); + } + for (String e : r.getWarnings()) { + System.out.println(e); + } + for (String e : r.getRemarks()) { + System.out.println(e); + } + } + for (String k : res.keySet()) { + TessyValidationResult r = res.get(k); + if (!r.pass()) { + System.out.println("There are errors, quitting."); + return; + } + } + + boolean uploaded = bat.upload(); + if (!uploaded) { + System.out.println("Upload failed, aborting."); + return; + } + + boolean done = false; + while (!done) { + + + done = bat.checkValidation(); + + try { + Thread.sleep(5000); + } catch (InterruptedException e) { + + e.printStackTrace(); + } + } + + System.out.println("Validation results available."); + + res = bat.getValidation(); + for (String k : res.keySet()) { + TessyValidationResult r = res.get(k); + System.out.println(k); + String guid = r.getGuid(); + System.out.println(guid); + System.out.print(r.getErrorNum()); + System.out.print("\t"); + System.out.print(r.getWarningNum()); + System.out.print("\t"); + System.out.print(r.getRemarkNum()); + System.out.println(""); + if (!r.pass()) { + System.out.println("There are errors, quitting."); + return; + } + } + + System.out.println("Validation OK, ready for approval."); + + + + + + boolean approved = bat.approve(); + + + if (!approved) { + System.out.println("Approval failed, rejecting batch..."); + bat.reject(); + } + + System.out.println("Approval ok. Finished.\n"); + + } + + + + + + + + TessyBatch(String bId,String country,String cont, String dataSou, String ver, String subj) { + batchId = bId; + contact = cont; + reportingCountry = country; + dataSource = dataSou; + version = ver; + subject = subj; + isolates = new ArrayList(); + haltRemark = false; + haltWarn = false; + } + + public String getState() { + return state; + } + + public void setId(String id) { + batchId = id; + } + + public void addIsolate(TessyIsolate iso) { + isolates.add(iso); + } + + public void setTessyCredentials(TessyCredentials c) { + tessyCredentials = c; + } + + public HashMap test() { + + ArrayList xml = generateXml(TEST); + + String resultString = submitXml(xml); + + if (resultString==null) { + return null; + } + + HashMap results = parseValidationString(resultString); + state = "TESTED"; + setValidationResults(results); + return results; + } + + public void reject() { + ArrayList xml = generateXml(REJECT); + submitXml(xml); + state = "REJECTED"; + + + } + + + public boolean approve() { + boolean approved = false; + ArrayList xml = generateXml(APPROVE); + String resultString = submitXml(xml); + //System.out.println(resultString); + + String[] rows = resultString.split("\n",-1); + + + for (String l : rows) { + + if (l.matches(".*.*")) { + approved = true; + state = "APPROVED"; + } + } + + return approved; + } + + public boolean upload() { + + boolean success = false; + ArrayList xml = generateXml(UPLOAD); + String resultString = submitXml(xml); + + String[] rows = resultString.split("\n",-1); + + + for (String l : rows) { + if (l.matches(".*.*")) { + success = true; + } + } + state = "UPLOADED"; + return success; + } + + public HashMap getValidation() { + + ArrayList xml = generateXml(VALIDATION); + String resultString = submitXml(xml); + System.out.println(resultString); + if (resultString==null) { + return null; + } + + HashMap results = parseValidationString(resultString); + state = "VALIDATED"; + setValidationResults(results); + return results; + } + + public boolean checkValidation() { + ArrayList xml = generateXml(CHECK_VALIDATION); + String resultString = submitXml(xml); + //System.out.println(resultString); + return parseValidationAvailable(resultString); + } + + + private HashMap parseValidationString(String resultString) { + HashMap results = new HashMap(); + + for (TessyIsolate iso : isolates) { + TessyValidationResult res = new TessyValidationResult(""); + results.put(iso.getRecordId(), res); + } + TessyValidationResult res2 = new TessyValidationResult(""); + results.put("GENERAL", res2); + + String[] rows = resultString.split("\n"); + boolean header = false; + boolean validationResult = false; + String type = ""; + String message = ""; + String isolate = "GENERAL"; + + Pattern pat = Pattern.compile(".*(.*).*"); + Pattern pat2 = Pattern.compile(".*(.*).*"); + + int errors = 0; + int warnings = 0; + int remarks = 0; + + for (String l : rows) { + + Matcher mat = pat.matcher(l); + if (mat.find()) { + String guid = mat.group(1); + results.get(isolate).setGuid(guid); + } + + if (l.matches(".*.*")) { + header = false; + } + Matcher mat2 = pat2.matcher(l); + if (mat2.find()) { + isolate = mat2.group(1); + } + + if (header) { + String[] res = parseField(l); + switch (res[0]) { + case "noErrors": + errors = Integer.parseInt(res[1]); + break; + case "noWarnings": + warnings = Integer.parseInt(res[1]); + break; + case "noRemarks": + remarks = Integer.parseInt(res[1]); + break; + default: + } + } + + if (l.matches(".*.*")) { + message = message.replace("&apos;",""); + switch (type) { + case "remark": + results.get(isolate).addRemark(message); + break; + case "warning": + results.get(isolate).addWarning(message); + break; + case "error": + results.get(isolate).addError(message); + break; + + default: + } + + validationResult = false; + } + + + if (validationResult) { + String[] res = parseField(l); + switch (res[0]) { + case "type": + type = res[1]; + break; + case "message": + message = res[1]; + break; + default: + } + } + + + if (l.matches(".*.*")) { + validationResult = true; + type = ""; + message = ""; + } + + if (l.matches(".*
.*")) { + header = true; + } + + + } + if (errors==0 && (warnings==0 || !haltWarn) && (remarks==0 || !haltRemark)) { + for (String k : results.keySet()) { + results.get(k).setPass(true); + System.out.println("Set pass."); + } + } + + + return results; + } + + public boolean passedValidation() { + return passedValidation(null); + } + + public boolean passedValidation(EcdcJob job) { + for (String k : validation.keySet()) { + TessyValidationResult val = validation.get(k); + int errors = val.getErrorNum(); + int warnings = val.getWarningNum(); + int remarks = val.getRemarkNum(); + + if ((errors==0) && (warnings==0 || !haltWarn) && (remarks==0 || !haltRemark)) { + if (job!=null) { + job.log("Batch validation OK"); + } + } else { + if (job!=null) { + job.log("Batch validation not OK"); + job.log("Halt on warnings: "+Boolean.toString(haltWarn)); + job.log("Halt on remarks: "+Boolean.toString(haltRemark)); + job.log("Entry (GENERAL means overall issues with the batch): "+k); + job.log("Errors: "+Integer.toString(errors)); + for (String e : val.getErrors()) { + job.log(e); + } + job.log("Warnings: "+Integer.toString(warnings)); + for (String e : val.getWarnings()) { + job.log(e); + } + job.log("Remarks: "+Integer.toString(remarks)); + for (String e : val.getRemarks()) { + job.log(e); + } + } + + + return false; + } + } + + + return true; + } + + private ArrayList generateXml(int action) { + + + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss"); + String dateStr = sdf.format(new Date())+"T"+sdf2.format(new Date()); + + ArrayList xml1 = new ArrayList(); + ArrayList xml = new ArrayList(); + + switch (action) { + case TEST: + xml1.add(""); + break; + case UPLOAD: + xml1.add(""+batchId+""); + break; + case CHECK_VALIDATION: + xml1.add(""+batchId+""); + break; + case VALIDATION: + xml1.add(""+batchId+""); + break; + case APPROVE: + xml1.add(""+batchId+""); + break; + case REJECT: + xml1.add(""+batchId+""); + break; + default: + + } + + xml.add("\n
"); + xml.add(""+dateStr+""); + xml.add(""+contact+""); + xml.add("
\n\n"); + + xml.add(""+subject+""); + xml.add(""+version+""); + xml.add(""+subject+""); + xml.add("update"); + + xml.add(""+dataSource+""); + xml.add(""); + + + + for (TessyIsolate iso : isolates) { + xml.addAll(iso.generateIsolateXml()); + } + + + xml.add("\n\n\n
"); + + + + //COMPILE xml + StringBuilder sb = new StringBuilder(); + + for (String s : xml) + { + System.out.println(s); + sb.append(s); + } + + String testData = sb.toString(); + testData.replaceAll("\n",""); + byte[] encodedBytes = Base64.encodeBase64(testData.getBytes()); + testData = new String(encodedBytes); + + + switch (action) { + case TEST: + xml1.add(testData); + xml1.add("
"); + break; + case UPLOAD: + xml1.add(testData); + xml1.add(""); + break; + case CHECK_VALIDATION: + xml1.add(""); + break; + case VALIDATION: + xml1.add(""); + break; + case APPROVE: + xml1.add(""); + break; + case REJECT: + xml1.add(""); + break; + default: + + } + + + + return xml1; + } + + private String submitXml (ArrayList contentArray) { + + StringBuilder sb = new StringBuilder(); + for (String s : contentArray) + { + sb.append(s); + sb.append("\n"); + } + String content = sb.toString(); + + lastMessageString = content; + + try { + + SSLContextBuilder builder = new SSLContextBuilder(); + /*builder.loadTrustMaterial(null, new TrustStrategy(){ + public boolean isTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + return true; + }}); +*/ + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + builder.build()); + + SSLContext ctx = SSLContext.getInstance("TLS"); + + + ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); + SSLContext.setDefault(ctx); + + + + RequestConfig requestConfig = RequestConfig.custom() + .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM)) + .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)) + .build(); + + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new NTCredentials(tessyCredentials.getUsername(), new String(tessyCredentials.getPassword()), "", tessyCredentials.getDomain())); + + HttpClient httpclient = HttpClients.custom() + .setDefaultCredentialsProvider(credentialsProvider) + .setDefaultRequestConfig(requestConfig) + .setSSLSocketFactory(sslsf).build(); + + + HttpHost target = new HttpHost(tessyCredentials.getHostname(), 443, "https"); + HttpPost httppost = new HttpPost(tessyCredentials.getTarget()); + + + httppost.setHeader("Content-type", "application/soap+xml"); + + + String soapBody = ""+content+""; + StringEntity strEntity = new StringEntity(soapBody, "UTF-8"); + httppost.setEntity(strEntity); + + + HttpResponse r = httpclient.execute(target, httppost); + HttpEntity e = r.getEntity(); + String responseString = EntityUtils.toString(e, "UTF-8").replace(">",">").replace("<","<"); + lastResultString = responseString; + return responseString; + + + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("Returning null result"); + lastResultString = null; + return null; + } + + private String[] parseField(String l) { + + String[] res = new String[2]; + res[0] = "";res[1] = ""; + Pattern pat = Pattern.compile("<(.*)>(.*)<(.*)>"); + Matcher mat = pat.matcher(l); + if (mat.find()) { + + res[0] = mat.group(1); + res[1] = mat.group(2); + } + + + return res; + } + + private boolean parseValidationAvailable(String resultString) { + + String[] rows = resultString.split("\n",-1); + for (String l : rows) { + if (l.matches(".*true.*")) { + return true; + } + } + + + return false; + } + + + + + + + + public String getBatchId() { + return batchId; + } + + + + + + + + public TessyCredentials getCredentials() { + return tessyCredentials; + } + + + + + + + + public void setHaltWarn(boolean haltWarn) { + this.haltWarn = haltWarn; + + } + + + + + + + + public void setHaltRemark(boolean haltRemark) { + this.haltRemark = haltRemark; + + } + + public String getLastResponse() { + return lastResultString; + } + + public String getLastMessage() { + return lastMessageString; + } +} diff --git a/src/eu/europa/ecdc/enauploader/TessyCredentials.java b/src/eu/europa/ecdc/enauploader/TessyCredentials.java new file mode 100644 index 0000000..b64ce15 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/TessyCredentials.java @@ -0,0 +1,58 @@ +package eu.europa.ecdc.enauploader; + +import java.io.Serializable; + + +public class TessyCredentials implements Serializable { + + + private static final long serialVersionUID = -5824802763806173512L; + private String username=""; + private char[] password=new char[0]; + private String domain=""; + private String hostname=""; + private String target=""; + + TessyCredentials () { + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public char[] getPassword() { + return password; + } + + public void setPassword(char[] cs) { + this.password = cs; + } + + public String getDomain() { + return domain; + } + + public void setDomain(String domain) { + this.domain = domain; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public String getTarget() { + return target; + } + + public void setTarget(String target) { + this.target = target; + } +} diff --git a/src/eu/europa/ecdc/enauploader/TessyIsolate.java b/src/eu/europa/ecdc/enauploader/TessyIsolate.java new file mode 100644 index 0000000..0a494db --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/TessyIsolate.java @@ -0,0 +1,426 @@ +package eu.europa.ecdc.enauploader; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.Serializable; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.commons.codec.binary.Base64; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.NTCredentials; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.AuthSchemes; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.ssl.SSLContexts; +import org.apache.http.ssl.TrustStrategy; +import org.apache.http.util.EntityUtils; + +import eu.europa.ecdc.enauploader.TessyUploader.DefaultTrustManager; + +public class TessyIsolate implements Serializable { + + + private static final int TEST = 1; + private static final int UPLOAD = 2; + private static final int CHECK_VALIDATION = 3; + private static final int VALIDATION = 4; + private static final int APPROVE = 5; + private static final int REJECT = 6; + private String recordId; + private String reportingCountry; + private String dateUsedForStatistics; + + private String contact; + private String version; + private String subject; + private String dataSource; + private HashMap fields; + private String batchId; + + private TessyCredentials tessyCredentials; + + + + TessyIsolate(String id, String dateUsed, String country) { + recordId = id; + dateUsedForStatistics = dateUsed; + reportingCountry = country; + fields = new HashMap(); + } + + + + + + public void setBatchId(String id) { + batchId = id; + } + + public void setField(String key, String value) { + fields.put(key, value); + } + + public void removeField(String key) { + fields.remove(key); + } + + public String getRecordId() { + return recordId; + } + + + public TessyValidationResult getValidation() { + ArrayList xml = generateXml(VALIDATION); + String resultString = submitXml(xml); + //System.out.println(resultString); + TessyValidationResult result = new TessyValidationResult(resultString); + return result; + } + + public TessyValidationResult test() { + + ArrayList xml = generateXml(TEST); + String resultString = submitXml(xml); + //System.out.println(resultString); + TessyValidationResult result = new TessyValidationResult(resultString); + return result; + } + + public void reject() { + ArrayList xml = generateXml(REJECT); + submitXml(xml); + } + + public boolean approve() { + boolean approved = false; + ArrayList xml = generateXml(APPROVE); + String resultString = submitXml(xml); + //System.out.println(resultString); + + String[] rows = resultString.split("\n",-1); + + + for (String l : rows) { + + if (l.matches(".*.*")) { + approved = true; + } + } + + return approved; + } + + public boolean upload() { + + boolean success = false; + ArrayList xml = generateXml(UPLOAD); + String resultString = submitXml(xml); + //System.out.println(resultString); + + String[] rows = resultString.split("\n",-1); + + + for (String l : rows) { + if (l.matches(".*.*")) { + success = true; + } + } + + + return success; + } + + public boolean checkValidation() { + ArrayList xml = generateXml(CHECK_VALIDATION); + String resultString = submitXml(xml); + //System.out.println(resultString); + return parseValidationAvailable(resultString); + } + + + private boolean parseValidationAvailable(String resultString) { + + String[] rows = resultString.split("\n",-1); + for (String l : rows) { + if (l.matches(".*true.*")) { + return true; + } + } + + + return false; + } + + + public ArrayList generateIsolateXml() { + + ArrayList xml = new ArrayList(); + + xml.add(""); + + xml.add(""+recordId+""); + xml.add(""+reportingCountry+""); + xml.add("new/update"); + xml.add(""+dateUsedForStatistics+""); + for (String k : fields.keySet()) { + String val = fields.get(k); + xml.add(""); + xml.add(""+k+""); + xml.add(""+val+""); + xml.add(""); + } + xml.add(""); + + return xml; + } + + + private ArrayList generateXml(int action) { + + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm:ss"); + String dateStr = sdf.format(new Date())+"T"+sdf2.format(new Date()); + + ArrayList xml1 = new ArrayList(); + ArrayList xml = new ArrayList(); + + switch (action) { + case TEST: + xml1.add(""); + break; + case UPLOAD: + xml1.add(""+batchId+""); + break; + case CHECK_VALIDATION: + xml1.add(""+batchId+""); + break; + case VALIDATION: + xml1.add(""+batchId+""); + break; + case APPROVE: + xml1.add(""+batchId+""); + break; + case REJECT: + xml1.add(""+batchId+""); + break; + default: + + } + + xml.add("\n
"); + xml.add(""+dateStr+""); + xml.add(""+contact+""); + xml.add("
\n\n"); + + xml.add(""+subject+""); + xml.add(""+version+""); + xml.add(""+subject+""); + xml.add("update"); + + xml.add(""+dataSource+""); + xml.add(""); + + + + xml.add(""); + + xml.add(""+recordId+""); + xml.add(""+reportingCountry+""); + xml.add("new/update"); + xml.add(""+dateUsedForStatistics+""); + for (String k : fields.keySet()) { + String val = fields.get(k); + xml.add(""); + xml.add(""+k+""); + xml.add(""+val+""); + xml.add(""); + } + xml.add(""); + + + xml.add("\n\n\n
"); + + + + //COMPILE xml + StringBuilder sb = new StringBuilder(); + for (String s : xml) + { + sb.append(s); + //sb.append("\n"); + } + String testData = sb.toString(); + testData.replaceAll("\n",""); + byte[] encodedBytes = Base64.encodeBase64(testData.getBytes()); + testData = new String(encodedBytes); + + + switch (action) { + case TEST: + xml1.add(testData); + xml1.add("
"); + break; + case UPLOAD: + xml1.add(testData); + xml1.add(""); + break; + case CHECK_VALIDATION: + xml1.add(""); + break; + case VALIDATION: + xml1.add(""); + break; + case APPROVE: + xml1.add(""); + break; + case REJECT: + xml1.add(""); + break; + default: + + } + + + + return xml1; + } + + public String submitXml (ArrayList contentArray) { + + StringBuilder sb = new StringBuilder(); + for (String s : contentArray) + { + sb.append(s); + sb.append("\n"); + } + String content = sb.toString(); + System.out.println(content); + + + try { + + + + SSLContextBuilder builder = new SSLContextBuilder(); + builder.loadTrustMaterial(null, new TrustStrategy(){ + public boolean isTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + return true; + }}); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + builder.build()); + + SSLContext ctx = SSLContext.getInstance("TLS"); + + + ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); + SSLContext.setDefault(ctx); + + + + RequestConfig requestConfig = RequestConfig.custom() + .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM)) + .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)) + .build(); + + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new NTCredentials(tessyCredentials.getUsername(), new String(tessyCredentials.getPassword()), "", tessyCredentials.getDomain())); + + HttpClient httpclient = HttpClients.custom() + .setDefaultCredentialsProvider(credentialsProvider) + .setDefaultRequestConfig(requestConfig) + .setSSLSocketFactory(sslsf).build(); + + + + + HttpHost target = new HttpHost(tessyCredentials.getHostname(), 443, "https"); + HttpPost httppost = new HttpPost(tessyCredentials.getTarget()); + + + httppost.setHeader("Content-type", "application/soap+xml"); + + + String soapBody = ""+content+""; + //String soapBody = ""+batchId+""; + //String soapBody = ""; + StringEntity strEntity = new StringEntity(soapBody, "UTF-8"); + httppost.setEntity(strEntity); + + System.out.println("TARGET: "+target); + System.out.println("POSTDATA: "+httppost); + HttpResponse r = httpclient.execute(target, httppost); + HttpEntity e = r.getEntity(); + String responseString = EntityUtils.toString(e, "UTF-8").replace(">",">").replace("<","<"); + return responseString; + + + } catch (Exception e) { + e.printStackTrace(); + } + System.out.println("Returning null result"); + return null; + } + + + public static class DefaultTrustManager implements X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} + + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + + + + } + + + public void setCredentials(TessyCredentials cred) { + tessyCredentials = cred; + + } + + + + + +} diff --git a/src/eu/europa/ecdc/enauploader/TessyUploader.java b/src/eu/europa/ecdc/enauploader/TessyUploader.java new file mode 100644 index 0000000..2ce07f1 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/TessyUploader.java @@ -0,0 +1,189 @@ +package eu.europa.ecdc.enauploader; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.Inet4Address; +import java.net.PasswordAuthentication; +import java.net.URL; +import java.net.URLConnection; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; + +import org.apache.commons.codec.binary.Base64; +import org.apache.http.HttpEntity; +import org.apache.http.HttpHost; +import org.apache.http.HttpResponse; +import org.apache.http.HttpStatus; +import org.apache.http.auth.AuthSchemeProvider; +import org.apache.http.auth.AuthScope; +import org.apache.http.auth.NTCredentials; +import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.auth.params.AuthPNames; +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.CredentialsProvider; +import org.apache.http.client.HttpClient; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.config.AuthSchemes; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.params.AuthPolicy; +import org.apache.http.client.protocol.ClientContext; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.auth.BasicSchemeFactory; +import org.apache.http.impl.auth.DigestSchemeFactory; +import org.apache.http.impl.auth.KerberosSchemeFactory; +import org.apache.http.impl.auth.SPNegoSchemeFactory; +import org.apache.http.impl.client.BasicCredentialsProvider; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; + +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContextBuilder; +import org.apache.http.util.EntityUtils; + +public class TessyUploader { + + + + + + + + + + + + + + + + public static void main(String[] args) { + + + try { + + SSLContextBuilder builder = new SSLContextBuilder(); + builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); + SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory( + builder.build()); + + SSLContext ctx = SSLContext.getInstance("TLS"); + + ctx.init(new KeyManager[0], new TrustManager[] {new DefaultTrustManager()}, new SecureRandom()); + SSLContext.setDefault(ctx); + + RequestConfig requestConfig = RequestConfig.custom() + .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM)) + .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC)) + .build(); + + CredentialsProvider credentialsProvider = new BasicCredentialsProvider(); + credentialsProvider.setCredentials(AuthScope.ANY, + new NTCredentials("Provider_PT", "Test0001", "", "idmdevdmz")); + + HttpClient httpclient = HttpClients.custom() + .setDefaultCredentialsProvider(credentialsProvider) + .setDefaultRequestConfig(requestConfig) + .setSSLSocketFactory(sslsf).build(); + + String batchId = "10"; + String testData = ""; + File testFile = new File("C:/users/ealm/desktop/LISTISOtest.xml"); + BufferedReader br = new BufferedReader(new FileReader(testFile)); + String line; + while ((line = br.readLine())!=null) { + testData = testData + line; + System.out.println(line); + } + byte[] encodedBytes = Base64.encodeBase64(testData.getBytes()); + testData = new String(encodedBytes); + + br.close(); + + HttpHost target = new HttpHost("tessy.idmdevdmz.local", 443, "https"); + HttpPost httppost = new HttpPost("/TessyTESTWebService/TessyUpload.asmx"); + + + httppost.setHeader("Content-type", "application/soap+xml"); + + String soapBody = ""+testData+""; + StringEntity strEntity = new StringEntity(soapBody, "UTF-8"); + httppost.setEntity(strEntity); + + + HttpResponse r = httpclient.execute(target, httppost); + HttpEntity e = r.getEntity(); + String responseString = EntityUtils.toString(e, "UTF-8").replace(">",">").replace("<","<"); + System.out.println(responseString); + + + + } catch (ClientProtocolException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (KeyManagementException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } catch (KeyStoreException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + + + public static class DefaultTrustManager implements X509TrustManager { + + @Override + public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} + + @Override + public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {} + + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + + + } + + + + + + + +} diff --git a/src/eu/europa/ecdc/enauploader/TessyValidationResult.java b/src/eu/europa/ecdc/enauploader/TessyValidationResult.java new file mode 100644 index 0000000..bad2025 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/TessyValidationResult.java @@ -0,0 +1,220 @@ +package eu.europa.ecdc.enauploader; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class TessyValidationResult implements Serializable { + + + private static final long serialVersionUID = 3570429346152774993L; + private int errors; + private int warnings; + private int remarks; + private ArrayList errorArray; + private ArrayList warningArray; + private ArrayList remarkArray; + private boolean pass; + private String guid; + + + public String toString() { + String out = ""; + String title = guid; + if (title==null) { + title = "GENERAL"; + } + + out = out + "Validation result for "+title+"\n"; + for (String s :errorArray) { + out = out+"ERROR: "+s+"\n"; + } + for (String s :warningArray) { + out = out+"WARNING: "+s+"\n"; + } + for (String s :remarkArray) { + out = out+"REMARK: "+s+"\n"; + } + out = out + "PASS: "+Boolean.toString(pass)+"\n"; + return out; + } + + public void addError(String e) { + errors++; + errorArray.add(e); + } + + public void addWarning(String e) { + warnings++; + warningArray.add(e); + } + + public void addRemark(String e) { + remarks++; + remarkArray.add(e); + } + + public void setGuid(String g) { + guid = g; + } + + public String getGuid() { + return guid; + } + + public int getErrorNum() { + return errors; + } + public int getWarningNum() { + return warnings; + } + public int getRemarkNum() { + return remarks; + } + + public ArrayList getRemarks() { + return remarkArray; + } + public ArrayList getWarnings() { + return warningArray; + } + public ArrayList getErrors() { + return errorArray; + } + + public TessyValidationResult(String resultString) { + pass = false; + errors = 0; + warnings = 0; + remarks = 0; + errorArray = new ArrayList(); + warningArray = new ArrayList(); + remarkArray = new ArrayList(); + parse(resultString); + + } + + private void parse(String resultString) { + + + String[] rows = resultString.split("\n"); + boolean header = false; + boolean validationResult = false; + String type = ""; + String message = ""; + String messageKey = ""; + + + + Pattern pat = Pattern.compile(".*(.*).*"); + + + + for (String l : rows) { + + Matcher mat = pat.matcher(l); + if (mat.find()) { + guid = mat.group(1); + } + + if (l.matches(".*
.*")) { + header = false; + } + + if (header) { + String[] res = parseField(l); + switch (res[0]) { + case "noErrors": + errors = Integer.parseInt(res[1]); + break; + case "noWarnings": + warnings = Integer.parseInt(res[1]); + break; + case "noRemarks": + remarks = Integer.parseInt(res[1]); + break; + default: + } + } + + if (l.matches(".*
.*")) { + message = message.replace("&apos;",""); + switch (type) { + case "remark": + remarkArray.add(message+" ("+messageKey+")"); + break; + case "warning": + warningArray.add(message+" ("+messageKey+")"); + break; + case "error": + errorArray.add(message+" ("+messageKey+")"); + break; + + default: + } + + validationResult = false; + } + + + if (validationResult) { + String[] res = parseField(l); + switch (res[0]) { + case "type": + type = res[1]; + break; + case "message": + message = res[1]; + break; + case "messageKey": + messageKey = res[1]; + break; + default: + } + } + + + if (l.matches(".*.*")) { + validationResult = true; + type = ""; + message = ""; + messageKey = ""; + } + + if (l.matches(".*
.*")) { + header = true; + } + + + } + + } + + private String[] parseField(String l) { + + String[] res = new String[2]; + res[0] = "";res[1] = ""; + Pattern pat = Pattern.compile("<(.*)>(.*)<(.*)>"); + Matcher mat = pat.matcher(l); + if (mat.find()) { + + res[0] = mat.group(1); + res[1] = mat.group(2); + } + + + return res; + } + + public void setPass(boolean b) { + pass = true; + + } + + public boolean pass() { + return pass; + } + + +} diff --git a/src/eu/europa/ecdc/enauploader/UploadConfig.java b/src/eu/europa/ecdc/enauploader/UploadConfig.java new file mode 100644 index 0000000..2b2d8ee --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/UploadConfig.java @@ -0,0 +1,319 @@ +package eu.europa.ecdc.enauploader; + + +import java.io.Serializable; + +public class UploadConfig implements Serializable { + + + private static final long serialVersionUID = -6824355776374586820L; + + private String name=""; + private String description=""; + + private boolean submitTessy=true; + private boolean submitEna=false; + private boolean submitFtp=false; + private boolean shareFtp=true; + private boolean submitTessyAssembly=false; + + + private String rawdataDir=""; + private String rawdataDelimiter=""; + private String assemblyDir=""; + private String assemblyDelimiter=""; + + private String sftpHost=""; + private String sftpLogin=""; + private char[] sftpPass=new char[0]; + private String sftpPath=""; + + private TessyCredentials tessyCredentials=new TessyCredentials(); + /*private String tessyLogin; + private String tessyPass; + private String tessyUrl; + private String tessyDomain; + private String tessyTarget;*/ + + + private String tessyContact=""; + private String tessyProvider=""; + private String tessySubject=""; + private String tessyMeta=""; + private String tessyCountry=""; + private boolean tessyHaltRemark=false; + private boolean tessyHaltWarn=false; + + private String enaProjectAcc=""; + private String enaCenter=""; + private boolean enaAnonymize=true; + private boolean enaProd=true; + private boolean enaFtpExist=false; + private String enaLogin=""; + private char[] enaPassword=new char[0]; + private String enaChecklist=""; + + + private String bigsdbAccessToken=""; + private String bigsdbApiUrl=""; + + private String enaFtpHost=""; + + private String curlPath=""; + + private String tmpPath=""; + private String organism = ""; + + private boolean anonymizeFtp; + private boolean showYearFtp; + + + + public String getRawdataDir() { + return rawdataDir; + } + public void setRawdataDir(String rawdataDir) { + this.rawdataDir = rawdataDir; + } + public String getRawdataDelimiter() { + return rawdataDelimiter; + } + public void setRawdataDelimiter(String rawdataDelimiter) { + this.rawdataDelimiter = rawdataDelimiter; + } + public String getSftpHost() { + return sftpHost; + } + public void setSftpHost(String sftpHost) { + this.sftpHost = sftpHost; + } + public String getSftpLogin() { + return sftpLogin; + } + public void setSftpLogin(String sftpLogin) { + this.sftpLogin = sftpLogin; + } + public char[] getSftpPass() { + return sftpPass; + } + public void setSftpPass(char[] cs) { + this.sftpPass = cs; + } + + public String getSftpPath() { + return sftpPath; + } + public void setSftpPath(String sftpPath) { + this.sftpPath = sftpPath; + } + + public String getTessyContact() { + return tessyContact; + } + public void setTessyContact(String tessyContact) { + this.tessyContact = tessyContact; + } + public String getTessyProvider() { + return tessyProvider; + } + public void setTessyProvider(String tessyProvider) { + this.tessyProvider = tessyProvider; + } + public String getTessySubject() { + return tessySubject; + } + public void setTessySubject(String tessySubject) { + this.tessySubject = tessySubject; + } + public String getTessyMeta() { + return tessyMeta; + } + public void setTessyMeta(String tessyMeta) { + this.tessyMeta = tessyMeta; + } + public String getTessyCountry() { + return tessyCountry; + } + public void setTessyCountry(String tessyCountry) { + this.tessyCountry = tessyCountry; + } + public boolean getTessyHaltRemark() { + return tessyHaltRemark; + } + public void setTessyHaltRemark(boolean tessyHaltRemark) { + this.tessyHaltRemark = tessyHaltRemark; + } + public boolean getTessyHaltWarn() { + return tessyHaltWarn; + } + public void setTessyHaltWarn(boolean tessyHaltWarn) { + this.tessyHaltWarn = tessyHaltWarn; + } + public String getEnaProjectAcc() { + return enaProjectAcc; + } + public void setEnaProjectAcc(String enaProjectAcc) { + this.enaProjectAcc = enaProjectAcc; + } + public boolean getEnaAnonymize() { + return enaAnonymize; + } + public void setEnaAnonymize(boolean enaAnonymize) { + this.enaAnonymize = enaAnonymize; + } + public String getEnaCenter() { + return enaCenter; + } + public void setEnaCenter(String enaCenter) { + this.enaCenter = enaCenter; + } + public boolean getEnaProd() { + return enaProd; + } + public void setEnaProd(boolean enaProd) { + this.enaProd = enaProd; + } + public boolean getEnaFtpExist() { + return enaFtpExist; + } + public void setEnaFtpExist(boolean enaFtpExist) { + this.enaFtpExist = enaFtpExist; + } + public String getEnaLogin() { + return enaLogin; + } + public void setEnaLogin(String enaLogin) { + this.enaLogin = enaLogin; + } + public char[] getEnaPassword() { + return enaPassword; + } + public void setEnaPassword(char[] cs) { + this.enaPassword = cs; + } + public String getEnaChecklist() { + return enaChecklist; + } + public void setEnaChecklist(String enaChecklist) { + this.enaChecklist = enaChecklist; + } + + + + + public String getBigsdbAccessToken() { + return bigsdbAccessToken; + } + public void setBigsdbAccessToken(String bigsdbAccessToken) { + this.bigsdbAccessToken = bigsdbAccessToken; + } + public String getBigsdbApiUrl() { + return bigsdbApiUrl; + } + public void setBigsdbApiUrl(String bigsdbApiUrl) { + this.bigsdbApiUrl = bigsdbApiUrl; + } + public String getAssemblyDir() { + return assemblyDir; + } + public void setAssemblyDir(String assemblyDir) { + this.assemblyDir = assemblyDir; + } + public String getAssemblyDelimiter() { + return assemblyDelimiter; + } + public void setAssemblyDelimiter(String assemblyDelimiter) { + this.assemblyDelimiter = assemblyDelimiter; + } + public TessyCredentials getTessyCredentials() { + return tessyCredentials; + } + public void setTessyCredentials(TessyCredentials tessyCredentials) { + this.tessyCredentials = tessyCredentials; + } + public boolean isSubmitEna() { + return submitEna; + } + public void setSubmitEna(boolean submitEna) { + this.submitEna = submitEna; + } + public boolean isSubmitFtp() { + return submitFtp; + } + public void setSubmitFtp(boolean submitFtp) { + this.submitFtp = submitFtp; + } + public boolean isShareFtp() { + return shareFtp; + } + public void setShareFtp(boolean shareFtp) { + this.shareFtp = shareFtp; + } + public boolean isSubmitTessyAssembly() { + return submitTessyAssembly; + } + public void setSubmitTessyAssembly(boolean submitTessyAssembly) { + this.submitTessyAssembly = submitTessyAssembly; + } + public boolean isSubmitTessy() { + return submitTessy; + } + public void setSubmitTessy(boolean submitTessy) { + this.submitTessy = submitTessy; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getDescription() { + return description; + } + public void setDescription(String description) { + this.description = description; + } + + + public String getEnaFtpHost() { + return enaFtpHost; + } + + public String getCurlPath() { + return curlPath; + } + + public String getTmpPath() { + return tmpPath; + } + + public void setEnaFtpHost(String enaFtpHost) { + this.enaFtpHost = enaFtpHost; + } + + public void setCurlPath(String curlPath) { + this.curlPath = curlPath; + } + public void setTmpPath(String tmpPath) { + this.tmpPath = tmpPath; + } + public String getOrganism() { + return organism; + } + public void setOrganism(String organism) { + this.organism = organism; + } + public void setAnonymizeFtp(boolean anonymizeFtp ) { + this.anonymizeFtp = anonymizeFtp; + } + public boolean isAnonymizeFtp() { + return anonymizeFtp; + } + public boolean isShowYearFtp() { + return showYearFtp; + } + public void setShowYearFtp(boolean showYearFtp) { + this.showYearFtp = showYearFtp; + } + +} diff --git a/src/eu/europa/ecdc/enauploader/UploadConfigGUI.java b/src/eu/europa/ecdc/enauploader/UploadConfigGUI.java new file mode 100644 index 0000000..55bbbbe --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/UploadConfigGUI.java @@ -0,0 +1,1009 @@ +package eu.europa.ecdc.enauploader; + +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.FlowLayout; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; + +import javax.imageio.ImageIO; +import javax.swing.BorderFactory; +import javax.swing.BoxLayout; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTabbedPane; +import javax.swing.JTextArea; +import javax.swing.JTextField; +import javax.swing.UIManager; +import javax.swing.UnsupportedLookAndFeelException; + +public class UploadConfigGUI extends JFrame implements ActionListener { + + + private static final long serialVersionUID = 5532960884551659103L; + private boolean isMain = false; + private JTextField contactField; + private JTextField tessyProviderField; + private JTextField subjectField; + private JTextField metaversionField; + private JTextField countryField; + private JTextField loginField; + private JPasswordField passwordField; + private JTextField domainField; + private JTextField tessyurlField; + private JTextField tessytargetField; + private JCheckBox haltwarnBox; + private JCheckBox haltremarkBox; + private JButton saveButton; + private JButton revertButton; + private JComboBox confignameField; + private JTextField ftphostField; + private JTextField ftpdirField; + private JTextField ftploginField; + private JPasswordField ftppasswordField; + private JTextField enacenterField; + private JCheckBox submitTessyBox; + private JCheckBox submitFtpBox; + private JCheckBox submitEnaBox; + private JCheckBox submitTessyAssemblyBox; + private JTextField enastudyField; + private JTextField enachecklistField; + private JTextField enaloginField; + private JPasswordField enapasswordField; + private JCheckBox enaanonymizeBox; + private JCheckBox enaprodBox; + private JTextField rawdirField; + private JTextField assemblydirField; + private JComboBox nameformatField; + private JComboBox assemblynameformatField; + private JCheckBox shareFtpBox; + private JCheckBox enaForwardBox; + + + private HashMap configs; + private JButton newButton; + private JButton renameButton; + private String oldSelection; + private JTextArea descriptionArea; + private JButton deleteButton; + private JTextField tmpdirField; + private JTextField curlpathField; + private JTextField enaftpField; + private JTextField enaorganismField; + private JCheckBox anonymizeFtpBox; + private JCheckBox shareYearFtpBox; + + public void updateUi(UploadConfig cfg) { + if (cfg==null) { + return; + } + + //confignameField.setText(cfg.getName()); + descriptionArea.setText(cfg.getDescription()); + + //Filesystem + tmpdirField.setText(cfg.getTmpPath()); + rawdirField.setText(cfg.getRawdataDir()); + assemblydirField.setText(cfg.getAssemblyDir()); + String rawDelim = cfg.getRawdataDelimiter(); + if (rawDelim.equals("_")) { + nameformatField.setSelectedIndex(0); + } else if (rawDelim.equals(".")) { + nameformatField.setSelectedIndex(1); + } + + String assemblyDelim = cfg.getAssemblyDelimiter(); + if (assemblyDelim.equals("")) { + assemblynameformatField.setSelectedIndex(0); + } else if (assemblyDelim.equals("_")) { + assemblynameformatField.setSelectedIndex(1); + } else if (assemblyDelim.equals(".")) { + assemblynameformatField.setSelectedIndex(2); + } + + //TESSy + submitTessyBox.setSelected(cfg.isSubmitTessy()); + submitTessyAssemblyBox.setSelected(cfg.isSubmitTessyAssembly()); + TessyCredentials tessyCred = cfg.getTessyCredentials(); + + enaftpField.setText(cfg.getEnaFtpHost()); + curlpathField.setText(cfg.getCurlPath()); + + loginField.setText(tessyCred.getUsername()); + passwordField.setText(new String(tessyCred.getPassword())); + tessyurlField.setText(tessyCred.getHostname()); + domainField.setText(tessyCred.getDomain()); + tessytargetField.setText(tessyCred.getTarget()); + + contactField.setText(cfg.getTessyContact()); + countryField.setText(cfg.getTessyCountry()); + subjectField.setText(cfg.getTessySubject()); + metaversionField.setText(cfg.getTessyMeta()); + tessyProviderField.setText(cfg.getTessyProvider()); + haltwarnBox.setSelected(cfg.getTessyHaltWarn()); + haltremarkBox.setSelected(cfg.getTessyHaltRemark()); + + //SFTP + + submitFtpBox.setSelected(cfg.isSubmitFtp()); + shareFtpBox.setSelected(cfg.isShareFtp()); + shareYearFtpBox.setSelected(cfg.isShowYearFtp()); + anonymizeFtpBox.setSelected(cfg.isAnonymizeFtp()); + ftphostField.setText(cfg.getSftpHost()); + ftpdirField.setText(cfg.getSftpPath()); + ftploginField.setText(cfg.getSftpLogin()); + ftppasswordField.setText(new String(cfg.getSftpPass())); + + + //ENA + submitEnaBox.setSelected(cfg.isSubmitEna()); + enacenterField.setText(cfg.getEnaCenter()); + enaorganismField.setText(cfg.getOrganism()); + enastudyField.setText(cfg.getEnaProjectAcc()); + enachecklistField.setText(cfg.getEnaChecklist()); + enaloginField.setText(cfg.getEnaLogin()); + enapasswordField.setText(new String(cfg.getEnaPassword())); + enaanonymizeBox.setSelected(cfg.getEnaAnonymize()); + enaprodBox.setSelected(cfg.getEnaProd()); + + + + + + } + + public UploadConfig createConfig() { + UploadConfig cfg = new UploadConfig(); + + + cfg.setName((String)confignameField.getSelectedItem()); + + cfg.setDescription(descriptionArea.getText()); + + // Filesystem + cfg.setTmpPath(tmpdirField.getText()); + cfg.setRawdataDir(rawdirField.getText()); + cfg.setAssemblyDir(assemblydirField.getText()); + String rawDelim = "_"; + if (nameformatField.getSelectedIndex()==1) { + rawDelim = "."; + } + cfg.setRawdataDelimiter(rawDelim); + + String assemblyDelim = ""; + if (assemblynameformatField.getSelectedIndex()==1) { + rawDelim = "_"; + } else if (assemblynameformatField.getSelectedIndex()==2) { + rawDelim = "."; + } + cfg.setAssemblyDelimiter(assemblyDelim); + + //TESSy + cfg.setSubmitTessyAssembly(submitTessyAssemblyBox.isSelected()); + cfg.setSubmitTessy(submitTessyBox.isSelected()); + TessyCredentials tessyCred = new TessyCredentials(); + tessyCred.setUsername(loginField.getText()); + tessyCred.setPassword(passwordField.getPassword()); + tessyCred.setHostname(tessyurlField.getText()); + tessyCred.setDomain(domainField.getText()); + tessyCred.setTarget(tessytargetField.getText()); + cfg.setTessyCredentials(tessyCred); + + cfg.setCurlPath(curlpathField.getText()); + cfg.setEnaFtpHost(enaftpField.getText()); + + cfg.setTessyContact(contactField.getText()); + cfg.setTessyCountry(countryField.getText()); + cfg.setTessySubject(subjectField.getText()); + cfg.setTessyMeta(metaversionField.getText()); + cfg.setTessyProvider(tessyProviderField.getText()); + cfg.setTessyHaltWarn(haltwarnBox.isSelected()); + cfg.setTessyHaltRemark(haltremarkBox.isSelected()); + + //SFTP + cfg.setSubmitFtp(submitFtpBox.isSelected()); + cfg.setShareFtp(shareFtpBox.isSelected()); + cfg.setShowYearFtp(shareYearFtpBox.isSelected()); + cfg.setAnonymizeFtp(anonymizeFtpBox.isSelected()); + cfg.setSftpHost(ftphostField.getText()); + cfg.setSftpPath(ftpdirField.getText()); + cfg.setSftpLogin(ftploginField.getText()); + cfg.setSftpPass(ftppasswordField.getPassword()); + + //ENA + cfg.setOrganism(enaorganismField.getText()); + cfg.setSubmitEna(submitEnaBox.isSelected()); + cfg.setEnaCenter(enacenterField.getText()); + cfg.setEnaProjectAcc(enastudyField.getText()); + cfg.setEnaChecklist(enachecklistField.getText()); + cfg.setEnaLogin(enaloginField.getText()); + cfg.setEnaPassword(enapasswordField.getPassword()); + cfg.setEnaAnonymize(enaanonymizeBox.isSelected()); + cfg.setEnaProd(enaprodBox.isSelected()); + cfg.setEnaFtpExist(false); + + + /* + + */ + + + return cfg; + } + + + public static void main(String[] args) { + try { + // Set System L&F + UIManager.setLookAndFeel( + UIManager.getSystemLookAndFeelClassName()); + } + catch (UnsupportedLookAndFeelException e) { + // handle exception + } + catch (ClassNotFoundException e) { + // handle exception + } + catch (InstantiationException e) { + // handle exception + } + catch (IllegalAccessException e) { + // handle exception + } + UploadConfigGUI gui = new UploadConfigGUI(true); + gui.init(); + } + + UploadConfigGUI(boolean m) { + isMain = m; + } + + UploadConfigGUI() { + + } + + public void init() { + + + configs = new HashMap(); + File dir = new File("."); + File[] files = dir.listFiles(); + for (File f : files) { + if (f.getName().endsWith(".cfg")) { + try { + UploadConfig cfg = UploadConfigHandler.loadConfig(f); + configs.put(f.getName(),cfg); + } catch (ClassNotFoundException | IOException e) { + e.printStackTrace(); + JOptionPane.showMessageDialog(null, + "Could not open config file "+f.toString()+". If it is open in another program, please close it and try again."); + } + + } + } + + + try { + String imagePath = "media/ECDC2.png"; + InputStream imgStream = UploadConfigGUI.class.getResourceAsStream(imagePath ); + BufferedImage myImg; + myImg = ImageIO.read(imgStream); + setIconImage(myImg); + } catch (Exception e) { + e.printStackTrace(); + } + + + setTitle("ECDC WGS upload configuration"); + this.setResizable(false); + JPanel mainPanel = new JPanel(new BorderLayout()); + JPanel buttonPanel = new JPanel(); + JPanel topPanel = new JPanel(new BorderLayout()); + + newButton = new JButton("New"); + newButton.addActionListener(this); + newButton.setActionCommand("new"); + renameButton = new JButton("Rename"); + renameButton.addActionListener(this); + renameButton.setActionCommand("rename"); + saveButton = new JButton("Save"); + saveButton.addActionListener(this); + saveButton.setActionCommand("saveAndClose"); + + revertButton = new JButton("Revert changes"); + revertButton.addActionListener(this); + revertButton.setActionCommand("revert"); + deleteButton = new JButton("Delete"); + deleteButton.addActionListener(this); + deleteButton.setActionCommand("delete"); + + buttonPanel.add(newButton); + buttonPanel.add(renameButton); + buttonPanel.add(saveButton); + + buttonPanel.add(revertButton); + buttonPanel.add(deleteButton); + + JLabel descriptionLabel = new JLabel("Description:"); + descriptionArea = new JTextArea(); + descriptionArea.setPreferredSize(new Dimension(360, 80)); + JPanel descriptionPanel = new JPanel(); + descriptionPanel.add(descriptionLabel); + descriptionPanel.add(descriptionArea); + buttonPanel.add(descriptionPanel); + + + JLabel confignameLabel = new JLabel("Configuration"); + confignameField = new JComboBox(); + for (String k : configs.keySet()) { + confignameField.addItem(k); + } + confignameField.addActionListener(this); + confignameField.setActionCommand("selection"); + + confignameField.setPreferredSize(new Dimension(240,20)); + JPanel confignamePanel = new JPanel (); + confignamePanel.add(confignameLabel); + confignamePanel.add(confignameField); + + + topPanel.add(buttonPanel,BorderLayout.CENTER); + topPanel.add(confignamePanel,BorderLayout.NORTH); + JTabbedPane tabs = new JTabbedPane(); + mainPanel.add(tabs,BorderLayout.CENTER); + mainPanel.add(topPanel,BorderLayout.NORTH); + + JPanel fileTab = new JPanel(); + FlowLayout mgrFile = new FlowLayout(FlowLayout.RIGHT); + fileTab.setLayout(mgrFile); + fileTab.setBorder(BorderFactory.createEtchedBorder()); + populateFile(fileTab); + + JPanel tessyTab = new JPanel(); + FlowLayout mgrTessy = new FlowLayout(FlowLayout.RIGHT); + tessyTab.setLayout(mgrTessy); + tessyTab.setBorder(BorderFactory.createEtchedBorder()); + populateTessy(tessyTab); + + JPanel ftpTab = new JPanel(); + FlowLayout mgrFtp = new FlowLayout(FlowLayout.RIGHT); + ftpTab.setBorder(BorderFactory.createEtchedBorder()); + ftpTab.setLayout(mgrFtp); + //ftpTab.setLayout(new BoxLayout(ftpTab,BoxLayout.PAGE_AXIS)); + populateFtp(ftpTab); + + + JPanel enaTab = new JPanel(); + FlowLayout mgrEna = new FlowLayout(FlowLayout.RIGHT); + enaTab.setLayout(mgrEna); + enaTab.setBorder(BorderFactory.createEtchedBorder()); + populateEna(enaTab); + + JPanel bigsDbTab = new JPanel(); + FlowLayout mgrBigsDb = new FlowLayout(FlowLayout.RIGHT); + bigsDbTab.setLayout(mgrBigsDb); + bigsDbTab.setBorder(BorderFactory.createEtchedBorder()); + bigsDbTab.setLayout(new BoxLayout(bigsDbTab,BoxLayout.PAGE_AXIS)); + + tabs.add("Local filesystem config", fileTab); + tabs.add("TESSy config", tessyTab); + tabs.add("ECDC SFTP config", ftpTab); + tabs.add("ENA config", enaTab); + tabs.add("BIGSdb config", bigsDbTab); + + + String item = (String)confignameField.getSelectedItem(); + UploadConfig cfg = configs.get(item); + updateUi(cfg); + oldSelection = item; + + this.add(mainPanel); + if (isMain) { + this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + } + this.setSize(540,740); + this.setVisible(true); + } + + + private void populateFile(JPanel fileTab) { + JLabel rawdirLabel = new JLabel("Raw reads base directory"); + rawdirField = new JTextField(""); + rawdirField.setPreferredSize(new Dimension(240,20)); + JPanel rawdirPanel = new JPanel (); + JButton rawdirBrowseButton = new JButton("Browse..."); + rawdirBrowseButton.setActionCommand("browseRaw"); + rawdirBrowseButton.addActionListener(this); + rawdirPanel.add(rawdirLabel); + rawdirPanel.add(rawdirField); + rawdirPanel.add(rawdirBrowseButton); + fileTab.add(rawdirPanel); + + + + JLabel nameformatLabel = new JLabel("Raw reads filename format"); + nameformatField = new JComboBox(); + nameformatField.addItem("_*.fastq.gz"); + nameformatField.addItem(".*.fastq.gz"); + nameformatField.setPreferredSize(new Dimension(240,20)); + JPanel nameformatPanel = new JPanel (); + nameformatPanel.add(nameformatLabel); + nameformatPanel.add(nameformatField); + fileTab.add(nameformatPanel); + + JLabel assemblydirLabel = new JLabel("Assemblies base directory"); + assemblydirField = new JTextField(""); + assemblydirField.setPreferredSize(new Dimension(240,20)); + JPanel assemblydirPanel = new JPanel (); + JButton assemblydirBrowseButton = new JButton("Browse..."); + assemblydirBrowseButton.setActionCommand("browseAssembly"); + assemblydirBrowseButton.addActionListener(this); + assemblydirPanel.add(assemblydirLabel); + assemblydirPanel.add(assemblydirField); + assemblydirPanel.add(assemblydirBrowseButton); + fileTab.add(assemblydirPanel); + + JLabel assemblynameformatLabel = new JLabel("Assembly filename format"); + assemblynameformatField = new JComboBox(); + assemblynameformatField.addItem(".fasta"); + assemblynameformatField.addItem("_*.fasta"); + assemblynameformatField.addItem(".*.fasta"); + assemblynameformatField.setPreferredSize(new Dimension(240,20)); + JPanel assemblynameformatPanel = new JPanel (); + assemblynameformatPanel.add(assemblynameformatLabel); + assemblynameformatPanel.add(assemblynameformatField); + fileTab.add(assemblynameformatPanel); + + + JLabel tmpdirLabel = new JLabel("TMP directory"); + tmpdirField = new JTextField(""); + tmpdirField.setPreferredSize(new Dimension(240,20)); + JPanel tmpdirPanel = new JPanel (); + JButton tmpdirBrowseButton = new JButton("Browse..."); + tmpdirBrowseButton.setActionCommand("browseTmp"); + tmpdirBrowseButton.addActionListener(this); + tmpdirPanel.add(tmpdirLabel); + tmpdirPanel.add(tmpdirField); + tmpdirPanel.add(tmpdirBrowseButton); + fileTab.add(tmpdirPanel); + + + + } + + private void populateEna(JPanel enaTab) { + + + + + + submitEnaBox = new JCheckBox("Submit raw reads (if available) to ENA"); + JPanel submitEnaPanel = new JPanel (); + submitEnaPanel.add(submitEnaBox); + enaTab.add(submitEnaPanel); + + JLabel curlpathLabel = new JLabel("Path to CURL program"); + curlpathField = new JTextField(""); + curlpathField.setPreferredSize(new Dimension(240,20)); + JPanel curlpathPanel = new JPanel (); + JButton curlpathBrowseButton = new JButton("Browse..."); + curlpathBrowseButton.setActionCommand("browseCurl"); + curlpathBrowseButton.addActionListener(this); + curlpathPanel.add(curlpathLabel); + curlpathPanel.add(curlpathField); + curlpathPanel.add(curlpathBrowseButton); + enaTab.add(curlpathPanel); + + + JLabel enaftpLabel = new JLabel("ENA FTP server"); + enaftpField = new JTextField(""); + enaftpField.setPreferredSize(new Dimension(240,20)); + JPanel enaftpPanel = new JPanel (); + enaftpPanel.add(enaftpLabel); + enaftpPanel.add(enaftpField); + enaTab.add(enaftpPanel); + + JLabel enaorganismLabel = new JLabel("Organism name"); + enaorganismField = new JTextField(""); + enaorganismField.setPreferredSize(new Dimension(240,20)); + JPanel enaorganismPanel = new JPanel (); + enaorganismPanel.add(enaorganismLabel); + enaorganismPanel.add(enaorganismField); + enaTab.add(enaorganismPanel); + + JLabel enacenterLabel = new JLabel("Submitting Centre"); + enacenterField = new JTextField(""); + enacenterField.setPreferredSize(new Dimension(240,20)); + JPanel enacenterPanel = new JPanel (); + enacenterPanel.add(enacenterLabel); + enacenterPanel.add(enacenterField); + enaTab.add(enacenterPanel); + + JLabel enastudyLabel = new JLabel("ENA study accession"); + enastudyField = new JTextField(""); + enastudyField.setPreferredSize(new Dimension(240,20)); + JPanel enastudyPanel = new JPanel (); + enastudyPanel.add(enastudyLabel); + enastudyPanel.add(enastudyField); + enaTab.add(enastudyPanel); + + JLabel enachecklistLabel = new JLabel("ENA checklist (ERCXXXXXX)"); + enachecklistField = new JTextField(""); + enachecklistField.setPreferredSize(new Dimension(240,20)); + JPanel enachecklistPanel = new JPanel (); + enachecklistPanel.add(enachecklistLabel); + enachecklistPanel.add(enachecklistField); + enaTab.add(enachecklistPanel); + + JLabel enaloginLabel = new JLabel("ENA Webin account"); + enaloginField = new JTextField(""); + enaloginField.setPreferredSize(new Dimension(240,20)); + JPanel enaloginPanel = new JPanel (); + enaloginPanel.add(enaloginLabel); + enaloginPanel.add(enaloginField); + enaTab.add(enaloginPanel); + + JLabel enapasswordLabel = new JLabel("ENA Webin password"); + enapasswordField = new JPasswordField(""); + enapasswordField.setPreferredSize(new Dimension(240,20)); + JPanel enapasswordPanel = new JPanel (); + enapasswordPanel.add(enapasswordLabel); + enapasswordPanel.add(enapasswordField); + enaTab.add(enapasswordPanel); + + enaanonymizeBox = new JCheckBox("Anonymize Record ID in ENA submission"); + enaanonymizeBox.setSelected(true); + JPanel enaanonymizePanel = new JPanel (); + enaanonymizePanel.add(enaanonymizeBox); + enaTab.add(enaanonymizePanel); + + enaprodBox = new JCheckBox("Submit to ENA production service"); + enaprodBox.setSelected(true); + JPanel enaprodPanel = new JPanel (); + enaprodPanel.add(enaprodBox); + enaTab.add(enaprodPanel); + + JLabel infoEnaLabel = new JLabel("Note: The submission to ENA will include a minimal metadata set
including: year, country, and isolation source (human/nonhuman)"); + JPanel infoEnaPanel = new JPanel (); + infoEnaPanel.add(infoEnaLabel); + enaTab.add(infoEnaPanel); + } + + private void populateFtp(JPanel ftpTab) { + + + submitFtpBox = new JCheckBox("Submit raw reads (if available) to ECDC SFTP"); + JPanel submitFtpPanel = new JPanel (); + submitFtpPanel.add(submitFtpBox); + ftpTab.add(submitFtpPanel); + + shareFtpBox = new JCheckBox("Share reads with other ECDC SFTP users"); + shareFtpBox.setSelected(true); + JPanel shareFtpPanel = new JPanel (); + shareFtpPanel.add(shareFtpBox); + ftpTab.add(shareFtpPanel); + + anonymizeFtpBox = new JCheckBox("Anonymize filenames"); + anonymizeFtpBox.setSelected(true); + JPanel anonymizeFtpPanel = new JPanel (); + anonymizeFtpPanel.add(anonymizeFtpBox); + ftpTab.add(anonymizeFtpPanel); + + shareYearFtpBox = new JCheckBox("Share year with other users"); + shareYearFtpBox.setSelected(true); + JPanel shareYearFtpPanel = new JPanel (); + shareYearFtpPanel.add(shareYearFtpBox); + ftpTab.add(shareYearFtpPanel); + + JLabel ftphostLabel = new JLabel("SFTP host"); + ftphostField = new JTextField(""); + ftphostField.setPreferredSize(new Dimension(240,20)); + JPanel ftphostPanel = new JPanel (); + ftphostPanel.add(ftphostLabel); + ftphostPanel.add(ftphostField); + ftpTab.add(ftphostPanel); + + JLabel ftpdirLabel = new JLabel("SFTP home directory"); + ftpdirField = new JTextField(""); + ftpdirField.setPreferredSize(new Dimension(240,20)); + JPanel ftpdirPanel = new JPanel (); + ftpdirPanel.add(ftpdirLabel); + ftpdirPanel.add(ftpdirField); + ftpTab.add(ftpdirPanel); + + JLabel ftploginLabel = new JLabel("SFTP Login"); + ftploginField = new JTextField(""); + ftploginField.setPreferredSize(new Dimension(240,20)); + JPanel ftploginPanel = new JPanel (); + ftploginPanel.add(ftploginLabel); + ftploginPanel.add(ftploginField); + ftpTab.add(ftploginPanel); + + JLabel ftppasswordLabel = new JLabel("SFTP Password"); + ftppasswordField = new JPasswordField(""); + ftppasswordField.setPreferredSize(new Dimension(240,20)); + JPanel ftppasswordPanel = new JPanel (); + ftppasswordPanel.add(ftppasswordLabel); + ftppasswordPanel.add(ftppasswordField); + ftpTab.add(ftppasswordPanel); + } + + private void populateTessy(JPanel tessyTab) { + + submitTessyBox = new JCheckBox("Submit epidemiological data to TESSy"); + submitTessyBox.setSelected(true); + submitTessyBox.setEnabled(false); + JPanel submitTessyPanel = new JPanel (); + submitTessyPanel.add(submitTessyBox); + tessyTab.add(submitTessyPanel); + + submitTessyAssemblyBox = new JCheckBox("Submit assembly (if available) to TESSy"); + JPanel submitTessyAssemblyPanel = new JPanel (); + submitTessyAssemblyPanel.add(submitTessyAssemblyBox); + tessyTab.add(submitTessyAssemblyPanel); + + JLabel contactLabel = new JLabel("Contact person (name)"); + contactField = new JTextField(""); + contactField.setPreferredSize(new Dimension(240,20)); + JPanel contactPanel = new JPanel (); + contactPanel.add(contactLabel); + contactPanel.add(contactField); + tessyTab.add(contactPanel); + + JLabel tessySourceLabel = new JLabel("Data Provider"); + tessyProviderField = new JTextField(""); + tessyProviderField.setPreferredSize(new Dimension(240,20)); + JPanel tessyProviderPanel = new JPanel (); + tessyProviderPanel.add(tessySourceLabel); + tessyProviderPanel.add(tessyProviderField); + tessyTab.add(tessyProviderPanel); + + JLabel subjectLabel = new JLabel("Subject (XXXXISO)"); + subjectField = new JTextField(""); + subjectField.setPreferredSize(new Dimension(240,20)); + JPanel subjectPanel = new JPanel (); + subjectPanel.add(subjectLabel); + subjectPanel.add(subjectField); + tessyTab.add(subjectPanel); + + JLabel metaversionLabel = new JLabel("TESSy metadata version (X)"); + metaversionField = new JTextField(""); + metaversionField.setPreferredSize(new Dimension(240,20)); + JPanel metaversionPanel = new JPanel (); + metaversionPanel.add(metaversionLabel); + metaversionPanel.add(metaversionField); + tessyTab.add(metaversionPanel); + + JLabel countryLabel = new JLabel("Country code (XX)"); + countryField = new JTextField(""); + countryField.setPreferredSize(new Dimension(240,20)); + JPanel countryPanel = new JPanel (); + countryPanel.add(countryLabel); + countryPanel.add(countryField); + tessyTab.add(countryPanel); + + JLabel loginLabel = new JLabel("TESSy username"); + loginField = new JTextField(""); + loginField.setPreferredSize(new Dimension(240,20)); + JPanel loginPanel = new JPanel (); + loginPanel.add(loginLabel); + loginPanel.add(loginField); + tessyTab.add(loginPanel); + + JLabel passwordLabel = new JLabel("TESSy password"); + passwordField = new JPasswordField(""); + passwordField.setPreferredSize(new Dimension(240,20)); + JPanel passwordPanel = new JPanel (); + passwordPanel.add(passwordLabel); + passwordPanel.add(passwordField); + tessyTab.add(passwordPanel); + + JLabel tessyurlLabel = new JLabel("TESSy URL"); + tessyurlField = new JTextField(""); + tessyurlField.setPreferredSize(new Dimension(240,20)); + JPanel tessyurlPanel = new JPanel (); + tessyurlPanel.add(tessyurlLabel); + tessyurlPanel.add(tessyurlField); + tessyTab.add(tessyurlPanel); + + JLabel domainLabel = new JLabel("TESSy domain"); + domainField = new JTextField(""); + domainField.setPreferredSize(new Dimension(240,20)); + JPanel domainPanel = new JPanel (); + domainPanel.add(domainLabel); + domainPanel.add(domainField); + tessyTab.add(domainPanel); + + JLabel tessytargetLabel = new JLabel("TESSy API target"); + tessytargetField = new JTextField(""); + tessytargetField.setPreferredSize(new Dimension(240,20)); + JPanel tessytargetPanel = new JPanel (); + tessytargetPanel.add(tessytargetLabel); + tessytargetPanel.add(tessytargetField); + tessyTab.add(tessytargetPanel); + + haltwarnBox = new JCheckBox("Halt submission on warnings"); + JPanel haltwarnPanel = new JPanel (); + haltwarnPanel.add(haltwarnBox); + tessyTab.add(haltwarnPanel); + + haltremarkBox = new JCheckBox("Halt submission on remarks"); + JPanel haltremarkPanel = new JPanel (); + haltremarkPanel.add(haltremarkBox); + tessyTab.add(haltremarkPanel); + } + + @Override + public void actionPerformed(ActionEvent e) { + String command = e.getActionCommand(); + if (command.equals("close")) { + this.dispose(); + } else if (command.equals("saveAndClose")) { + + UploadConfig cfg = createConfig(); + String selected = (String)confignameField.getSelectedItem(); + if (selected!=null) { + configs.put(selected,cfg); + } + + for (String k : configs.keySet()) { + System.out.println(k); + UploadConfig cfg2 = configs.get(k); + File f = new File(k); + if (cfg2!=null && f!=null) { + try { + UploadConfigHandler.saveConfig(f, cfg2); + } catch (IOException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(null, + "Could not save to config file "+f.toString()+". If it is open in another program, please close it and try again."); + } + } + } + + + } else if (command.equals("revert")) { + for (String name : configs.keySet()) { + File f = new File(name); + if (f.exists()) { + try { + UploadConfig cfg = UploadConfigHandler.loadConfig(f); + configs.put(name,cfg); + } catch (ClassNotFoundException | IOException e1) { + + e1.printStackTrace(); + } + } else { + configs.put(name,new UploadConfig()); + } + } + UploadConfig cfg = configs.get((String)confignameField.getSelectedItem()); + updateUi(cfg); + } else if (command.equals("browseTmp")) { + + + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Choose TMP directory"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + + chooser.setAcceptAllFileFilterUsed(false); + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + tmpdirField.setText(chooser.getSelectedFile().toString()); + } + + } else if (command.equals("browseCurl")) { + + + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Select the curl executable"); + chooser.setFileSelectionMode(JFileChooser.FILES_ONLY); + + chooser.setAcceptAllFileFilterUsed(false); + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + curlpathField.setText(chooser.getSelectedFile().toString()); + } + + } else if (command.equals("browseRaw")) { + + + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Choose directory containing raw data (.fastq.gz)"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + + chooser.setAcceptAllFileFilterUsed(false); + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + rawdirField.setText(chooser.getSelectedFile().toString()); + } + + } else if (command.equals("browseAssembly")) { + JFileChooser chooser = new JFileChooser(); + chooser.setCurrentDirectory(new java.io.File(".")); + chooser.setDialogTitle("Choose directory containing assemblies (.fasta)"); + chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); + + chooser.setAcceptAllFileFilterUsed(false); + + if (chooser.showOpenDialog(this) == JFileChooser.APPROVE_OPTION) { + assemblydirField.setText(chooser.getSelectedFile().toString()); + } + } else if (command.equals("selection")) { + UploadConfig cfgOld = createConfig(); + if (oldSelection!=null) { + configs.put(oldSelection,cfgOld); + } + + String item = (String)confignameField.getSelectedItem(); + UploadConfig cfg = configs.get(item); + updateUi(cfg); + oldSelection = item; + } else if (command.equals("new")) { + String s = (String)JOptionPane.showInputDialog( + this, + "Choose a name for the config:", + "Create new config", + JOptionPane.PLAIN_MESSAGE + ); + + + if ((s != null) && (s.length() > 0)) { + if (!s.endsWith(".cfg")) { + s = s + ".cfg"; + } + for (String k : configs.keySet()) { + if (s.equals(k)) { + JOptionPane.showMessageDialog(this, + "This config name already exists."); + return; + } + } + System.out.println(s); + UploadConfig cfg = new UploadConfig(); + configs.put(s,cfg); + confignameField.addItem(s); + confignameField.setSelectedItem(s); + updateUi(cfg); + } + + + + } else if (command.equals("rename")) { + String name = (String)confignameField.getSelectedItem(); + if (name==null) { + return; + } + String s = (String)JOptionPane.showInputDialog( + this, + "Choose a new name for config "+name, + "Rename config", + JOptionPane.PLAIN_MESSAGE + ); + + + if ((s != null) && (s.length() > 0)) { + if (!s.endsWith(".cfg")) { + s = s + ".cfg"; + } + for (String k : configs.keySet()) { + if (s.equals(k)) { + JOptionPane.showMessageDialog(this, + "This config name already exists, choose another name."); + return; + } + } + System.out.println(s); + + + File oldFile = new File(name); + File newFile = new File(s); + UploadConfig cfg = createConfig(); + if (oldFile.exists()) { + try { + UploadConfigHandler.saveConfig(newFile, cfg); + oldFile.delete(); + } catch (IOException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(this, + "Writing to file "+s+" failed. Aborting rename."); + return; + + } + + } + + + configs.remove(name); + configs.put(s,cfg); + System.out.println("OLD NAME: "+name); + + + + confignameField.removeItem(name); + confignameField.addItem(s); + confignameField.setSelectedItem(s); + updateUi(cfg); + } + + + + } else if (command.equals("delete")) { + String name = (String)confignameField.getSelectedItem(); + if (name==null) { + return; + } + int n = JOptionPane.showConfirmDialog( + this, + "Are you sure? This will rename the config file to "+name+".bak\n and it will no longer be visible.", + "Delete config?", + JOptionPane.YES_NO_OPTION); + if (n==JOptionPane.YES_OPTION) { + + File oldFile = new File(name); + File newFile = new File(name+".bak"); + UploadConfig cfg = createConfig(); + if (oldFile.exists()) { + try { + UploadConfigHandler.saveConfig(newFile, cfg); + oldFile.delete(); + } catch (IOException e1) { + e1.printStackTrace(); + JOptionPane.showMessageDialog(this, + "Deletion failed."); + return; + + } + + } + System.out.println("Previous configs:"); + for (String k : configs.keySet()) { + System.out.println(k); + } + System.out.println("===="); + System.out.println("Removing "+name); + System.out.println(configs.remove(name)); + System.out.println("Remaining configs:"); + for (String k : configs.keySet()) { + System.out.println(k); + } + oldSelection = null; + confignameField.removeItem(name); + try { + confignameField.setSelectedIndex(0); + UploadConfig cfg2 = configs.get((String)confignameField.getSelectedItem()); + updateUi(cfg2); + } catch (Exception e2) { + UploadConfig cfg2 = new UploadConfig(); + updateUi(cfg2); + } + System.out.println("Remaining configs:"); + for (String k : configs.keySet()) { + System.out.println(k); + } + System.out.println("===="); + } + + } + } + + + + + +} diff --git a/src/eu/europa/ecdc/enauploader/UploadConfigHandler.java b/src/eu/europa/ecdc/enauploader/UploadConfigHandler.java new file mode 100644 index 0000000..ddc6713 --- /dev/null +++ b/src/eu/europa/ecdc/enauploader/UploadConfigHandler.java @@ -0,0 +1,26 @@ +package eu.europa.ecdc.enauploader; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; + +public class UploadConfigHandler { + + public static UploadConfig loadConfig(File configFile) throws IOException, ClassNotFoundException { + FileInputStream streamIn = new FileInputStream(configFile); + ObjectInputStream objectinputstream = new ObjectInputStream(streamIn); + UploadConfig config = (UploadConfig) objectinputstream.readObject(); + objectinputstream.close(); + return config; + } + + public static void saveConfig(File configFile, UploadConfig config) throws IOException { + FileOutputStream fout = new FileOutputStream(configFile); + ObjectOutputStream oos = new ObjectOutputStream(fout); + oos.writeObject(config); + oos.close(); + } +} diff --git a/src/eu/europa/ecdc/enauploader/media/ECDC.png b/src/eu/europa/ecdc/enauploader/media/ECDC.png new file mode 100644 index 0000000..d7a5918 Binary files /dev/null and b/src/eu/europa/ecdc/enauploader/media/ECDC.png differ diff --git a/src/eu/europa/ecdc/enauploader/media/ECDC2.png b/src/eu/europa/ecdc/enauploader/media/ECDC2.png new file mode 100644 index 0000000..2bd4fd0 Binary files /dev/null and b/src/eu/europa/ecdc/enauploader/media/ECDC2.png differ diff --git a/taxids.tsv b/taxids.tsv new file mode 100644 index 0000000..612d545 --- /dev/null +++ b/taxids.tsv @@ -0,0 +1,2966 @@ +Listeria monocytogenes 1639 +Escherichia coli 562 +Salmonella enterica subsp. enterica serovar Teko 2079198 +Salmonella enterica subsp. enterica serovar Papuana 2060941 +Salmonella enterica subsp. enterica serovar Amersfoort 2060071 +"Salmonella enterica subsp. enterica serovar 4,12:nonmotile" 2055190 +"Salmonella enterica subsp. houtenae serovar 53:z4,z23:-" 2053488 +Salmonella enterica subsp. enterica serovar Legon 2052597 +Salmonella enterica subsp. diarizonae serovar 53:z10:z 2051904 +Salmonella enterica subsp. enterica serovar Kotte 2048769 +Salmonella enterica subsp. enterica serovar Diguel 2044596 +Salmonella enterica subsp. enterica serovar Lehrte 2042303 +Salmonella enterica subsp. enterica serovar Umbilo 2041616 +Salmonella enterica subsp. enterica serovar Yaba 2036205 +Salmonella enterica subsp. enterica serovar Ruiru 2036204 +"Salmonella enterica subsp. arizonae serovar 47:z4,z23:-" 2034674 +"Salmonella enterica subsp. diarizonae serovar 61:l,[v],[z13]:1,5,[7]" 2029769 +Salmonella enterica subsp. diarizonae serovar 38:[k]:z35 2025602 +"Salmonella enterica subsp. houtenae serovar O:11:g,z25:-" 2025576 +Salmonella enterica subsp. enterica serovar Sundsvall 2024273 +Salmonella enterica subsp. enterica serovar Plymouth 2024272 +Salmonella enterica subsp. enterica serovar Bere 2024271 +Salmonella enterica subsp. enterica serovar Altendorf 2024270 +Salmonella enterica subsp. enterica serovar Ekotedo 2024269 +Salmonella enterica subsp. enterica serovar Carno 2024268 +Salmonella enterica subsp. enterica serovar Takoradi 2024267 +Salmonella enterica subsp. enterica serovar Tees 2024266 +Salmonella enterica subsp. enterica serovar Szentes 2021404 +Salmonella enterica subsp. enterica serovar Adjame 2021403 +Salmonella enterica subsp. enterica serovar Tudu 2021402 +Salmonella enterica subsp. enterica serovar Hato 2017678 +Salmonella enterica subsp. enterica serovar Pakistan 2016496 +Salmonella enterica subsp. enterica serovar Luke 1975667 +Salmonella enterica subsp. enterica serovar Seftenburg 1974324 +"Salmonella enterica subsp. enterica serovar Rough O:d:1,7" 1974323 +"Salmonella enterica subsp. houtenae serovar 40:z4,z32:-" 1974322 +Salmonella enterica subsp. diarizonae serovar Rough:r:z 1974321 +Salmonella enterica subsp. arizonae serovar 50:r:z 1974320 +Salmonella enterica subsp. enterica serovar Holcomb 1974319 +"Salmonella enterica subsp. enterica serovar 6,8:i:-" 1974318 +Salmonella enterica subsp. enterica serovar Wippra 1969920 +"Salmonella enterica subsp. indica serovar 1,6,14:a:e,n,x" 1967993 +Salmonella enterica subsp. enterica serovar Elizabethville 1967992 +Salmonella enterica subsp. enterica serovar Colindale 1967991 +Salmonella enterica subsp. enterica serovar Chandans 1967990 +Salmonella enterica subsp. enterica serovar Amager 1967989 +Salmonella enterica subsp. enterica serovar Abaeeteuba 1967988 +Salmonella enterica subsp. enterica serovar Arizonae 1967987 +Salmonella enterica subsp. enterica serovar Bukuru 1967953 +Salmonella enterica subsp. enterica serovar Wilhemsburg 1967662 +Salmonella enterica subsp. enterica serovar Westthampton 1967661 +Salmonella enterica subsp. enterica serovar Weltenvreden 1967660 +Salmonella enterica subsp. enterica serovar Vinobrady 1967659 +Salmonella enterica subsp. enterica serovar Vinnorrhady 1967658 +Salmonella enterica subsp. enterica serovar Telelkebir 1967657 +Salmonella enterica subsp. enterica serovar Tarshyne 1967656 +Salmonella enterica subsp. enterica serovar Schwardzengrund 1967655 +Salmonella enterica subsp. enterica serovar Oritamerin 1967654 +Salmonella enterica subsp. enterica serovar Onireke 1967653 +Salmonella enterica subsp. enterica serovar Mbadaka 1967652 +Salmonella enterica subsp. enterica serovar Manhatten 1967651 +Salmonella enterica subsp. enterica serovar Lomalinda 1967650 +Salmonella enterica subsp. enterica serovar Kohbu 1967649 +Salmonella enterica subsp. enterica serovar Kambole 1967648 +Salmonella enterica subsp. enterica serovar Jukestown 1967647 +Salmonella enterica subsp. enterica serovar Ibadan 1967646 +Salmonella enterica subsp. enterica serovar Bredeny 1967645 +Salmonella enterica subsp. enterica serovar Braenddrup 1967644 +Salmonella enterica subsp. enterica serovar Albert 1967643 +Salmonella enterica subsp. enterica serovar Agbeni 1967642 +"Salmonella enterica subsp. enterica serovar 9,12:l,z28:-" 1967639 +"Salmonella enterica subsp. enterica serovar 4,12:b:-" 1967638 +"Salmonella enterica subsp. enterica serovar 6,7:lw:-" 1967637 +Salmonella enterica subsp. enterica serovar 6.8:eh:- 1967636 +"Salmonella enterica subsp. arizonae serovar 56:z4,z23,(z32):-" 1967630 +"Salmonella enterica subsp. VII serovar 40:z4,z24:[z39]" 1967625 +"Salmonella enterica subsp. salamae serovar 60:g,m,t:z6" 1967624 +Salmonella enterica subsp. salamae serovar 58:a:- 1967623 +Salmonella enterica subsp. salamae serovar 53:lz28:z39 1967622 +Salmonella enterica subsp. salamae serovar 50:b:z6 1967621 +Salmonella enterica subsp. salamae serovar 47:d:z39 1967620 +"Salmonella enterica subsp. salamae serovar 47:b:1,5" 1967619 +"Salmonella enterica subsp. salamae serovar 47:a:1,5" 1967618 +"Salmonella enterica subsp. salamae serovar 42:z:1,5" 1967617 +"Salmonella enterica subsp. salamae serovar 42:b:1,5" 1967616 +"Salmonella enterica subsp. salamae serovar 30:1,z28:z6" 1967615 +Salmonella enterica subsp. salamae serovar 18:z10:z6 1967614 +"Salmonella enterica subsp. salamae serovar 13,22:z29:enx" 1967613 +"Salmonella enterica subsp. houtenae serovar 50:z4,z23:-" 1967612 +"Salmonella enterica subsp. houtenae serovar 45:g,z51:-" 1967611 +"Salmonella enterica subsp. houtenae serovar 44:z4,z24:-" 1967610 +Salmonella enterica subsp. houtenae serovar 44:z36[z38]:- 1967609 +"Salmonella enterica subsp. houtenae serovar 43:z4,z32:-" 1967608 +"Salmonella enterica subsp. houtenae serovar 41:z4,z23:-" 1967607 +"Salmonella enterica subsp. houtenae serovar 21:z4,z23:-" 1967606 +"Salmonella enterica subsp. houtenae serovar 11:z4,z23:-" 1967605 +"Salmonella enterica subsp. houtenae serovar 1,40:z4,z32:-" 1967604 +Salmonella enterica subsp. enterica serovar Tornow 1967601 +Salmonella enterica subsp. enterica serovar Saphra 1967600 +Salmonella enterica subsp. enterica serovar Gera 1967599 +Salmonella enterica subsp. enterica serovar Duisberg 1967598 +Salmonella enterica subsp. enterica serovar Decateur 1967597 +Salmonella enterica subsp. enterica serovar Brisbane 1967596 +"Salmonella enterica subsp. enterica serovar 6,7:c:1,5" 1967595 +"Salmonella enterica subsp. enterica serovar 6,7,14:g,m[p],s:[1,2,7]" 1967594 +"Salmonella enterica subsp. enterica serovar 1,9,12:-:-" 1967593 +Salmonella enterica subsp. diarizonae serovar 65:(k):z 1967592 +"Salmonella enterica subsp. diarizonae serovar 61:l,v:1,5,7" 1967591 +Salmonella enterica subsp. diarizonae serovar 60:r:z 1967590 +"Salmonella enterica subsp. diarizonae serovar 48:z10:e,n,x,z15" 1967589 +"Salmonella enterica subsp. arizonae serovar 48:z4,z24:-" 1967584 +"Salmonella enterica subsp. arizonae serovar 48:z4,z23,z32:-" 1967583 +"Salmonella enterica subsp. arizonae serovar 48:g,z51:-" 1967582 +"Salmonella enterica subsp. arizonae serovar 18:z4,z32:-" 1967581 +"Salmonella enterica subsp. salamae serovar 1,9,12:g,mst:1.5z42" 1965114 +"Salmonella enterica subsp. diarizonae serovar Ar 38:1,v:z53,z54" 1965112 +Salmonella enterica subsp. diarizonae serovar Ar 28:27-21 1965111 +"Salmonella enterica subsp. arizonae serovar Ar 10a10b:17,20" 1965110 +"Salmonella enterica subsp. arizonae serovar Ar 1,3:1,3,11" 1965108 +Salmonella enterica subsp. salamae serovar Phoenix 1965107 +Salmonella enterica subsp. enterica serovar Dahlem 1965104 +Salmonella enterica subsp. enterica serovar Berkeley 1965103 +Salmonella enterica subsp. salamae serovar Freemantle 1965099 +Salmonella enterica subsp. salamae serovar Springs 1965098 +"Salmonella enterica subsp. salamae serovar 9,12:mt:e,n,x" 1965097 +Salmonella enterica subsp. salamae serovar Westpark 1964838 +Salmonella enterica subsp. salamae serovar Lindrick 1964836 +Salmonella enterica subsp. salamae serovar Haarlem 1964835 +Salmonella enterica subsp. enterica serovar Canoga 1964834 +Salmonella enterica subsp. indica serovar Vrindaban 1964833 +"Salmonella enterica subsp. indica serovar 41:b:1,7" 1964832 +Salmonella enterica subsp. indica serovar Marseille 1964831 +Salmonella enterica subsp. houtenae serovar 43:z4:z23 1964828 +"Salmonella enterica subsp. houtenae serovar Ar 38:z4,z23" 1964827 +"Salmonella enterica subsp. diarizonae serovar Ar 5,29:33-31" 1964826 +Salmonella enterica subsp. enterica serovar Birkenhead 1962641 +Salmonella enterica subsp. enterica serovar Bristol 1962640 +Salmonella enterica subsp. enterica serovar Daytona 1962639 +Salmonella enterica subsp. enterica serovar Ealing 1962638 +Salmonella enterica subsp. enterica serovar Irumu 1962266 +Salmonella enterica subsp. enterica serovar Kimuenza 1954180 +Salmonella enterica subsp. enterica serovar Jerusalem 1954179 +Salmonella enterica subsp. enterica serovar Durham 1954178 +Salmonella enterica subsp. enterica serovar Denver 1954177 +Salmonella enterica subsp. houtenae serovar 40gt:- 1925258 +Salmonella enterica subsp. enterica serovar Hayindogo 1911681 +Salmonella enterica subsp. diarizonae serovar 59:[k]:z35 1911137 +Salmonella enterica subsp. diarizonae serovar 38:[k]:- 1911136 +"Salmonella enterica subsp. diarizonae serovar 16:z10:e,n,x,z15" 1911135 +Salmonella enterica subsp. enterica serovar Widemarsh 1906180 +Salmonella enterica subsp. enterica serovar Stratford 1755688 +Salmonella enterica subsp. enterica serovar Cremieu 1755687 +Salmonella enterica subsp. enterica serovar Hiduddify 1729588 +Salmonella enterica subsp. enterica serovar Daarle 1729587 +Salmonella enterica subsp. salamae serovar 57:z29:z42 1710356 +"Salmonella enterica subsp. enterica serovar 4,5,12:i-" 1697389 +Salmonella enterica subsp. enterica serovar Choleraesuis var. Kunzendorf 1630946 +Salmonella enterica subsp. enterica serovar Mishmarhaemek 1629955 +Salmonella enterica subsp. enterica serovar Typhimurium var. 5- 1620419 +"Salmonella enterica subsp. enterica serovar 4,12:d:-" 1620418 +"Salmonella enterica subsp. enterica serovar 4,5:i:-" 1619252 +Salmonella enterica subsp. enterica serovar Vejle 1603037 +"Salmonella enterica subsp. enterica serovar 4,12:i:1,2" 1522101 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i" 1522100 +Salmonella enterica subsp. enterica serovar Agoueve 1505961 +Salmonella enterica subsp. enterica serovar Paratyphi B var. L-tartrate + 1487537 +Salmonella enterica subsp. enterica serovar Anatum var. 15+ 1486045 +"Salmonella enterica subsp. enterica serovar 3,19:-:z27" 1486039 +"Salmonella enterica subsp. enterica serovar Typhimurium var. monophasic 4,[5],12:i:-" 1461749 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1810 1454647 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1911 1454646 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC 2009K-2059 1454645 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC 2009K-1640 1454644 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC 2011K-1702 1454643 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC 2011K-0870 1454642 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC 2010K-1587 1454641 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC H2662 1454640 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1899 1454639 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1898 1454638 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1897 1454637 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1896 1454636 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1881 1454635 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1880 1454634 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1879 1454633 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1811 1454632 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1809 1454631 +Salmonella enterica subsp. enterica serovar Typhimurium str. USDA-ARS-USMARC-1808 1454630 +Salmonella enterica subsp. enterica serovar Newport str. CDC 2012K-0663 1454629 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1935 1454628 +Salmonella enterica subsp. enterica serovar Newport str. CDC 2010K-2159 1454627 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1933 1454626 +Salmonella enterica subsp. enterica serovar Newport str. CDC 2009K-1331 1454625 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1931 1454624 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1930 1454623 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1929 1454622 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1928 1454621 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1927 1454620 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1926 1454619 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1925 1454618 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1924 1454617 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1923 1454616 +Salmonella enterica subsp. enterica serovar Newport str. USDA-ARS-USMARC-1922 1454615 +Salmonella enterica subsp. enterica serovar Newport str. CDC 2012K-0938 1454614 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 2010K-0257 1454613 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 2013K-0218 1454612 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 2012K-1544 1454611 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 2011K-1674 1454610 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 2009K-0792 1454609 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 08-1942 1454608 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 07-0954 1454607 +Salmonella enterica subsp. enterica serovar Montevideo str. CDC 86-0391 1454606 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1905 1454605 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1904 1454604 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1903 1454603 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1902 1454602 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1913 1454601 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1912 1454600 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1900 1454599 +Salmonella enterica subsp. enterica serovar Montevideo str. USDA-ARS-USMARC-1901 1454598 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1782 1454597 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1781 1454596 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1780 1454595 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1766 1454594 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1765 1454593 +Salmonella enterica subsp. enterica serovar Anatum str. CDC 06-0532 1454592 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1763 1454591 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1175 1454590 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1728 1454589 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1677 1454588 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1676 1454587 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1736 1454586 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1735 1454585 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1727 1454584 +Salmonella enterica subsp. enterica serovar Anatum str. USDA-ARS-USMARC-1783 1454583 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 43482" 1444295 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 43481" 1444294 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 43480" 1444293 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 43479" 1444292 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 43478" 1444291 +Salmonella enterica subsp. enterica serovar Typhi str. STH2370 1443995 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N23791 1443276 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N42459 1439851 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N42236 1439850 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N41903 1439849 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N38848 1439848 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N35518 1439847 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N35495PS 1439846 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N34868PS 1439845 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N32760 1439844 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N32599PS 1439843 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N32597PS 1439842 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N32590PS 1439841 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N31594 1439840 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N29379 1439839 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N23771 1439838 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N23532 1439837 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N20272 1439836 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N20078 1439835 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N19983 1439834 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N15773 1439833 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N15228 1439832 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N13139 1439831 +Salmonella enterica subsp. enterica serovar Infantis str. CVM 23729 1439830 +Salmonella enterica subsp. enterica serovar Infantis str. CVM 23697 1439829 +Salmonella enterica subsp. enterica serovar Infantis str. CVM 22582 1439828 +Salmonella enterica subsp. enterica serovar Infantis str. CVM 22577 1439827 +Salmonella enterica subsp. enterica serovar Infantis str. CVM 17958 1439826 +Salmonella enterica subsp. enterica serovar Infantis str. CVM 818 1439825 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N26093 1436137 +Salmonella enterica subsp. enterica serovar Infantis str. CVM N29304 1436135 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal682 1432048 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal683 1432047 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal644 1432046 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal617 1430439 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal616 1430438 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal615 1430437 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal610 1430436 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal609 1430435 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal676 1430434 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal681 1430433 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal680 1430432 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal679 1430431 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal678 1430430 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal677 1430429 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. Sal185 1429917 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN002033 1429045 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120969 1412619 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120929 1412618 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120927 1412617 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121689 1412616 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120925 1412615 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120918 1412614 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120917 1412613 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120774 1412612 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120773 1412611 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120738 1412610 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120734 1412609 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120687 1412608 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120686 1412607 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120597 1412606 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120590 1412605 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120581 1412604 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120580 1412603 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120356 1412602 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120051 1412601 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100325 1412600 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100089 1412599 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100088 1412598 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121180 1412597 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121179 1412596 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121178 1412595 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121177 1412594 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121176 1412593 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121175 1412592 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20130348 1412591 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20130347 1412590 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20130346 1412589 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20130345 1412588 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090195 1412587 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100100 1412586 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090530 1412585 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100131 1412584 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121969 1412583 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121970 1412582 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121976 1412581 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121986 1412580 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121989 1412579 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121990 1412578 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20122022 1412577 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20122026 1412576 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20122031 1412575 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20122033 1412574 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20122045 1412573 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111561 1412572 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121812 1412571 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120916 1412570 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120994 1412569 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120497 1412568 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111554 1412567 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120555 1412566 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121671 1412565 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120765 1412564 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121746 1412563 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121747 1412562 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121672 1412561 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121748 1412560 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120677 1412559 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120968 1412558 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121542 1412557 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120496 1412556 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121765 1412555 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121744 1412554 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120697 1412553 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120469 1412552 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121753 1412551 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120722 1412550 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111510 1412549 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120219 1412548 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120229 1412547 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120240 1412546 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120498 1412545 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120505 1412544 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120548 1412543 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120970 1412542 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121750 1412541 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121751 1412540 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111514 1412539 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111515 1412538 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120528 1412537 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120544 1412536 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111576 1412535 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120685 1412534 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120775 1412533 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120776 1412532 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120963 1412531 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121004 1412530 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120200 1412529 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120213 1412528 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121826 1412527 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121825 1412526 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20121541 1412525 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094079 1412524 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20091739 1412523 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093538 1412522 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20090877 1412521 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093543 1412520 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093950 1412519 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094642 1412518 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20090419 1412517 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094383 1412516 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094389 1412515 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093421 1412514 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20090435 1412513 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093430 1412512 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093788 1412511 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093977 1412510 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093784 1412509 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20092320 1412508 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20095309 1412507 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20083456 1412506 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094301 1412505 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094350 1412504 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094803 1412503 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19982831 1412502 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19940857 1412501 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19930684 1412500 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19994216 1412499 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19983126 1412498 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19961622 1412497 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19971331 1412496 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20123395 1412495 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19943269 1412494 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19942384 1412493 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20095440 1412492 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094352 1412491 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20083636 1412490 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20085285 1412489 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20082034 1412488 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19960848 1412487 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19981857 1412486 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19981522 1412485 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094521 1412484 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20121703 1412483 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20100349 1412482 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20100239 1412481 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20084644 1412480 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094177 1412479 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20084824 1412478 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20084384 1412477 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20094682 1412476 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA20093266 1412475 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19970769 1412474 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19970510 1412473 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19980677 1412472 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120009 1412471 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120008 1412470 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120007 1412469 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120005 1412468 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120003 1412467 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20120002 1412466 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100134 1412465 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100130 1412464 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090884 1412463 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090531 1412462 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090332 1412461 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090135 1412460 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090193 1412459 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100103 1412458 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20100101 1412457 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110222 1412456 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110221 1412455 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090698 1412454 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20090641 1412453 +Salmonella enterica subsp. enterica serovar Enteritidis str. SA19992322 1412452 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110223 1412451 +Salmonella enterica subsp. enterica serovar Typhimurium var. 5- str. CFSAN004345 1410937 +Salmonella enterica subsp. enterica serovar Montevideo str. CFSAN004346 1410936 +Salmonella enterica subsp. enterica serovar Muenster str. CFSAN004344 1410933 +Salmonella enterica subsp. enterica serovar Give var. 15 str. CFSAN004343 1410932 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001697 1410931 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001692 1410930 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001691 1410929 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001690 1410928 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001681 1410927 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001680 1410926 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001679 1410925 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001673 1410924 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001671 1410923 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001670 1410922 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001669 1410921 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001590 1410920 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001589 1410919 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001587 1410918 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001674 1410917 +Salmonella enterica subsp. enterica serovar Cerro str. CFSAN001588 1410916 +Salmonella enterica subsp. enterica serovar Agona str. 24249 1406860 +Salmonella enterica subsp. enterica serovar Hull 1403564 +Salmonella enterica subsp. enterica serovar Derby str. T12 1401650 +Salmonella enterica subsp. enterica serovar Typhimurium str. STM709 1401642 +Salmonella enterica subsp. enterica serovar Enteritidis str. SHSE004 1400814 +Salmonella enterica subsp. enterica serovar Enteritidis str. SHSE003 1400813 +Salmonella enterica subsp. enterica serovar Enteritidis str. SHSE002 1400812 +Salmonella enterica subsp. enterica serovar Enteritidis str. SHSE001 1400811 +Salmonella enterica subsp. enterica serovar Newport str. CVM18005 1399792 +Salmonella enterica subsp. enterica serovar Newport str. CVM34519 1399791 +Salmonella enterica subsp. enterica serovar Newport str. CVM24403 1399790 +Salmonella enterica subsp. enterica serovar Newport str. CVM22443 1399789 +Salmonella enterica subsp. enterica serovar Newport str. CVM22699 1399788 +Salmonella enterica subsp. enterica serovar Newport str. CVM22697 1399787 +Salmonella enterica subsp. enterica serovar Newport str. CVM20775 1399786 +Salmonella enterica subsp. enterica serovar Newport str. CVM17619 1399785 +Salmonella enterica subsp. enterica serovar Newport str. CVM30171 1399784 +Salmonella enterica subsp. enterica serovar Newport str. CVM22707 1399783 +Salmonella enterica subsp. enterica serovar Newport str. CVM20776 1399782 +Salmonella enterica subsp. enterica serovar Newport str. CVM18000 1399781 +Salmonella enterica subsp. enterica serovar Newport str. CVM21537 1399780 +Salmonella enterica subsp. enterica serovar Newport str. CVM79_1357 1399779 +Salmonella enterica subsp. enterica serovar Newport str. CVM79_1594 1399778 +Salmonella enterica subsp. enterica serovar Newport str. CVM80_2288 1399777 +Salmonella enterica subsp. enterica serovar Newport str. CVM75_1280 1399776 +Salmonella enterica subsp. enterica str. CFSAN004167 1399114 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004196 1399107 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004195 1399106 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004194 1399105 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004193 1399104 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004192 1399103 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004191 1399102 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004190 1399101 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004189 1399100 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004188 1399099 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004166 1399098 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004165 1399097 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004164 1399096 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004163 1399095 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004161 1399094 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004160 1399093 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004159 1399092 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004158 1399091 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004157 1399090 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004156 1399089 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004155 1399088 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004154 1399087 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004153 1399086 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004152 1399085 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004151 1399084 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004150 1399083 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004149 1399082 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004147 1399081 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004146 1399080 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004145 1399079 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004144 1399078 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004143 1399077 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004142 1399076 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004141 1399075 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004140 1399074 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004139 1399073 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004137 1399072 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004136 1399071 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004135 1399070 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004133 1399069 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004131 1399068 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004069 1399062 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004068 1399061 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004038 1399060 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004037 1399059 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004036 1399058 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004035 1399057 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004034 1399056 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004033 1399055 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004032 1399054 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004031 1399053 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004030 1399052 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004029 1399051 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004028 1399050 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004027 1399049 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004026 1399048 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004025 1399047 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004023 1399046 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004022 1399045 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004021 1399044 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004020 1399043 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004019 1399042 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004018 1399041 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003975 1399040 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003974 1399039 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003973 1399038 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003972 1399037 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003971 1399036 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003970 1399035 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003969 1399034 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003967 1399033 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003966 1399032 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003965 1399031 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003962 1399030 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003961 1399029 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003960 1399028 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003950 1399027 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003948 1399026 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003945 1399025 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003944 1399024 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003943 1399023 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003942 1399022 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003938 1399021 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003937 1399020 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003936 1399019 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003935 1399018 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003934 1399017 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN004342 1397995 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004129 1397994 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004128 1397993 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004126 1397992 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004125 1397991 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004123 1397990 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004121 1397989 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004120 1397988 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004119 1397987 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004118 1397986 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004117 1397985 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN004116 1397984 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004067 1397983 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004066 1397982 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004065 1397981 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004064 1397980 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004063 1397979 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004062 1397978 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004061 1397977 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004060 1397976 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004059 1397975 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004055 1397974 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004054 1397973 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004052 1397972 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004051 1397971 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004050 1397970 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004049 1397969 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004048 1397968 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004047 1397967 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004046 1397966 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004045 1397965 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004044 1397964 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004043 1397963 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004042 1397962 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN004041 1397961 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004017 1397960 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004016 1397959 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004015 1397958 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004014 1397957 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004013 1397956 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004012 1397955 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004011 1397954 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004010 1397953 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004005 1397952 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004004 1397951 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004002 1397950 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004001 1397949 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN004000 1397948 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003999 1397947 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003964 1397946 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN003963 1397945 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN003835 1397944 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN003834 1397943 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN003833 1397942 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N31597" 1395122 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N29354" 1395121 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N26928" 1395120 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N26626" 1395119 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N26625" 1395118 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N26624" 1395117 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N25373" 1395116 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N23850" 1395115 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N20028" 1395114 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N18554" 1395113 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N18503" 1395112 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N18383" 1395111 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N9135" 1395110 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N7307" 1395109 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N6509" 1395108 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N4410" 1395107 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N27" 1395106 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM N5" 1395105 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 32457" 1395104 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:- str. CVM 32450" 1395103 +Salmonella enterica subsp. enterica serovar Typhimurium str. 135901 1387351 +Salmonella enterica subsp. enterica serovar Typhimurium str. 135497 1387350 +Salmonella enterica subsp. enterica serovar Typhimurium str. 130302 1387349 +Salmonella enterica subsp. enterica serovar Typhimurium str. 128781 1387348 +Salmonella enterica subsp. enterica serovar Enteritidis str. 122205 1387347 +Salmonella enterica subsp. enterica serovar Typhimurium str. 119016 1387346 +Salmonella enterica subsp. enterica serovar Typhimurium str. 116045 1387345 +Salmonella enterica subsp. enterica serovar Typhimurium str. 114115 1387344 +Salmonella enterica subsp. enterica serovar Typhimurium str. 113599 1387343 +Salmonella enterica subsp. enterica serovar Typhimurium str. 109456 1387342 +Salmonella enterica subsp. enterica serovar Typhimurium str. 108402 1387341 +Salmonella enterica subsp. enterica serovar Typhimurium str. 106041 1387340 +Salmonella enterica subsp. enterica serovar Typhimurium str. 104772 1387339 +Salmonella enterica subsp. enterica serovar Typhimurium str. 102923 1387338 +Salmonella enterica subsp. enterica serovar Typhimurium str. 102690 1387337 +Salmonella enterica subsp. enterica serovar Typhimurium str. 102261 1387336 +Salmonella enterica subsp. enterica serovar Typhimurium str. 101966 1387335 +Salmonella enterica subsp. enterica serovar Typhimurium str. 98787 1387334 +Salmonella enterica subsp. enterica serovar Typhimurium str. 98346 1387333 +Salmonella enterica subsp. enterica serovar Typhimurium str. 96521 1387332 +Salmonella enterica subsp. enterica serovar Typhimurium str. 95799 1387331 +"Salmonella enterica subsp. enterica serovar 9,12:l,v:- str. 94293" 1387330 +Salmonella enterica subsp. arizonae serovar 62:z36:- str. RKS2983 1386967 +Salmonella enterica subsp. enterica serovar Isangi 1386015 +Salmonella enterica subsp. enterica serovar Typhimurium str. 87541 1385959 +Salmonella enterica subsp. enterica serovar Typhimurium str. 85982 1385958 +Salmonella enterica subsp. enterica serovar Enteritidis str. C76 1385957 +Salmonella enterica subsp. enterica serovar Enteritidis str. C75 1385956 +Salmonella enterica subsp. enterica serovar Isangi str. C59 1385955 +Salmonella enterica subsp. enterica serovar Isangi str. C58 1385954 +Salmonella enterica subsp. enterica serovar Isangi str. C54 1385953 +Salmonella enterica subsp. enterica serovar Enteritidis str. C49 1385952 +Salmonella enterica subsp. enterica serovar Enteritidis str. BEAR091751-04 1385951 +Salmonella enterica subsp. enterica serovar Enteritidis str. BEAR083469-02 1385950 +Salmonella enterica subsp. enterica serovar Enteritidis str. BEAR078296-01 1385949 +Salmonella enterica subsp. enterica serovar Enteritidis str. BEAR072987-03 1385948 +Salmonella enterica subsp. enterica serovar Enteritidis str. 22087 1385947 +Salmonella enterica subsp. enterica serovar Enteritidis str. 22079 1385946 +Salmonella enterica subsp. enterica serovar Enteritidis str. 21046 1385945 +Salmonella enterica subsp. enterica serovar Monophasic 1384444 +Salmonella enterica subsp. enterica serovar Enteritidis str. 21027 1384075 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003488 1383922 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003487 1383921 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003486 1383920 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003485 1383919 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003484 1383918 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003483 1383917 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003482 1383916 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003481 1383915 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003480 1383914 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003479 1383913 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003478 1383912 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003477 1383911 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003476 1383910 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003475 1383909 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003474 1383908 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003473 1383907 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003472 1383906 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003471 1383905 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003470 1383904 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003469 1383903 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003468 1383902 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003467 1383901 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003466 1383900 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003465 1383899 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003464 1383898 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003463 1383897 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003462 1383896 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003461 1383895 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN003460 1383894 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST4848 1379271 +Salmonella enterica subsp. enterica serovar Abortusovis str. SS44 1367492 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST1489 1365218 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST78896 1365217 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm7 1352603 +Salmonella enterica subsp. enterica serovar Namur str. 05-2929 1348563 +Salmonella enterica subsp. enterica serovar Namur 1348562 +Salmonella enterica subsp. enterica serovar Infantis str. 335-3 1347789 +Salmonella enterica subsp. salamae str. DMA-1 1346789 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002070 1345693 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001920 1344986 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001919 1344985 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001918 1344984 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001917 1344983 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001916 1344982 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001915 1344981 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001914 1344980 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001913 1344979 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001911 1344978 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001910 1344977 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001909 1344976 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001908 1344975 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001907 1344974 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001905 1344973 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001903 1344972 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001902 1344971 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001900 1344970 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001899 1344969 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001898 1344968 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001897 1344967 +Salmonella enterica subsp. enterica serovar Gallinarum str. MB4523 1340857 +Salmonella enterica subsp. enterica serovar Gallinarum str. SG9Rb 1340856 +Salmonella enterica subsp. enterica serovar Gallinarum str. SG9Ra 1340855 +"Salmonella enterica subsp. enterica serovar 4,[5],12:b:-" 1340177 +"Salmonella enterica subsp. enterica serovar Typhimurium var. monophasic 4,5,12:i:-" 1331664 +Salmonella enterica subsp. enterica serovar Gallinarum/pullorum str. FCAV198 1331043 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001912 1331013 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001906 1331012 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001904 1331011 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN001901 1331010 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5915 1330034 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5894 1330033 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5828 1330032 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5822 1330031 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5803 1330030 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5884 1330029 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5816 1330028 +Salmonella enterica subsp. enterica serovar Typhimurium str. DA5810 1330027 +Salmonella enterica subsp. enterica serovar Typhimurium str. JB124 1330026 +Salmonella enterica subsp. enterica serovar Infantis str. 119944 1329901 +Salmonella enterica subsp. enterica serovar Worthington str. BCH-7253 1329889 +Salmonella enterica subsp. enterica serovar Worthington str. BCH-5715 1329888 +Salmonella enterica subsp. enterica serovar Worthington str. BCH-4719 1329887 +Salmonella enterica subsp. enterica serovar Worthington str. BCH-3194 1329886 +Salmonella enterica subsp. enterica serovar Worthington str. BCH-3008 1329885 +Salmonella enterica subsp. enterica serovar Muenchen str. 08-1125 1328334 +Salmonella enterica subsp. enterica serovar Muenchen str. 2009K-0951 1328333 +Salmonella enterica subsp. enterica serovar Stanley str. 06-0538 1328332 +Salmonella enterica subsp. enterica serovar Poona str. 2010K-2244 1328331 +Salmonella enterica subsp. enterica serovar Mbandaka str. 2012K-0273 1328330 +Salmonella enterica subsp. enterica serovar Hartford str. 2012K-0272 1328329 +Salmonella enterica subsp. enterica serovar Hadar str. 2012K-0272 1328328 +Salmonella enterica subsp. enterica serovar Bareilly str. 07-0873 1328327 +Salmonella enterica subsp. enterica serovar Anatum str. 06-0532 1328326 +Salmonella enterica subsp. enterica serovar Manhattan str. 111113 1327958 +Salmonella enterica subsp. enterica serovar Newport str. SHSN007 1324342 +Salmonella enterica subsp. enterica serovar Newport str. SHSN008 1324341 +Salmonella enterica subsp. enterica serovar Newport str. SHSN006 1324340 +Salmonella enterica subsp. enterica serovar Newport str. SHSN005 1324339 +Salmonella enterica subsp. enterica serovar Newport str. SHSN004 1324338 +Salmonella enterica subsp. enterica serovar Newport str. SHSN003 1324337 +Salmonella enterica subsp. enterica serovar Newport str. SHSN002 1324336 +Salmonella enterica subsp. enterica serovar Newport str. SHSN001 1324335 +Salmonella enterica subsp. enterica serovar Newport str. SHSN014 1324323 +Salmonella enterica subsp. enterica serovar Newport str. SHSN013 1324322 +Salmonella enterica subsp. enterica serovar Newport str. SHSN012 1324321 +Salmonella enterica subsp. enterica serovar Newport str. SHSN011 1324320 +Salmonella enterica subsp. enterica serovar Newport str. SHSN010 1324319 +Salmonella enterica subsp. enterica serovar Newport str. SHSN009 1324318 +Salmonella enterica subsp. enterica serovar Oranienburg str. S-76 1323580 +Salmonella enterica subsp. enterica serovar Saintpaul str. S-70 1321366 +Salmonella enterica subsp. enterica str. xld 1320353 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. 3114 1320309 +Salmonella enterica subsp. enterica serovar Cubana str. CVM42234 1314885 +Salmonella enterica subsp. enterica serovar Champaign str. ATCC 700139 1311784 +Salmonella enterica subsp. enterica serovar Champaign 1311783 +Salmonella enterica subsp. enterica serovar Etterbeek str. ATCC 19128 1311782 +Salmonella enterica subsp. enterica serovar Etterbeek 1311781 +Salmonella enterica subsp. enterica serovar Ngili str. ATCC 19127 1311780 +Salmonella enterica subsp. enterica serovar Ngili 1311779 +Salmonella enterica subsp. enterica serovar Kitenge str. ATCC 19126 1311778 +Salmonella enterica subsp. enterica serovar Kitenge 1311777 +Salmonella enterica subsp. enterica serovar Kahla str. ATCC 17980 1311776 +Salmonella enterica subsp. enterica serovar Kahla 1311775 +Salmonella enterica subsp. enterica serovar Typhimurium str. L847 1310133 +Salmonella enterica subsp. enterica serovar Typhimurium str. L796 1310132 +Salmonella enterica subsp. enterica serovar Typhimurium str. L904 1310131 +Salmonella enterica subsp. enterica serovar Typhimurium str. L927 1310130 +Salmonella enterica subsp. enterica serovar Typhimurium str. L852 1310129 +Salmonella enterica subsp. enterica serovar Typhimurium str. L945 1310128 +"Salmonella enterica subsp. indica serovar 45:a:e,n,x" 1307500 +"Salmonella enterica subsp. indica serovar 11:b:e,n,x" 1307499 +"Salmonella enterica subsp. houtenae serovar 40:z4,z24:-" 1307498 +"Salmonella enterica subsp. houtenae serovar 16:z4,z32:-" 1307497 +"Salmonella enterica subsp. houtenae serovar 1,40:g,z51:-" 1307496 +"Salmonella enterica subsp. diarizonae serovar 50:1,2,3:k:z" 1307495 +Salmonella enterica subsp. diarizonae serovar 38:[k]:z35:- 1307494 +Salmonella enterica subsp. enterica serovar Aqua str. NVSL2001 1302616 +Salmonella enterica subsp. enterica serovar Aqua 1302615 +Salmonella enterica subsp. enterica serovar Typhimurium str. W2342 1300339 +Salmonella enterica subsp. diarizonae str. CFSAN000558 1299300 +Salmonella enterica subsp. diarizonae str. CFSAN000553 1299299 +Salmonella enterica subsp. arizonae str. CFSAN000561 1299295 +Salmonella enterica subsp. arizonae str. CFSAN000560 1299294 +Salmonella enterica subsp. salamae str. CFSAN000559 1299293 +Salmonella enterica subsp. houtenae str. CFSAN000557 1299292 +Salmonella enterica subsp. houtenae str. CFSAN000552 1299291 +Salmonella enterica subsp. VII str. CFSAN000554 1299288 +Salmonella enterica subsp. VII str. CFSAN000550 1299287 +Salmonella enterica subsp. enterica serovar Wein str. CFSAN000657 1299280 +Salmonella enterica subsp. enterica serovar Wein str. CFSAN000656 1299279 +Salmonella enterica subsp. enterica serovar Typhisuis str. CFSAN000655 1299278 +Salmonella enterica subsp. enterica serovar Typhisuis str. CFSAN000654 1299277 +Salmonella enterica subsp. enterica serovar Typhi str. CFSAN000628 1299276 +Salmonella enterica subsp. enterica serovar Typhi str. CFSAN000626 1299275 +Salmonella enterica subsp. enterica serovar Thompson str. CFSAN000625 1299274 +Salmonella enterica subsp. enterica serovar Stanley str. CFSAN000623 1299273 +Salmonella enterica subsp. enterica serovar Sendai str. CFSAN000621 1299272 +Salmonella enterica subsp. enterica serovar Pullorum str. CFSAN000606 1299269 +Salmonella enterica subsp. enterica serovar Mbandaka str. CFSAN000887 1299267 +Salmonella enterica subsp. enterica serovar Miami str. CFSAN000580 1299266 +Salmonella enterica subsp. enterica serovar Miami str. CFSAN000579 1299265 +Salmonella enterica subsp. enterica serovar Gallinarum str. CFSAN000571 1299262 +Salmonella enterica subsp. enterica serovar Decatur str. CFSAN000563 1299261 +Salmonella enterica subsp. enterica serovar Brandenburg str. CFSAN000888 1299260 +Salmonella enterica subsp. enterica serovar Infantis str. CFSAN000522 1299258 +Salmonella enterica subsp. enterica serovar Infantis str. CFSAN000521 1299257 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN000911 1299256 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN000910 1299255 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN001739 1299254 +Salmonella enterica subsp. enterica serovar Senftenberg str. CFSAN000622 1299253 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000619 1299250 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000618 1299249 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000617 1299248 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000615 1299247 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000612 1299246 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000611 1299245 +Salmonella enterica subsp. enterica serovar Saintpaul str. CFSAN000610 1299244 +Salmonella enterica subsp. enterica serovar Paratyphi C str. CFSAN000605 1299243 +Salmonella enterica subsp. enterica serovar Paratyphi C str. CFSAN000604 1299242 +Salmonella enterica subsp. enterica serovar Paratyphi C str. CFSAN000603 1299241 +Salmonella enterica subsp. enterica serovar Panama str. CFSAN000602 1299240 +Salmonella enterica subsp. enterica serovar Panama str. CFSAN000601 1299239 +Salmonella enterica subsp. enterica serovar Panama str. CFSAN000600 1299238 +Salmonella enterica subsp. enterica serovar Montevideo str. CFSAN000249 1299234 +Salmonella enterica subsp. enterica serovar Montevideo str. CFSAN000242 1299233 +Salmonella enterica subsp. enterica serovar Javiana str. CFSAN000906 1299232 +Salmonella enterica subsp. enterica serovar Javiana str. CFSAN000905 1299231 +Salmonella enterica subsp. enterica serovar Javiana str. CFSAN000904 1299230 +Salmonella enterica subsp. enterica serovar Javiana str. CFSAN000902 1299229 +Salmonella enterica subsp. enterica serovar Javiana str. CFSAN000908 1299228 +Salmonella enterica subsp. enterica serovar Dublin str. CFSAN000518 1299227 +Salmonella enterica subsp. enterica serovar Dublin str. CFSAN000517 1299226 +Salmonella enterica subsp. enterica serovar Dublin str. CFSAN000516 1299225 +Salmonella enterica subsp. enterica serovar Derby str. CFSAN000566 1299224 +Salmonella enterica subsp. enterica serovar Derby str. CFSAN000565 1299223 +Salmonella enterica subsp. enterica serovar Derby str. CFSAN000564 1299222 +Salmonella enterica subsp. enterica serovar Choleraesuis str. CFSAN000515 1299221 +Salmonella enterica subsp. enterica serovar Choleraesuis str. CFSAN000514 1299220 +Salmonella enterica subsp. enterica serovar Choleraesuis str. CFSAN000513 1299219 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN001774 1299218 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN001773 1299217 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN001772 1299216 +Salmonella enterica subsp. enterica serovar Anatum str. CFSAN000511 1299215 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000599 1299212 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000598 1299211 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000597 1299210 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001771 1299201 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001735 1299200 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001734 1299199 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001733 1299198 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001732 1299197 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001731 1299196 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001730 1299195 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001729 1299194 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001727 1299193 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000840 1299191 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000903 1299190 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000907 1299189 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000901 1299188 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000900 1299187 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000899 1299186 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000898 1299185 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000897 1299184 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000896 1299183 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000895 1299182 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000894 1299181 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000893 1299180 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000892 1299179 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000891 1299178 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000890 1299177 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000889 1299176 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000837 1299175 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000835 1299174 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000834 1299173 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000833 1299172 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000832 1299171 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000831 1299170 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000830 1299169 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000829 1299168 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000828 1299167 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000827 1299166 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN000826 1299165 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001117 1299164 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001116 1299163 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001114 1299162 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001113 1299161 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001111 1299160 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001110 1299159 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001107 1299158 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001106 1299157 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001104 1299156 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001103 1299155 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001101 1299154 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001100 1299153 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001098 1299152 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001097 1299151 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001770 1299149 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001769 1299148 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001768 1299147 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001767 1299146 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001766 1299145 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001765 1299144 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001764 1299143 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001763 1299142 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001762 1299141 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001761 1299140 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001760 1299139 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001759 1299138 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001758 1299137 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001757 1299136 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001756 1299135 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001755 1299134 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001754 1299133 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001753 1299132 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001752 1299131 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001751 1299130 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001750 1299129 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001749 1299128 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001748 1299127 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001747 1299126 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001746 1299125 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001745 1299124 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001744 1299123 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001743 1299122 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001742 1299121 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001741 1299120 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001740 1299119 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001738 1299118 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN001737 1299117 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN001736 1299115 +Salmonella enterica subsp. enterica serovar Typhimurium str. ATCC 14028 1299114 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000653 1299113 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000649 1299112 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000648 1299111 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000645 1299110 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000643 1299109 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000642 1299108 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000641 1299107 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000638 1299106 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000637 1299105 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000635 1299104 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000634 1299103 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000633 1299102 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000632 1299101 +Salmonella enterica subsp. enterica serovar Typhimurium str. CFSAN000629 1299100 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000596 1299099 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000595 1299098 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000594 1299097 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000593 1299096 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000592 1299095 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000591 1299094 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000590 1299093 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000589 1299092 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000588 1299091 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000587 1299090 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000586 1299089 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000585 1299088 +Salmonella enterica subsp. enterica serovar Muenchen str. CFSAN000583 1299087 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000539 1299086 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000532 1299085 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000531 1299084 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000549 1299083 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000548 1299082 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000547 1299081 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000546 1299080 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000545 1299079 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000542 1299078 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000541 1299077 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000540 1299076 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000537 1299075 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000536 1299074 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000535 1299073 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000534 1299072 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000533 1299071 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000530 1299070 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000529 1299069 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000528 1299068 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000527 1299067 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000526 1299066 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000525 1299065 +Salmonella enterica subsp. enterica serovar Paratyphi B str. CFSAN000524 1299064 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN000354 1299057 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN000353 1299056 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002075 1299053 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002074 1299052 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002073 1299051 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002072 1299050 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002071 1299049 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002068 1299048 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002067 1299047 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002066 1299046 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002065 1299045 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002064 1299044 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002063 1299043 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002062 1299042 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002061 1299041 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002060 1299040 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002059 1299039 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002058 1299038 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002057 1299037 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002056 1299036 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN000578 1299035 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN000577 1299034 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN000576 1299033 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN000573 1299032 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000104 1299012 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000103 1299011 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000102 1299010 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000100 1299009 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000099 1299008 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000096 1299007 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000094 1299006 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000089 1299005 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000087 1299004 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000086 1299003 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000085 1299002 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000083 1299001 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000082 1299000 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000081 1298999 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000075 1298998 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000074 1298997 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000072 1298996 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000070 1298995 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000069 1298994 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000067 1298993 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000066 1298992 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000060 1298991 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000059 1298990 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000054 1298989 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000053 1298988 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000052 1298987 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000044 1298986 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000041 1298985 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000040 1298984 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000036 1298983 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000035 1298982 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000034 1298981 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000030 1298980 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000028 1298979 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000027 1298978 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000024 1298977 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN000568 1298976 +Salmonella enterica subsp. enterica serovar Pullorum str. S06004 1298917 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4285 1288078 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4271 1288077 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4235 1288076 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4204 1288075 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4196 1288074 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-3258 1288073 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2660 1288072 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2639 1288071 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-1441 1288070 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-1044 1288069 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-0375 1288068 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-0358 1288067 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-0257 1288066 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4266 1287891 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4201 1287890 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4199 1287889 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-4194 1287888 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2349 1287886 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2341 1287885 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2325 1287884 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2280 1287883 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-1882 1287882 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14982 1287472 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14699 1287471 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14697 1287470 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-3973 1286818 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-3972 1286817 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2827 1286411 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2237 1286410 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-2008 1286409 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-1415 1286408 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-1413 1286407 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-1390 1286406 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-24729 1284340 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-25457 1284339 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-26550 1284338 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-26681 1284337 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-26778 1284336 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-26898 1284335 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-24078 1284334 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-23426 1284333 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-24683 1284332 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-22120 1284331 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-17211 1284330 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-21567 1284329 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-15721 1284328 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-16414 1284327 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-15432 1284326 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14487 1284325 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14089 1284324 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-12288 1284323 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-11922 1284322 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-12016 1284321 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-23418 1284320 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-12205 1284319 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-22891 1284318 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-12071 1284317 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-16608 1284316 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-19760 1284315 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-22983 1284314 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-18775 1284313 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-20343 1284312 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-18526 1284311 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-18401 1284310 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-18138 1284309 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-21687 1284308 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-21569 1284307 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-21313 1284306 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-21314 1284305 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-16076 1284304 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-19490 1284303 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-20418 1284302 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-20008 1284301 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-21190 1284300 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-17893 1284299 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-17892 1284298 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-17240 1284297 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14700 1284296 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-16086 1284295 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-18160 1284294 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-19824 1284293 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-17486 1284292 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14895 1284291 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14703 1284290 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14693 1284289 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-18137 1284288 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-19798 1284287 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-14426 1284286 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT1_09-1747 1284237 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT8_08-8253 1284236 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT8_08-3405 1284235 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT13_07-7071 1284234 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT13_07-4012 1284233 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT13_05-6566 1283309 +Salmonella enterica subsp. enterica serovar Cerro str. FSL R8-0245 1279006 +Salmonella enterica subsp. enterica serovar Newport str. Shandong_3 1275977 +Salmonella enterica subsp. enterica serovar Newport str. JS09102 1275976 +Salmonella enterica subsp. enterica serovar Newport str. Henan_3 1275975 +Salmonella enterica subsp. enterica serovar Newport str. SH111077 1275974 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN002069 1271864 +Salmonella enterica subsp. enterica serovar Cubana str. CFSAN002050 1271863 +Salmonella enterica subsp. enterica serovar Typhimurium var. 5- str. CFSAN001921 1271862 +Salmonella enterica subsp. enterica Serovar Typhimurium str. CFSAN002047 1271861 +Salmonella enterica subsp. enterica serovar Javiana str. CFSAN001992 1267753 +Salmonella enterica subsp. enterica serovar Agona str. 31.H.09 1265682 +Salmonella enterica subsp. enterica serovar Agona str. 26.F.98 1265681 +Salmonella enterica subsp. enterica serovar Agona str. 15.H.03 1265680 +Salmonella enterica subsp. enterica serovar Agona str. 10.A.05 1265679 +Salmonella enterica subsp. enterica serovar Agona str. 05.O.06 1265678 +Salmonella enterica subsp. enterica serovar Agona str. 58.E.08 1265677 +Salmonella enterica subsp. enterica serovar Agona str. 53.F.08 1265676 +Salmonella enterica subsp. enterica serovar Agona str. 48.E.08 1265675 +Salmonella enterica subsp. enterica serovar Agona str. 72.A.52 1265674 +Salmonella enterica subsp. enterica serovar Agona str. 01.O.05 1265673 +Salmonella enterica subsp. enterica serovar Agona str. 70.E.05 1265672 +Salmonella enterica subsp. enterica serovar Agona str. 65.H.72 1265671 +Salmonella enterica subsp. enterica serovar Agona str. 43.E.09 1265670 +Salmonella enterica subsp. enterica serovar Agona str. 35.H.08 1265669 +Salmonella enterica subsp. enterica serovar Agona str. 19.F.03 1265668 +Salmonella enterica subsp. enterica serovar Agona str. 67.H.09 1265667 +Salmonella enterica subsp. enterica serovar Agona str. 62.H.72 1265666 +Salmonella enterica subsp. enterica serovar Agona str. 02.O.05 1265665 +Salmonella enterica subsp. enterica serovar Agona str. 60.O.08 1265664 +Salmonella enterica subsp. enterica serovar Agona str. 55.U.08 1265663 +Salmonella enterica subsp. enterica serovar Agona str. 50.E.08 1265662 +Salmonella enterica subsp. enterica serovar Agona str. 30.H.04 1265661 +Salmonella enterica subsp. enterica serovar Agona str. 24.H.04 1265660 +Salmonella enterica subsp. enterica serovar Agona str. 14.E.05 1265659 +Salmonella enterica subsp. enterica serovar Agona str. 09.F.08 1265658 +Salmonella enterica subsp. enterica serovar Agona str. 04.O.05 1265657 +Salmonella enterica subsp. enterica serovar Agona str. 57.A.08 1265656 +Salmonella enterica subsp. enterica serovar Agona str. 52.F.08 1265655 +Salmonella enterica subsp. enterica serovar Agona str. 47.E.09 1265654 +Salmonella enterica subsp. enterica serovar Agona str. 45.E.09 1265653 +Salmonella enterica subsp. enterica serovar Agona str. 41.E.09 1265652 +Salmonella enterica subsp. enterica serovar Agona str. 37.F.02 1265651 +Salmonella enterica subsp. enterica serovar Agona str. 21.H.10 1265650 +Salmonella enterica subsp. enterica serovar Agona str. 16.H.08 1265649 +Salmonella enterica subsp. enterica serovar Agona str. 42.E.09 1265648 +Salmonella enterica subsp. enterica serovar Agona str. 39.O.03 1265647 +Salmonella enterica subsp. enterica serovar Agona str. 32.A.00 1265646 +Salmonella enterica subsp. enterica serovar Agona str. 27.O.98 1265645 +Salmonella enterica subsp. enterica serovar Agona str. 18.H.07 1265644 +Salmonella enterica subsp. enterica serovar Agona str. 11.A.05 1265643 +Salmonella enterica subsp. enterica serovar Agona str. 06.O.05 1265642 +Salmonella enterica subsp. enterica serovar Agona str. 34.H.09 1265641 +Salmonella enterica subsp. enterica serovar Agona str. 29.O.08 1265640 +Salmonella enterica subsp. enterica serovar Agona str. 23.F.01 1265639 +Salmonella enterica subsp. enterica serovar Agona str. 13.E.05 1265638 +Salmonella enterica subsp. enterica serovar Agona str. 08.A.05 1265637 +Salmonella enterica subsp. enterica serovar Agona str. 03.O.05 1265636 +Salmonella enterica subsp. enterica serovar Agona str. 71.E.05 1265635 +Salmonella enterica subsp. enterica serovar Agona str. 66.F.99 1265634 +Salmonella enterica subsp. enterica serovar Agona str. 69.H.06 1265633 +Salmonella enterica subsp. enterica serovar Agona str. 64.H.00 1265632 +Salmonella enterica subsp. enterica serovar Agona str. 59.F.08 1265631 +Salmonella enterica subsp. enterica serovar Agona str. 61.O.08 1265630 +Salmonella enterica subsp. enterica serovar Agona str. 56.O.08 1265629 +Salmonella enterica subsp. enterica serovar Agona str. 51.E.09 1265628 +Salmonella enterica subsp. enterica serovar Agona str. 73.H.09 1265627 +Salmonella enterica subsp. enterica serovar Agona str. 54.O.08 1265626 +Salmonella enterica subsp. enterica serovar Agona str. 49.E.09 1265625 +Salmonella enterica subsp. enterica serovar Agona str. 44.E.09 1265624 +Salmonella enterica subsp. enterica serovar Agona str. 46.E.09 1265623 +Salmonella enterica subsp. enterica serovar Agona str. 40.E.08 1265622 +Salmonella enterica subsp. enterica serovar Agona str. 38.O.03 1265621 +Salmonella enterica subsp. enterica serovar Agona str. 68.U.05 1265620 +Salmonella enterica subsp. enterica serovar Agona str. 63.H.87 1265619 +Salmonella enterica subsp. enterica serovar Agona str. 22.H.04 1265618 +Salmonella enterica subsp. enterica serovar Agona str. 36.H.00 1265617 +Salmonella enterica subsp. enterica serovar Agona str. 33.A.05 1265616 +Salmonella enterica subsp. enterica serovar Agona str. 28.O.08 1265615 +Salmonella enterica subsp. enterica serovar Agona str. 20.H.06 1265614 +Salmonella enterica subsp. enterica serovar Agona str. 17.H.06 1265613 +Salmonella enterica subsp. enterica serovar Agona str. 12.A.06 1265612 +Salmonella enterica subsp. enterica serovar Agona str. 07.O.05 1265611 +Salmonella enterica subsp. enterica serovar Agona str. SH11G1113 1263410 +Salmonella enterica subsp. enterica serovar Agona str. SH10GFN094 1262654 +Salmonella enterica subsp. enterica serovar Agona str. SH08SF124 1262652 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC_2009K1288 1262136 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-32014 1260242 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-31312 1260241 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-30508 1260240 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-27690 1260239 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-22186 1260238 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-21079 1260237 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-06235 1260236 +Salmonella enterica subsp. enterica serovar Enteritidis str. 11-03844 1260235 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-39087 1260234 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-38792 1260233 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-37723 1260232 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-36979 1260231 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35184 1260230 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-34213 1260229 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-33603 1260228 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-29949 1260227 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-28670 1260226 +Salmonella enterica subsp. enterica serovar Virchow str. SVQ1 1249525 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-36319 1247540 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-36119 1247539 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35417 1247538 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35183 1247537 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35182 1247536 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35181 1247535 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35180 1247534 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35179 1247533 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-35178 1247532 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-34601 1247531 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-34599 1247530 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-34587 1247529 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-33371 1247528 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-33369 1247527 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-33213 1247526 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-31528 1247525 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-30147 1247524 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-29153 1247523 +Salmonella enterica subsp. arizonae serovar 62:z36:- str. 5335/86 1245396 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-9 1245393 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-8 1245392 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-7 1245391 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-5 1245390 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-3 1245389 +Salmonella enterica subsp. enterica serovar Enteritidis str. 12-2 1245388 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-134 1244131 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-130 1244130 +Salmonella enterica subsp. enterica serovar Enteritidis str. 9-884 1244129 +Salmonella enterica subsp. enterica serovar Enteritidis str. 9-531 1244128 +Salmonella enterica subsp. enterica serovar Enteritidis str. 9-332 1244127 +Salmonella enterica subsp. enterica serovar Enteritidis str. 9-135 1244126 +Salmonella enterica subsp. enterica serovar Enteritidis str. 9-193 1244125 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-103 1244124 +Salmonella enterica subsp. enterica serovar Enteritidis str. 10-101 1244123 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111174 1244122 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111175 1244121 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20111095 1244120 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110361 1244119 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110360 1244118 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110359 1244113 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110358 1244112 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110357 1244111 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110356 1243621 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110355 1243620 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110354 1243619 +Salmonella enterica subsp. enterica serovar Enteritidis str. EC20110353 1243618 +Salmonella enterica subsp. diarizonae serovar 65:c:z str. SA20044251 1243616 +Salmonella enterica subsp. diarizonae serovar 65:c:z 1243615 +"Salmonella enterica subsp. diarizonae serovar 60:r:e,n,x,z15 str. SA20016199" 1243614 +Salmonella enterica subsp. diarizonae serovar 50:k:z str. MZ0080 1243612 +Salmonella enterica subsp. diarizonae serovar 50:k:z 1243611 +Salmonella enterica subsp. diarizonae serovar 59:z10:- str. SA20051472 1243610 +Salmonella enterica subsp. diarizonae serovar 59:z10:- 1243609 +"Salmonella enterica subsp. arizonae serovar 63:g,z51:- str. So 20/20" 1243608 +"Salmonella enterica subsp. arizonae serovar 63:g,z51:-" 1243607 +Salmonella enterica subsp. arizonae serovar 53:-:- str. SA20100345 1243606 +Salmonella enterica subsp. arizonae serovar 53:-:- 1243605 +"Salmonella enterica subsp. salamae serovar 56:z10:e,n,x str. 1369-73" 1243604 +Salmonella enterica subsp. salamae serovar 56:z10:enx 1243603 +Salmonella enterica subsp. salamae serovar 55:k:z39 str. 1315K 1243602 +Salmonella enterica subsp. salamae serovar 55:k:z39 1243601 +Salmonella enterica subsp. enterica serovar Yovokome str. S-1850 1243600 +Salmonella enterica subsp. enterica serovar Yovokome 1243599 +Salmonella enterica subsp. enterica serovar Weslaco str. 247K 1243598 +Salmonella enterica subsp. enterica serovar Weslaco 1243597 +Salmonella enterica subsp. enterica serovar Waycross str. SA20041608 1243596 +Salmonella enterica subsp. enterica serovar Wandsworth str. SA20092095 1243595 +Salmonella enterica subsp. enterica serovar Virginia str. SA19971529 1243594 +Salmonella enterica subsp. enterica serovar Utrecht str. KOS1170 1243593 +Salmonella enterica subsp. enterica serovar Utrecht 1243592 +Salmonella enterica subsp. enterica serovar Quebec str. S-1267 1243591 +Salmonella enterica subsp. enterica serovar Quebec 1243590 +Salmonella enterica subsp. enterica serovar Pullorum str. SO-4037-07 1243589 +Salmonella enterica subsp. enterica serovar Paratyphi A str. SA19950809 1243588 +Salmonella enterica subsp. enterica serovar Panama str. SA20030878 1243587 +Salmonella enterica subsp. enterica serovar Ouakam str. SA20034636 1243586 +Salmonella enterica subsp. enterica serovar Ouakam 1243585 +Salmonella enterica subsp. enterica serovar Onderstepoort str. SA20060086 1243584 +Salmonella enterica subsp. Enterica serovar Onderstepoort 1243583 +Salmonella enterica subsp. enterica serovar Newport str. L0167 1243582 +Salmonella enterica subsp. enterica serovar Newport str. S09097 1243581 +Salmonella enterica subsp. enterica serovar Moscow str. SA20061414 1243580 +Salmonella enterica subsp. enterica serovar Moscow str. S-1843 1243579 +Salmonella enterica subsp. enterica serovar Milwaukee str. SA19950795 1243578 +Salmonella enterica subsp. enterica serovar Milwaukee 1243577 +Salmonella enterica subsp. enterica serovar Manhattan str. SA20034532 1243576 +Salmonella enterica subsp. enterica serovar Johannesburg str. SA20025782 1242697 +Salmonella enterica subsp. enterica serovar Berta str. SA20103550 1242696 +Salmonella enterica subsp. enterica serovar Manchester str. ST278 1242108 +Salmonella enterica subsp. enterica serovar Macclesfield str. S-1643 1242107 +Salmonella enterica subsp. enterica serovar Krefeld str. SA20030536 1242106 +Salmonella enterica subsp. enterica serovar Koessen str. S-1501 1242105 +Salmonella enterica subsp. enterica serovar Kiel str. ST443 1242103 +Salmonella enterica subsp. enterica serovar Kentucky str. SA20030505 1242102 +Salmonella enterica subsp. enterica serovar Johannesburg str. ST203 1242101 +Salmonella enterica subsp. enterica serovar Itami str. SA20014991 1242100 +Salmonella enterica subsp. enterica serovar Istanbul str. SA20033734 1242099 +Salmonella enterica subsp. enterica serovar India str. SA20085604 1242098 +Salmonella enterica subsp. enterica serovar Hvittingfoss str. SA20014981 1242097 +Salmonella enterica subsp. enterica serovar Hillingdon str. N1529-D3 1242096 +Salmonella enterica subsp. enterica serovar Hadar str. SA20026260 1242095 +Salmonella enterica subsp. enterica serovar Gaminara str. SA20063285 1242094 +Salmonella enterica subsp. enterica serovar Fresno str. ST224 1242093 +Salmonella enterica subsp. enterica serovar Dublin str. SA20093032 1242092 +Salmonella enterica subsp. enterica serovar Djakarta str. S-1087 1242091 +Salmonella enterica subsp. enterica serovar Crossness str. 1422-74 1242090 +Salmonella enterica subsp. enterica serovar Borreze str. SA20041063 1242089 +Salmonella enterica subsp. enterica serovar Apapa str. SA20060561 1242088 +Salmonella enterica subsp. enterica serovar Antsalova str. S01-0511 1242087 +Salmonella enterica subsp. enterica serovar Macclesfield 1242085 +Salmonella enterica subsp. enterica serovar Krefeld 1242084 +Salmonella enterica subsp. enterica serovar Koessen 1242083 +Salmonella enterica subsp. enterica serovar India 1242082 +Salmonella enterica subsp. enterica serovar Hillingdon 1242081 +Salmonella enterica subsp. enterica serovar Djakarta 1242080 +Salmonella enterica subsp. enterica serovar Apapa 1242079 +Salmonella enterica subsp. enterica serovar Antsalova 1242078 +Salmonella enterica subsp. enterica serovar Bergen str. ST350 1240708 +Salmonella enterica subsp. enterica serovar Blegdam str. S-1824 1240694 +Salmonella enterica subsp. enterica serovar Rubislaw str. SA20030553 1240693 +"Salmonella enterica subsp. houtenae serovar 16:z4,z32:-- str. RKS3027" 1240348 +"Salmonella enterica subsp. enterica serovar 4,[5]:b:-" 1237855 +Salmonella enterica subsp. enterica serovar Typhimurium str. JCM 1652 1236523 +Salmonella enterica subsp. enterica serovar Thompson str. 2010K-1863 1235460 +Salmonella enterica subsp. enterica serovar Mbandaka str. 2009K-0807 1235459 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM6835 1234895 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM14510 1234894 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM14512 1234893 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM14083 1234891 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM14082 1234890 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001591 1232184 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001648 1232170 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001647 1232169 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001646 1232168 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001645 1232167 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001644 1232166 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001643 1232165 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001642 1232164 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001641 1232163 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001640 1232162 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001639 1232161 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001638 1232160 +Salmonella enterica subsp. enterica serovar Newport str. CFSAN001637 1232159 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM13676 1231724 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM13674 1231723 +Salmonella enterica subsp. enterica serovar Typhimurium str. RM10602 1231722 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001586 1227171 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001585 1227170 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001584 1227169 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001583 1227168 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001582 1227167 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001581 1227166 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001580 1227165 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001579 1227164 +Salmonella enterica subsp. enterica serovar Enteritidis str. CFSAN001578 1227163 +Salmonella enterica subsp. enterica serovar Gallinarum/pullorum str. CDC1983-67 1225522 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm5 1218153 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm12 1218152 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm11 1218151 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm10 1218150 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm9 1218149 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm8 1218148 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm6 1218147 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm4 1218146 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm3 1218145 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm2 1218144 +Salmonella enterica subsp. enterica serovar Typhimurium str. STm1 1218143 +Salmonella enterica subsp. enterica serovar Mississippi str. 2010K-1406 1212561 +Salmonella enterica subsp. enterica serovar Hadar str. 2011K-0112 1212559 +Salmonella enterica subsp. enterica serovar Hartford str. 06-0676 1212557 +Salmonella enterica subsp. enterica serovar Bareilly str. 06-0784 1212554 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001115 1208630 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001112 1208629 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001109 1208628 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001108 1208627 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001105 1208626 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001102 1208625 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001099 1208624 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001140 1208623 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001118 1208622 +Salmonella enterica subsp. enterica serovar Abaetetuba str. ATCC 35640 1208611 +"Salmonella enterica subsp. enterica serovar Anatum var. O 15+,34+ (Minneapolis) str. 85487" 1200355 +Salmonella enterica subsp. enterica serovar Minneapolis 1200354 +Salmonella enterica subsp. enterica serovar Anatum var. O 15+ (Newington) str. 91828 1200353 +"Salmonella enterica subsp. enterica serovar O rough:r: 1,2 str. 97182" 1197942 +"Salmonella enterica subsp. enterica serovar O rough O:r:1,2" 1197941 +Salmonella enterica subsp. enterica serovar Untypable str. 80087 1197938 +"Salmonella enterica subsp. enterica serovar O rough:e,h:1,2 str. 76084" 1197937 +Salmonella enterica subsp. enterica serovar O rough 1197936 +Salmonella enterica subsp. enterica serovar Monophasic str. 69187 1197934 +Salmonella enterica subsp. enterica serovar Monophasic str. 61935 1197933 +Salmonella enterica subsp. enterica serovar Typhimurium var. 5- str. 96976 1197911 +Salmonella enterica subsp. enterica serovar Derby str. D1 1197886 +Salmonella enterica subsp. enterica serovar Nchanga str. CFSAN001092 1196830 +Salmonella enterica subsp. enterica serovar Nchanga str. CFSAN001091 1196829 +Salmonella enterica subsp. enterica serovar Nchanga 1196828 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001090 1196349 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001089 1196348 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001088 1196347 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN001087 1196346 +Salmonella enterica subsp. enterica serovar Norwich 1194162 +Salmonella enterica subsp. enterica serovar Stanleyville str. CFSAN000624 1194159 +Salmonella enterica subsp. enterica serovar Eastbourne str. CFSAN001084 1194158 +Salmonella enterica subsp. enterica serovar Cubana str. CFSAN001083 1194157 +Salmonella enterica subsp. enterica serovar Havana str. CFSAN001082 1194156 +Salmonella enterica subsp. enterica serovar London str. CFSAN001081 1194155 +Salmonella enterica subsp. enterica serovar Bredeney str. CFSAN001080 1194154 +Salmonella enterica subsp. enterica serovar Ohio str. CFSAN001079 1194153 +Salmonella enterica subsp. enterica serovar Manhattan str. CFSAN001078 1194152 +Salmonella enterica subsp. enterica serovar Norwich str. CFSAN001077 1194151 +Salmonella enterica subsp. enterica serovar Litchfield str. CFSAN001076 1194150 +Salmonella enterica subsp. enterica serovar Hartford str. CFSAN001075 1194149 +Salmonella enterica subsp. enterica serovar Typhi str. CR0063 1192853 +"Salmonella enterica subsp. diarizonae serovar 61:-:1,5,7 str. 95276" 1192852 +"Salmonella enterica subsp. diarizonae serovar 61:-:1,5,7 str. 85644" 1192851 +"Salmonella enterica subsp. diarizonae serovar 61:-:1,5,7" 1192850 +Salmonella enterica subsp. diarizonae serovar 58:z52:z35 str. 75093 1192849 +Salmonella enterica subsp. diarizonae serovar 58:z52:z35 1192848 +Salmonella enterica subsp. diarizonae serovar 47:k:z35 str. 75279 1192847 +Salmonella enterica subsp. diarizonae serovar 47:k:z35 1192846 +Salmonella enterica subsp. diarizonae serovar 35:i:z35 str. 77202 1192845 +Salmonella enterica subsp. diarizonae serovar 35:i:z35 1192844 +Salmonella enterica subsp. diarizonae serovar 48:i:z str. 77175 1192843 +Salmonella enterica subsp. diarizonae serovar 48:i:z 1192842 +"Salmonella enterica subsp. arizona serovar 18:z4,z32:- str. 75773" 1192841 +"Salmonella enterica subsp. arizona serovar 18:z4,z23:- str. 91293" 1192840 +"Salmonella enterica subsp. arizonae serovar 18:z4,z23:-" 1192839 +Salmonella enterica subsp. arizona serovar Untypable str. 73711 1192838 +Salmonella enterica subsp. salamae serovar 48:d:z6 (Hagenbeck) str. 80877 1192837 +Salmonella enterica subsp. enterica str. 77231 1192836 +Salmonella enterica subsp. enterica serovar Uganda str. 60790 1192835 +Salmonella enterica subsp. enterica serovar Enteritidis str. 60277 1192834 +Salmonella enterica subsp. enterica serovar Reading str. 76588 1192833 +Salmonella enterica subsp. enterica serovar Newport str. UC06 1192832 +Salmonella enterica subsp. enterica serovar Mbandaka str. 83457 1192831 +Salmonella enterica subsp. enterica serovar Heidelberg str. 47866 1192830 +Salmonella enterica subsp. enterica serovar Gallinarum/pullorum str. 75775 1192829 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC05 1192828 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC07 1192827 +Salmonella enterica subsp. enterica str. 47038 1192826 +Salmonella enterica subsp. enterica serovar Enteritidis str. 07-0056 1192825 +Salmonella enterica subsp. enterica serovar Choleraesuis str. 76640 1192824 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. 73187 1192823 +Salmonella enterica subsp. enterica serovar Bareilly str. 97005 1192822 +"Salmonella enterica subsp. enterica serovar Anatum var. O 15+,34+ (Minneapolis) str. 82395" 1192821 +Salmonella enterica subsp. enterica serovar Anatum str. 86637 1192820 +Salmonella enterica subsp. enterica str. 48427 1192819 +Salmonella enterica subsp. enterica str. 01-11525 1192818 +Salmonella enterica subsp. enterica str. 09-06166 1192817 +Salmonella enterica subsp. enterica str. 11-01213 1192816 +Salmonella enterica subsp. enterica str. 11-01214 1192815 +Salmonella enterica subsp. enterica str. 11-01216-1 1192814 +Salmonella enterica subsp. enterica serovar Ouakam str. 73951 1192813 +Salmonella enterica subsp. enterica serovar Krefeld str. 75498 1192812 +Salmonella enterica subsp. enterica serovar Rubislaw str. 71323 1192811 +Salmonella enterica subsp. enterica serovar Blockley str. 75019 1192810 +Salmonella enterica subsp. enterica serovar Newport str. 66033 1192809 +Salmonella enterica subsp. enterica serovar Sandiego str. 75161 1192808 +Salmonella enterica subsp. enterica serovar Fresno str. 75160 1192807 +Salmonella enterica subsp. enterica serovar Putten str. 80904 1192806 +Salmonella enterica subsp. enterica serovar Bardo str. 81443 1192805 +Salmonella enterica subsp. enterica serovar Aqua str. 77280 1192804 +Salmonella enterica subsp. enterica serovar Livingstone str. 76068 1192803 +Salmonella enterica subsp. enterica serovar Minnesota str. 75355 1192802 +"Salmonella enterica subsp. enterica serovar I 8,(20):-:- str. 86454" 1192801 +"Salmonella enterica subsp. enterica serovar I 8,(20):-:z6 str. 77633" 1192800 +"Salmonella enterica subsp. enterica serovar I 8,(20):i:- str. 78361" 1192799 +"Salmonella enterica subsp. enterica serovar I 9,12:-:- str. 91182" 1192798 +"Salmonella enterica subsp. enterica serovar I 9,12:-:- str. 86136" 1192797 +"Salmonella enterica subsp. enterica serovar I 6,7:k:- str. 78197" 1192796 +"Salmonella enterica subsp. enterica serovar I 6,7:k:- str. 86449" 1192795 +"Salmonella enterica subsp. enterica serovar 6,7:-:l,w str. 81006" 1192794 +Salmonella enterica subsp. enterica serovar Yovokome str. 81007 1192793 +"Salmonella enterica subsp. enterica serovar I 6,7:-:1,5 str. 84925" 1192792 +"Salmonella enterica subsp. enterica serovar I 6,7:-:- str. 75227" 1192791 +"Salmonella enterica subsp. enterica serovar I 4,12:r:- str. 74258" 1192790 +"Salmonella enterica subsp. enterica serovar I 4,12:r:- str. 75899" 1192789 +"Salmonella enterica subsp. enterica serovar I 4,12:r:- str. 94294" 1192788 +"Salmonella enterica subsp. enterica serovar 4,12:-:- str. 79224" 1192787 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i:- str. 74373" 1192786 +"Salmonella enterica subsp. enterica serovar I 4,[5],12:r:- str. 72722" 1192785 +"Salmonella enterica subsp. enterica serovar I 3,10:e,h:- str. 91358" 1192784 +"Salmonella enterica subsp. enterica serovar 6,7:-:1,5" 1192783 +"Salmonella enterica subsp. enterica serovar 4,12:-:-" 1192782 +"Salmonella enterica subsp. enterica serovar 9,12:-:-" 1192781 +"Salmonella enterica subsp. enterica serovar 6,7:-:-" 1192780 +"Salmonella enterica subsp. enterica serovar 6,7:k:-" 1192779 +"Salmonella enterica subsp. enterica serovar 6,7:-:l,w" 1192778 +"Salmonella enterica subsp. enterica serovar 8,(20):i:-" 1192777 +"Salmonella enterica subsp. enterica serovar 4,12:r:-" 1192776 +"Salmonella enterica subsp. enterica serovar 4,[5],12:r:-" 1192775 +"Salmonella enterica subsp. enterica serovar 8,(20):-:z6" 1192774 +Salmonella enterica subsp. enterica str. 85356 1192773 +Salmonella enterica subsp. enterica serovar Untypable str. 91510 1192772 +Salmonella enterica subsp. enterica serovar Senftenberg str. 91569 1192771 +Salmonella enterica subsp. enterica serovar Mbandaka str. 97846 1192770 +Salmonella enterica subsp. enterica serovar Untypable str. 83987 1192769 +Salmonella enterica subsp. enterica serovar Untypable str. 77116 1192768 +Salmonella enterica subsp. enterica serovar Untypable str. 83332 1192767 +Salmonella enterica subsp. enterica serovar Untypable str. 91013 1192766 +Salmonella enterica subsp. enterica serovar Untypable str. 77528 1192765 +Salmonella enterica subsp. enterica serovar Untypable str. 75788 1192764 +Salmonella enterica subsp. enterica serovar Untypable str. 92055 1192763 +Salmonella enterica subsp. enterica serovar Untypable str. 77132 1192762 +Salmonella enterica subsp. enterica str. S703 1192761 +Salmonella enterica subsp. enterica serovar Untypable str. 81146 1192760 +Salmonella enterica subsp. enterica serovar Typhimurium var. O 5 - (Copenhagen) str. 59802 1192757 +Salmonella enterica subsp. enterica serovar Typhimurium var. O 5 - (Copenhagen) str. 73007 1192756 +Salmonella enterica subsp. enterica serovar Give var. O 15+ (Newbrunswick) str. 74340 1192755 +Salmonella enterica subsp. enterica serovar Newbrunswick 1192754 +Salmonella enterica subsp. enterica serovar Orion var. O 15+ (Binza) str. 83633 1192753 +Salmonella enterica subsp. enterica serovar Orion var. O 15+ (Binza) str. 72778 1192752 +Salmonella enterica subsp. enterica serovar Uganda var. O 15+ (Kinshasa) str. 74134 1192751 +Salmonella enterica subsp. enterica serovar Uganda var. O 15+ (Kinshasa) str. 79216 1192750 +Salmonella enterica subsp. enterica serovar Schwarzengrund str. 79926 1192749 +Salmonella enterica subsp. enterica serovar Schwarzengrund str. 86280 1192748 +Salmonella enterica subsp. enterica serovar Saintpaul str. 97159 1192747 +Salmonella enterica subsp. enterica serovar Saintpaul str. 76163 1192746 +Salmonella enterica subsp. enterica serovar Orion str. 91122 1192744 +Salmonella enterica subsp. enterica serovar Orion str. 81399 1192743 +Salmonella enterica subsp. enterica serovar Nitra str. Stk # 1280 1192742 +Salmonella enterica subsp. enterica serovar Nitra str. 96-0186 1192741 +Salmonella enterica subsp. enterica serovar Nitra str. 2010K-0860 1192740 +Salmonella enterica subsp. enterica serovar Montevideo str. 100026411 1192739 +Salmonella enterica subsp. enterica serovar Montevideo str. 78354 1192738 +Salmonella enterica subsp. enterica serovar Meleagridis str. 91904 1192737 +Salmonella enterica subsp. enterica serovar Meleagridis str. 82205 1192736 +Salmonella enterica subsp. enterica serovar London str. 97429 1192735 +Salmonella enterica subsp. enterica serovar London str. 97031 1192734 +Salmonella enterica subsp. enterica serovar Kintambo str. 06-07740 1192733 +Salmonella enterica subsp. enterica serovar Kintambo str. 07-00493 1192732 +Salmonella enterica subsp. enterica serovar Kintambo str. 08-04768 1192731 +Salmonella enterica subsp. enterica serovar Kintambo 1192730 +Salmonella enterica subsp. enterica serovar Kentucky str. 86166 1192729 +Salmonella enterica subsp. enterica serovar Kentucky str. 94600 1192728 +Salmonella enterica subsp. enterica serovar Javiana str. 75090 1192727 +Salmonella enterica subsp. enterica serovar Javiana str. 71288 1192726 +Salmonella enterica subsp. enterica serovar Infantis str. 81164 1192725 +Salmonella enterica subsp. enterica serovar Infantis str. 79108 1192724 +Salmonella enterica subsp. enterica serovar Hartford str. 77007 1192723 +Salmonella enterica subsp. enterica serovar Hartford str. 81331 1192722 +Salmonella enterica subsp. enterica serovar Hadar str. 83070 1192721 +Salmonella enterica subsp. enterica serovar Hadar str. 75943 1192720 +Salmonella enterica subsp. enterica serovar Hadar str. 76070 1192719 +Salmonella enterica subsp. enterica serovar Give str. 74175 1192718 +Salmonella enterica subsp. enterica serovar Give str. 91393 1192717 +Salmonella enterica subsp. enterica serovar Derby str. 79002 1192716 +Salmonella enterica subsp. enterica serovar Derby str. 82338 1192715 +Salmonella enterica subsp. enterica serovar Cerro str. 86515 1192714 +Salmonella enterica subsp. enterica serovar Cerro str. 69208 1192713 +Salmonella enterica subsp. enterica serovar Bredeney str. 92050 1192712 +Salmonella enterica subsp. enterica serovar Bredeney str. 81568 1192711 +Salmonella enterica subsp. enterica serovar Brandenburg str. 84880 1192710 +Salmonella enterica subsp. enterica serovar Brandenburg str. 82694 1192709 +Salmonella enterica subsp. enterica str. 66217 1192708 +Salmonella enterica subsp. enterica serovar Braenderup str. 85239 1192707 +Salmonella enterica subsp. enterica serovar Alachua str. 82530 1192706 +Salmonella enterica subsp. enterica serovar Alachua str. 61886 1192705 +Salmonella enterica subsp. enterica serovar Agona str. 84875 1192704 +Salmonella enterica subsp. enterica serovar Agona str. 81390 1192703 +Salmonella enterica subsp. enterica serovar Agona str. UC15 1192702 +Salmonella enterica subsp. enterica serovar Poano str. 04-09176 1192701 +Salmonella enterica subsp. enterica serovar Poano str. 07-01409 1192700 +Salmonella enterica subsp. enterica serovar Poano str. 11-01215 1192699 +Salmonella enterica subsp. enterica serovar Poano str. 11-01216-2 1192698 +Salmonella enterica subsp. enterica serovar Poano 1192697 +Salmonella enterica subsp. enterica serovar Typhimurium str. 70031 1192696 +Salmonella enterica subsp. enterica serovar Typhimurium str. 85513 1192695 +Salmonella enterica subsp. enterica serovar Typhimurium str. UC14 1192694 +Salmonella enterica subsp. enterica serovar Typhimurium str. UC08 1192693 +Salmonella enterica subsp. enterica serovar Typhimurium str. UC17 1192692 +Salmonella enterica subsp. enterica serovar Typhimurium str. UC09 1192691 +Salmonella enterica subsp. enterica serovar Typhimurium str. 92199 1192690 +Salmonella enterica subsp. enterica serovar Dublin str. DG22 1192689 +Salmonella enterica subsp. enterica serovar Dublin str. UC16 1192688 +Salmonella enterica subsp. enterica serovar Dublin str. UC04 1192687 +Salmonella enterica subsp. enterica serovar Dublin str. 69621 1192686 +Salmonella enterica subsp. enterica serovar Dublin str. 77340 1192685 +Salmonella enterica subsp. enterica serovar Heidelberg str. 36229 1192684 +Salmonella enterica subsp. enterica serovar Heidelberg str. 76232 1192683 +Salmonella enterica subsp. enterica serovar Heidelberg str. 97929 1192682 +Salmonella enterica subsp. enterica serovar Heidelberg str. 97827 1192681 +Salmonella enterica subsp. enterica serovar Heidelberg str. 97206 1192680 +Salmonella enterica subsp. enterica serovar Heidelberg str. 97125 1192679 +Salmonella enterica subsp. enterica serovar Heidelberg str. 91997 1192678 +Salmonella enterica subsp. enterica serovar Heidelberg str. 85516 1192677 +Salmonella enterica subsp. enterica serovar Heidelberg str. 83683 1192676 +Salmonella enterica subsp. enterica serovar Heidelberg str. 77886 1192675 +Salmonella enterica subsp. enterica serovar Heidelberg str. 74202 1192674 +Salmonella enterica subsp. enterica serovar Heidelberg str. 57552 1192673 +Salmonella enterica subsp. enterica serovar Heidelberg str. M11X 02183 1192672 +Salmonella enterica subsp. enterica serovar Heidelberg str. 94761 1192671 +Salmonella enterica subsp. enterica serovar Heidelberg str. M11X 02069 1192670 +Salmonella enterica subsp. enterica serovar Heidelberg str. 2011K-1226 1192669 +Salmonella enterica subsp. enterica serovar Heidelberg str. 2011K-1225 1192668 +Salmonella enterica subsp. enterica serovar Heidelberg str. 2011K-1140 1192667 +Salmonella enterica subsp. enterica serovar Heidelberg str. 2011K-1139 1192666 +Salmonella enterica subsp. enterica serovar Heidelberg str. 2011K-1110 1192665 +Salmonella enterica subsp. enterica serovar Heidelberg str. UC01 1192664 +Salmonella enterica subsp. enterica serovar Heidelberg str. 98955 1192663 +Salmonella enterica subsp. enterica serovar Heidelberg str. 94664 1192662 +Salmonella enterica subsp. enterica serovar Heidelberg str. 79321 1192661 +Salmonella enterica subsp. enterica serovar Heidelberg str. 77142 1192660 +Salmonella enterica subsp. enterica serovar Enteritidis str. J0915 1192659 +Salmonella enterica subsp. enterica serovar Enteritidis str. 77320 1192658 +Salmonella enterica subsp. enterica serovar Enteritidis str. 81748 1192657 +Salmonella enterica subsp. enterica serovar Enteritidis str. 82631 1192656 +Salmonella enterica subsp. enterica serovar Enteritidis str. 39997 1192655 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC13 1192654 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC12 1192653 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC11 1192652 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC10 1192651 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC03 1192650 +Salmonella enterica subsp. enterica serovar Enteritidis str. UC02 1192649 +Salmonella enterica subsp. enterica serovar Enteritidis str. 9810102B 1192648 +Salmonella enterica subsp. enterica serovar Enteritidis str. 1102933A 1192647 +Salmonella enterica subsp. enterica serovar Enteritidis str. 0811210F 1192646 +Salmonella enterica subsp. enterica serovar Enteritidis str. 0804789B 1192645 +Salmonella enterica subsp. enterica serovar Enteritidis str. 0701376-4 1192644 +Salmonella enterica subsp. enterica serovar Enteritidis str. 0502571 1192643 +Salmonella enterica subsp. enterica serovar Enteritidis str. 02-2966 1192642 +Salmonella enterica subsp. enterica serovar Enteritidis str. 98-9534 1192641 +Salmonella enterica subsp. enterica serovar Enteritidis str. 93-7922A 1192640 +Salmonella enterica subsp. enterica serovar Enteritidis str. 93-7741 1192639 +Salmonella enterica subsp. enterica serovar Enteritidis str. 93-2836A 1192638 +Salmonella enterica subsp. enterica serovar Enteritidis str. 93-6175B 1192637 +Salmonella enterica subsp. enterica serovar Enteritidis str. 97569 1192636 +Salmonella enterica subsp. enterica serovar Enteritidis str. 34986 1192635 +Salmonella enterica subsp. enterica serovar Enteritidis str. 61080 1192634 +Salmonella enterica subsp. enterica serovar Enteritidis str. 61979 1192633 +Salmonella enterica subsp. enterica serovar Enteritidis str. 98961 1192632 +Salmonella enterica subsp. enterica serovar Enteritidis str. 85366 1192631 +Salmonella enterica subsp. enterica serovar Enteritidis str. 78296 1192630 +Salmonella enterica subsp. enterica serovar Enteritidis str. S-277 1192629 +Salmonella enterica subsp. enterica serovar Enteritidis str. 55795 1192628 +Salmonella enterica subsp. enterica serovar Enteritidis str. S-380 1192627 +Salmonella enterica subsp. enterica serovar Enteritidis str. J0903 1192626 +Salmonella enterica subsp. enterica serovar Enteritidis str. J0828 1192625 +Salmonella enterica subsp. enterica serovar Enteritidis str. 77-0915 1192624 +Salmonella enterica subsp. enterica serovar Enteritidis str. 76-0331 1192623 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-1832 1192622 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-1554 1192621 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-1369 1192620 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-1028 1192619 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0351 1192618 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0345 1192617 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0301 1192616 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0277 1192615 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0268 1192614 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0264 1192613 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0263 1192612 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2009K1324 1192611 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2009K0479 1192610 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2009K0477 1192609 +Salmonella enterica subsp. enterica serovar Enteritidis str. 04-0307 1192608 +Salmonella enterica subsp. enterica serovar Enteritidis str. 98-0467 1192607 +Salmonella enterica subsp. enterica serovar Enteritidis str. 93-0063 1192606 +Salmonella enterica subsp. enterica serovar Enteritidis str. 84-1226 1192605 +Salmonella enterica subsp. enterica serovar Enteritidis str. 75-2732 1192604 +Salmonella enterica subsp. enterica serovar Enteritidis str. 54-2220 1192603 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-2029 1192602 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-1923 1192601 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0329 1192600 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0313 1192599 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0303 1192598 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0302 1192597 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0300 1192596 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0297 1192595 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0287 1192594 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0286 1192593 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0284 1192592 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0271 1192591 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0267 1192590 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0262 1192589 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2009K1726 1192588 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2009K1651 1192587 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2009K0958 1192586 +Salmonella enterica subsp. enterica serovar Enteritidis str. 08-1080 1192585 +Salmonella enterica subsp. enterica serovar Worthington str. 76229 1192584 +Salmonella enterica subsp. enterica serovar Uganda str. 92027 1192583 +Salmonella enterica subsp. enterica serovar Tennessee str. 76494 1192582 +Salmonella enterica subsp. enterica serovar Senftenberg str. 97150 1192581 +Salmonella enterica subsp. enterica serovar Rissen str. 72519 1192580 +Salmonella enterica subsp. enterica serovar Putten str. 75222 1192579 +Salmonella enterica subsp. enterica serovar Putten 1192578 +Salmonella enterica subsp. enterica serovar Panama str. 80882 1192577 +Salmonella enterica subsp. enterica serovar Newport str. 57992 1192576 +Salmonella enterica subsp. enterica serovar Adelaide str. 97650 1192575 +Salmonella enterica subsp. enterica serovar Oranienburg str. 91006 1192574 +Salmonella enterica subsp. enterica serovar Litchfield str. 84131 1192573 +Salmonella enterica subsp. enterica str. 95461 1192572 +Salmonella enterica subsp. enterica serovar Muenchen str. 97016 1192571 +Salmonella enterica subsp. enterica serovar Minnesota str. 91949 1192570 +Salmonella enterica subsp. enterica serovar Miami str. 71329 1192569 +Salmonella enterica subsp. enterica serovar Mbandaka str. 74290 1192568 +Salmonella enterica subsp. enterica serovar Manhattan str. 86167 1192567 +Salmonella enterica subsp. enterica serovar Lille str. 86677 1192566 +Salmonella enterica subsp. enterica serovar Kiambu str. 75290 1192565 +Salmonella enterica subsp. enterica serovar Johannesburg str. 94361 1192564 +Salmonella enterica subsp. enterica serovar Havana str. 95080 1192563 +Salmonella enterica subsp. enterica serovar Gaminara str. 76136 1192562 +Salmonella enterica subsp. enterica serovar Gallinarum var. Pullorum str. 76059 1192561 +Salmonella enterica subsp. enterica serovar Cubana str. 76814 1192560 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. 76469 1192559 +Salmonella enterica subsp. enterica serovar Blockley str. 94582 1192558 +Salmonella enterica subsp. enterica serovar Berta str. 85552 1192557 +Salmonella enterica subsp. enterica serovar Anatum str. 95514 1192556 +Salmonella enterica subsp. enterica serovar Albany str. 95183 1192555 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000970 1183393 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000969 1183392 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000968 1183391 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000967 1183390 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000966 1183389 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000965 1183388 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000964 1183387 +Salmonella enterica subsp. enterica serovar Enteritidis str. 08-0627 1182761 +Salmonella enterica subsp. enterica serovar Enteritidis str. 08-0128 1182760 +Salmonella enterica subsp. enterica serovar Enteritidis str. 08-0047 1182759 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-2599 1182758 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010K-0669 1182757 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000963 1182193 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000962 1182192 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000961 1182191 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000960 1182190 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000959 1182189 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000958 1182188 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000957 1182187 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000755 1182186 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000956 1182185 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000955 1182184 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000954 1182183 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000953 1182182 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000952 1182181 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000951 1182180 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000754 1182179 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000753 1182178 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000752 1182177 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000700 1182176 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000680 1182175 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000669 1182174 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000662 1182173 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000661 1182172 +Salmonella enterica subsp. enterica serovar Braenderup str. CFSAN000756 1182171 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00328 1182170 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00327 1182169 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00326 1182168 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00325 1182167 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00324 1182166 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00323 1182165 +Salmonella enterica subsp. enterica serovar Heidelberg str. CFSAN00322 1182164 +Salmonella enterica subsp. enterica serovar Enteritidis str. 2010-1237 1179780 +Salmonella enterica subsp. enterica serovar Typhi str. CR0044 1176488 +Salmonella enterica subsp. enterica serovar Typhi str. ST0208 1176487 +"Salmonella enterica subsp. salamae serovar 58:l,z13,z28:z6 str. 00-0163" 1173951 +"Salmonella enterica subsp. indica serovar 6,14,25:z10:1,(2),7 str. 1121" 1173950 +"Salmonella enterica subsp. indica serovar 6,14,25:z10:1,(2),7" 1173949 +"Salmonella enterica subsp. houtenae serovar 50:g,z51:- str. 01-0133" 1173948 +"Salmonella enterica subsp. houtenae serovar 50:g,z51:-" 1173947 +Salmonella enterica subsp. enterica str. 609458-2604314_2-2 1173941 +Salmonella enterica subsp. enterica serovar Worthington str. ATCC 9607 1173940 +Salmonella enterica subsp. enterica serovar Weltevreden str. 1655 1173939 +Salmonella enterica subsp. enterica serovar Urbana str. ATCC 9261 1173938 +Salmonella enterica subsp. enterica serovar Typhimurium str. 08-1736 1173932 +Salmonella enterica subsp. enterica serovar Typhimurium var. Copenhagen str. 0084 1173929 +Salmonella enterica subsp. enterica serovar Schwarzengrund str. 0805 1173920 +Salmonella enterica subsp. enterica serovar Sandiego str. ATCC 23199 1173919 +Salmonella enterica subsp. enterica serovar Newport str. A-211-RVH 1173900 +Salmonella enterica subsp. enterica serovar Newport str. 36796 1173898 +Salmonella enterica subsp. enterica serovar Newport str. 0267 1173888 +Salmonella enterica subsp. enterica serovar Muenchen str. RKS4129 1173882 +Salmonella enterica subsp. enterica serovar Montevideo str. N19965 1173880 +Salmonella enterica subsp. enterica serovar Montevideo str. FVM_628064 1173877 +Salmonella enterica subsp. enterica serovar Montevideo str. FSL_R8-4922 1173875 +Salmonella enterica subsp. enterica serovar Montevideo str. FSL_R8-4916 1173874 +Salmonella enterica subsp. enterica serovar Montevideo str. FSL_R8-4843 1173873 +Salmonella enterica subsp. enterica serovar Montevideo str. FSL_R8-4673 1173872 +Salmonella enterica subsp. enterica serovar Montevideo str. FSL_R8-2868 1173871 +Salmonella enterica subsp. enterica serovar Montevideo str. 644129 1173870 +Salmonella enterica subsp. enterica serovar Montevideo str. 609458-2 1173869 +Salmonella enterica subsp. enterica serovar Montevideo str. 547736 1173868 +Salmonella enterica subsp. enterica serovar Montevideo str. 468879-1 1173866 +Salmonella enterica subsp. enterica serovar Montevideo str. 0269 1173862 +Salmonella enterica subsp. enterica serovar Montevideo str. 0263 1173861 +Salmonella enterica subsp. enterica serovar Mbandaka str. 0784 1173858 +Salmonella enterica subsp. enterica serovar Indiana str. ATCC 51959 1173850 +Salmonella enterica subsp. enterica serovar Heidelberg str. 92-0144 1173849 +Salmonella enterica subsp. enterica serovar Heidelberg str. 92-0138 1173848 +Salmonella enterica subsp. enterica serovar Heidelberg str. 90-0318 1173847 +Salmonella enterica subsp. enterica serovar Heidelberg str. 89-0213 1173846 +Salmonella enterica subsp. enterica serovar Heidelberg str. 88-0312 1173845 +Salmonella enterica subsp. enterica serovar Heidelberg str. 87-0208 1173844 +Salmonella enterica subsp. enterica serovar Heidelberg str. 86-0255 1173843 +Salmonella enterica subsp. enterica serovar Heidelberg str. 85-0486 1173842 +Salmonella enterica subsp. enterica serovar Heidelberg str. 84-1004 1173841 +Salmonella enterica subsp. enterica serovar Heidelberg str. 83-1068 1173840 +Salmonella enterica subsp. enterica serovar Heidelberg str. 82-1617 1173839 +Salmonella enterica subsp. enterica serovar Heidelberg str. 79-0480 1173838 +Salmonella enterica subsp. enterica serovar Heidelberg str. 77-2823 1173837 +Salmonella enterica subsp. enterica serovar Heidelberg str. 77-1831 1173836 +Salmonella enterica subsp. enterica serovar Heidelberg str. 76-0300 1173835 +Salmonella enterica subsp. enterica serovar Heidelberg str. 75-3547 1173834 +Salmonella enterica subsp. enterica serovar Heidelberg str. 638982-21 1173833 +Salmonella enterica subsp. enterica serovar Heidelberg str. 638982-15 1173832 +Salmonella enterica subsp. enterica serovar Give str. ATCC 9268 1173831 +Salmonella enterica subsp. enterica serovar Enteritidis str. ATCC BAA-1045 1173823 +Salmonella enterica subsp. enterica serovar Enteritidis str. 674470_11-10 1173819 +Salmonella enterica subsp. enterica serovar Enteritidis str. 3402 1173817 +Salmonella enterica subsp. enterica serovar Dublin str. ATCC BAA-1514 1173812 +Salmonella enterica subsp. enterica serovar Dublin str. 0773 1173811 +Salmonella enterica subsp. enterica serovar Derby str. ATCC 6960 1173808 +Salmonella enterica subsp. enterica serovar Cerro str. 5569 1173805 +Salmonella enterica subsp. enterica serovar Anatum str. ATCC 9270 1173801 +Salmonella enterica subsp. enterica serovar Anatum str. 0262 1173799 +Salmonella enterica subsp. enterica serovar Albany str. ATCC 51960 1173798 +Salmonella enterica subsp. enterica serovar Adelaide str. ATCC 10718 1173781 +"Salmonella enterica subsp. diarizonae serovar 60:r:e,n,x,z15 str. 01-0170" 1173780 +"Salmonella enterica subsp. diarizonae serovar 60:r:e,n,x,z15" 1173779 +"Salmonella enterica subsp. arizonae serovar 41:z4,z23:- str. 01-0089" 1173778 +Salmonella enterica subsp. enterica serovar Toronto 1173580 +Salmonella enterica subsp. enterica serovar Bron 1173579 +Salmonella enterica subsp. enterica serovar Ank 1173578 +Salmonella enterica subsp. enterica serovar Alabama 1173577 +Salmonella enterica subsp. enterica serovar Fischerhuette 1173576 +Salmonella enterica subsp. enterica serovar Coogee 1173575 +Salmonella enterica subsp. enterica serovar Sangera 1173574 +Salmonella enterica subsp. enterica serovar Neukoelln 1173573 +Salmonella enterica subsp. enterica serovar Jericho 1173572 +Salmonella enterica subsp. enterica serovar York 1173571 +Salmonella enterica subsp. enterica serovar Bangui 1173570 +Salmonella enterica subsp. enterica serovar Nottingham 1173569 +Salmonella enterica subsp. enterica serovar Sanktgeorg 1173568 +Salmonella enterica subsp. enterica serovar Farsta 1173567 +Salmonella enterica subsp. enterica serovar Soahanina 1173566 +Salmonella enterica subsp. enterica serovar Gatuni 1173565 +Salmonella enterica subsp. enterica serovar Bonariensis 1173564 +Salmonella enterica subsp. enterica serovar Osnabrueck 1173563 +Salmonella enterica subsp. enterica serovar Stellingen 1173562 +Salmonella enterica subsp. enterica serovar Flottbek 1173561 +Salmonella enterica subsp. enterica serovar Togba 1173560 +Salmonella enterica subsp. enterica serovar Sarajane 1173559 +Salmonella enterica subsp. enterica serovar Tinda 1173558 +"Salmonella enterica subsp. enterica serovar 3,10:l,v:e,n,x" 1173557 +"Salmonella enterica subsp. enterica serovar 4,12:a:-" 1173556 +"Salmonella enterica subsp. salamae serovar 9,12:d:e,n,x" 1173555 +"Salmonella enterica subsp. salamae serovar 1,9,12:l,w:e,n,x" 1173554 +"Salmonella enterica subsp. salamae serovar 1,9,12:d:e,n,x" 1173553 +"Salmonella enterica subsp. salamae serovar 35:g,z62:e,n,x" 1173552 +"Salmonella enterica subsp. salamae serovar 9,12:l,v:e,n,x" 1173551 +"Salmonella enterica subsp. salamae serovar 1,4,12,27:b:e,n,x" 1173550 +"Salmonella enterica subsp. salamae serovar 1,4,12,27:a:e,n,x" 1173549 +"Salmonella enterica subsp. salamae serovar 35:m,t:e,n,x" 1173548 +"Salmonella enterica subsp. salamae serovar 42:l,v:e,n,x,z15" 1173547 +"Salmonella enterica subsp. salamae serovar 40:z10:e,n,x" 1173546 +"Salmonella enterica subsp. salamae serovar 1,40:z10:e,n,x" 1173545 +"Salmonella enterica subsp. diarizonae serovar 42:l,v:e,n,x,z15" 1173540 +"Salmonella enterica subsp. diarizonae serovar 60:z55:e,n,x" 1173539 +"Salmonella enterica subsp. diarizonae serovar 50:l,v:e,n,x,z15" 1173538 +"Salmonella enterica subsp. indica serovar 1,6,14,25:a:e,n,x" 1173536 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000232 1173478 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000202 1173477 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000195 1173476 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000187 1173475 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000186 1173474 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000184 1173473 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000236 1173472 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000235 1173471 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000216 1173469 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000200 1173468 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000197 1173467 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000180 1173466 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000179 1173465 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000178 1173464 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000183 1173463 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000182 1173462 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000212 1173461 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000194 1173460 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000211 1173459 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000206 1173458 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000191 1173457 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000228 1173456 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000218 1173455 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000192 1173454 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000203 1173453 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000198 1173452 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000208 1173451 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000221 1173450 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000233 1173449 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000230 1173448 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000227 1173447 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000225 1173446 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000224 1173445 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000223 1173444 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000220 1173443 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000219 1173442 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000217 1173441 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000215 1173440 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000214 1173439 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000213 1173438 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000210 1173437 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000209 1173436 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000207 1173435 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000205 1173434 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000204 1173433 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000201 1173432 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000199 1173431 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000196 1173430 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000193 1173429 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000190 1173428 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000189 1173427 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000188 1173426 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000185 1173425 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000181 1173424 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000231 1173423 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000229 1173422 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000226 1173421 +Salmonella enterica subsp. enterica serovar Bareilly str. CFSAN000222 1173420 +Salmonella enterica subsp. enterica serovar Typhimurium str. U288 1171376 +Salmonella enterica subsp. enterica serovar Typhi str. UJ816A 1169661 +Salmonella enterica subsp. enterica serovar Typhi str. UJ308A 1169660 +Salmonella enterica subsp. enterica serovar Bareilly str. 2780 1163747 +"Salmonella enterica subsp. salamae serovar 6,7:l,w:1,5,7" 1160779 +"Salmonella enterica subsp. salamae serovar 58:l,z13,z28:z6" 1160778 +"Salmonella enterica subsp. salamae serovar 57:z42:1,6:z53" 1160777 +"Salmonella enterica subsp. salamae serovar 11:l,z28:e,n,x" 1160776 +"Salmonella enterica subsp. indica serovar 6,7:z41:1,7" 1160775 +"Salmonella enterica subsp. indica serovar 11:b:1,7" 1160774 +"Salmonella enterica subsp. houtenae serovar 6,7:z4,z24:-" 1160773 +"Salmonella enterica subsp. houtenae serovar 1,40:z4,z24:-" 1160772 +Salmonella enterica subsp. houtenae serovar 44:a:- 1160771 +Salmonella enterica subsp. enterica serovar Zaiman 1160770 +Salmonella enterica subsp. enterica serovar Worthington 1160769 +Salmonella enterica subsp. enterica serovar Tripoli 1160768 +Salmonella enterica subsp. enterica serovar Tonev 1160767 +Salmonella enterica subsp. enterica serovar Stourbridge 1160766 +Salmonella enterica subsp. enterica serovar Sanjuan 1160765 +Salmonella enterica subsp. enterica serovar Rosenberg 1160764 +Salmonella enterica subsp. enterica serovar Portedeslilas 1160762 +Salmonella enterica subsp. enterica serovar Overvecht 1160761 +Salmonella enterica subsp. enterica serovar Niarembe 1160760 +Salmonella enterica subsp. enterica serovar Maracaibo 1160759 +Salmonella enterica subsp. enterica serovar Madelia 1160758 +Salmonella enterica subsp. enterica serovar Lomita 1160757 +Salmonella enterica subsp. enterica serovar Lindenburg 1160756 +Salmonella enterica subsp. enterica serovar Limete 1160755 +Salmonella enterica subsp. enterica serovar Kundunchi 1160754 +Salmonella enterica subsp. enterica serovar Kisangani 1160753 +Salmonella enterica subsp. enterica serovar Kiel 1160752 +Salmonella enterica subsp. enterica serovar Itami 1160751 +Salmonella enterica subsp. enterica serovar Istanbul 1160750 +Salmonella enterica subsp. enterica serovar Hessarek 1160749 +Salmonella enterica subsp. enterica serovar Gueuletapee 1160748 +Salmonella enterica subsp. enterica serovar Goettingen 1160747 +Salmonella enterica subsp. enterica serovar Gamaba 1160746 +Salmonella enterica subsp. enterica serovar Fulica 1160745 +Salmonella enterica subsp. enterica serovar Eschberg 1160744 +Salmonella enterica subsp. enterica serovar Epinay 1160743 +Salmonella enterica subsp. enterica serovar Doorn 1160742 +Salmonella enterica subsp. enterica serovar Crossness 1160741 +Salmonella enterica subsp. enterica serovar Chincol 1160740 +Salmonella enterica subsp. enterica serovar Carrau 1160739 +Salmonella enterica subsp. enterica serovar Canada 1160738 +Salmonella enterica subsp. enterica serovar Bissau 1160737 +Salmonella enterica subsp. enterica serovar Bispebjerg 1160736 +Salmonella enterica subsp. enterica serovar Aesch 1160734 +"Salmonella enterica subsp. enterica serovar 9,12:l,v:-" 1160733 +"Salmonella enterica subsp. enterica serovar 6,7:l,v:-" 1160732 +"Salmonella enterica subsp. enterica serovar 3,10:e,h:-" 1160731 +"Salmonella enterica subsp. diarizonae serovar 61:k:1,5,7" 1160729 +Salmonella enterica subsp. diarizonae serovar 38:z10:z53 1160728 +"Salmonella enterica subsp. arizonae serovar 56:z4,z23:-" 1160727 +"Salmonella enterica subsp. arizonae serovar 53:g,z51:-" 1160726 +Salmonella enterica subsp. arizonae serovar 17:z29:- 1160725 +Salmonella enterica subsp. enterica serovar Heidelberg str. B182 1160717 +Salmonella enterica subsp. enterica serovar Typhimurium str. LT2-4_delta.ramA::kan 1159900 +Salmonella enterica subsp. enterica serovar Typhimurium str. LT2-4 1159899 +Salmonella enterica subsp. enterica serovar Typhi str. BL196 1156917 +Salmonella enterica subsp. enterica serovar Kentucky str. 0253 1156551 +"Salmonella enterica subsp. diarizonae serovar 47:l,v 'HMG'" 1154754 +"Salmonella enterica subsp. diarizonae serovar 'OMG' l,v:1,5" 1154753 +Salmonella enterica subsp. enterica serovar Tucson 1151185 +Salmonella enterica subsp. enterica serovar Telaviv 1151184 +Salmonella enterica subsp. enterica serovar Salford 1151183 +Salmonella enterica subsp. enterica serovar Richmond 1151182 +Salmonella enterica subsp. enterica serovar Mgulani 1151181 +Salmonella enterica subsp. enterica serovar Glostrup 1151180 +Salmonella enterica subsp. enterica serovar Freetown 1151179 +Salmonella enterica subsp. enterica serovar Caracas 1151178 +Salmonella enterica subsp. enterica serovar Brunei 1151177 +Salmonella enterica subsp. enterica serovar Barranquilla 1151176 +Salmonella enterica subsp. enterica serovar Bangkok 1151175 +Salmonella enterica subsp. enterica serovar Augustenborg 1151174 +Salmonella enterica subsp. enterica serovar Altona 1151173 +Salmonella enterica subsp. enterica serovar Abaetetuba 1151172 +"Salmonella enterica subsp. enterica serovar 4,5,12:b:-" 1151171 +Salmonella enterica subsp. salamae serovar 48:d:z6 1151170 +"Salmonella enterica subsp. diarizonae serovar 50:r:1,5" 1151169 +Salmonella enterica subsp. diarizonae serovar 48:k:z35 1151168 +"Salmonella enterica subsp. arizonae serovar 48:z4,z23:-" 1151167 +"Salmonella enterica subsp. arizonae serovar 41:z4,z23:-" 1151166 +Salmonella enterica subsp. enterica serovar Sandiego 1151002 +Salmonella enterica subsp. enterica serovar Napoli 1151001 +Salmonella enterica subsp. diarizonae serovar 59:z10:z53 1151000 +"Salmonella enterica subsp. diarizonae serovar 61:k:1,5,77" 1150999 +Salmonella enterica subsp. enterica serovar Enteritidis str. LA5 1147754 +Salmonella enterica subsp. enterica serovar Senftenberg str. SS209 1147753 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST1660/06 1141101 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA33 1137739 +Salmonella enterica subsp. enterica serovar Saintpaul str. SARA28 1137136 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 93-0158 1134664 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 76-1071 1134663 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 95-0328 1134662 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 86-0023 1134661 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 85-0189 1134660 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 78-0204 1134659 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 03-061782 1134658 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 93-0429 1134657 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 88-0085 1134656 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 86-0353 1134655 +Salmonella enterica subsp. enterica serovar Typhimurium str. FDA 71-2164 1134654 +Salmonella enterica subsp. enterica serovar Typhi str. P-stx-12 1132507 +Salmonella enterica subsp. enterica serovar Nitra 1129117 +Salmonella enterica subsp. enterica serovar Heidelberg str. N18453 1128969 +Salmonella enterica subsp. enterica serovar Heidelberg str. N18440 1128968 +Salmonella enterica subsp. enterica serovar Heidelberg str. N18413 1128967 +Salmonella enterica subsp. enterica serovar Heidelberg str. 29169 1128966 +Salmonella enterica subsp. enterica serovar Heidelberg str. 32507 1128965 +Salmonella enterica subsp. enterica serovar Heidelberg str. N30678 1128964 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41565 1128963 +Salmonella enterica subsp. enterica serovar Heidelberg str. N29341 1128962 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41584 1128961 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41576 1128960 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41573 1128959 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41567 1128958 +Salmonella enterica subsp. enterica serovar Heidelberg str. N15757 1128957 +Salmonella enterica subsp. enterica serovar Heidelberg str. N4630 1128956 +Salmonella enterica subsp. enterica serovar Heidelberg str. 21381 1128955 +Salmonella enterica subsp. enterica serovar Decatur 1128761 +Salmonella enterica subsp. enterica serovar Abortusovis str. 15/5 1127484 +Salmonella enterica subsp. enterica serovar Newport str. #11-2 1127355 +Salmonella enterica subsp. enterica serovar Newport str. #11-3 1127354 +Salmonella enterica subsp. enterica serovar Newport str. #11-4 1127353 +Salmonella enterica subsp. enterica serovar Give str. 564 1124980 +Salmonella enterica subsp. enterica serovar Newport str. D-1-1 36813 1124979 +Salmonella enterica subsp. enterica serovar Javiana str. A-6-1 36785 1124978 +Salmonella enterica subsp. enterica serovar Javiana str. A-10-1 36797 1124977 +Salmonella enterica subsp. enterica serovar Newport str. C-6-3 36811 1124976 +Salmonella enterica subsp. diarizonae str. 36806 1124975 +Salmonella enterica subsp. enterica serovar Typhimurium str. 4581 1124974 +Salmonella enterica subsp. enterica serovar Typhimurium str. 36618 1124973 +Salmonella enterica subsp. enterica serovar Typhimurium str. 35423 1124972 +Salmonella enterica subsp. enterica serovar Typhimurium str. 34502 1124971 +Salmonella enterica subsp. enterica serovar Typhimurium str. 86-0368 1124970 +Salmonella enterica subsp. enterica serovar Tennessee str. 3733 1124969 +Salmonella enterica subsp. enterica serovar Stanley str. ATCC 7308 1124968 +Salmonella enterica subsp. enterica serovar Soerenga str. 695 1124967 +Salmonella enterica subsp. enterica serovar Senftenberg str. 604314 1124966 +Salmonella enterica subsp. enterica serovar Senftenberg str. 5544 1124965 +Salmonella enterica subsp. enterica serovar Saintpaul str. 9712 1124964 +Salmonella enterica subsp. enterica serovar Muenster str. 660 1124963 +Salmonella enterica subsp. enterica serovar Poona str. ATCC BAA-1673 1124962 +Salmonella enterica subsp. enterica serovar Panama str. ATCC 7378 1124961 +Salmonella enterica subsp. enterica serovar Oranienburg str. 9239 1124960 +Salmonella enterica subsp. enterica serovar Muenster str. 420 1124959 +Salmonella enterica subsp. enterica serovar Muenster str. 0315 1124958 +Salmonella enterica subsp. enterica serovar Montevideo str. 108026229 1124957 +Salmonella enterica subsp. enterica serovar Minnesota str. ATCC 49284 1124956 +Salmonella enterica subsp. enterica serovar Miami str. 1923 1124955 +Salmonella enterica subsp. enterica serovar Kentucky str. 20793 1124954 +Salmonella enterica subsp. enterica serovar Kentucky str. N312 1124953 +Salmonella enterica subsp. enterica serovar Kentucky str. 22694 1124952 +Salmonella enterica subsp. enterica serovar Kentucky str. 29166 1124951 +Salmonella enterica subsp. enterica serovar Kentucky str. 13562 1124950 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA40 1124949 +Salmonella enterica subsp. enterica serovar Heidelberg str. CVM20752 1124948 +Salmonella enterica subsp. enterica serovar Heidelberg str. CVM24388 1124947 +Salmonella enterica subsp. enterica serovar Heidelberg str. CVM24359 1124946 +Salmonella enterica subsp. enterica serovar Heidelberg str. CVM24391 1124945 +Salmonella enterica subsp. enterica serovar Heidelberg str. N20134 1124944 +Salmonella enterica subsp. enterica serovar Heidelberg str. 24393 1124943 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41566 1124942 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41563 1124941 +Salmonella enterica subsp. enterica serovar Heidelberg str. N18393 1124940 +Salmonella enterica subsp. enterica serovar Heidelberg str. N26457 1124939 +Salmonella enterica subsp. enterica serovar Heidelberg str. N19871 1124938 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41579 1124937 +Salmonella enterica subsp. enterica serovar Heidelberg str. 41578 1124936 +Salmonella enterica subsp. enterica serovar Heidelberg str. 24390 1124935 +Salmonella enterica subsp. enterica serovar Heidelberg str. 82-2052 1124934 +Salmonella enterica subsp. enterica serovar Hadar str. ATCC 51956 1124933 +Salmonella enterica subsp. enterica serovar Enteritidis str. RDNC 1124932 +Salmonella enterica subsp. enterica serovar Enteritidis str. MEI 19721-1 1124931 +Salmonella enterica subsp. enterica serovar Enteritidis str. IEH 300646-11 1124930 +Salmonella enterica subsp. enterica serovar Derby str. 626 1124929 +Salmonella enterica subsp. enterica serovar Cerro str. 818 1124928 +Salmonella enterica subsp. enterica serovar Braenderup str. 700136 1124927 +Salmonella enterica subsp. enterica serovar Berta str. ATCC 8392 1124926 +Salmonella enterica subsp. enterica serovar Bareilly str. ATCC 9115 1124925 +Salmonella enterica subsp. enterica serovar Anatum str. USDA 100 1124924 +Salmonella enterica subsp. enterica serovar Agona str. 648586-1 1124923 +Salmonella enterica subsp. enterica serovar Agona str. 532307 4-2 1124922 +Salmonella enterica subsp. enterica serovar Agona str. 419639 2-1 1124921 +Salmonella enterica subsp. enterica serovar Agona str. 311387-1 1124920 +Salmonella enterica subsp. enterica serovar Agona str. 632182-2 1124919 +Salmonella enterica subsp. enterica serovar Agona str. 339787 1124918 +Salmonella enterica subsp. enterica serovar Agona str. 460004 2-1 1124917 +Salmonella enterica subsp. enterica serovar Agona str. 460004 1-1 1124916 +Salmonella enterica subsp. enterica serovar Agona str. 447967 2-1 1124915 +Salmonella enterica subsp. enterica serovar Agona str. 447967 1-1 1124914 +Salmonella enterica subsp. enterica serovar Agona str. 442692 2-5 1124913 +Salmonella enterica subsp. enterica serovar Agona str. 442692 2-4 1124912 +Salmonella enterica subsp. enterica serovar Agona str. 409753-6 1124911 +Salmonella enterica subsp. enterica serovar Agona str. 620239 1124910 +Salmonella enterica subsp. enterica serovar Agona str. 557928 1124909 +Salmonella enterica subsp. enterica serovar Agona str. 467481 1124908 +Salmonella enterica subsp. enterica serovar Agona str. 432613 1124907 +Salmonella enterica subsp. enterica serovar Agona str. 266757-1 1124906 +Salmonella enterica subsp. enterica serovar Soerenga 1124904 +Salmonella enterica subsp. enterica serovar Enteritidis str. 53-407 1116477 +Salmonella enterica subsp. enterica serovar Enteritidis str. 58-6482 1116476 +Salmonella enterica subsp. enterica serovar Typhimurium str. 14028s Wu 1114957 +Salmonella enterica subsp. arizonae str. SARC 5 1114956 +Salmonella enterica subsp. enterica serovar Muenchen str. SARB32 1114952 +Salmonella enterica subsp. enterica serovar Enteritidis str. SARB19 1114951 +Salmonella enterica subsp. enterica serovar Thompson str. SARB62 1114949 +Salmonella enterica subsp. enterica serovar Bovismorbificans str. 01-05481 PT13 1114948 +Salmonella enterica subsp. enterica serovar Typhimurium str. A36 1114947 +Salmonella enterica subsp. enterica serovar Typhimurium str. 00-01036 1114946 +Salmonella enterica subsp. salamae serovar Sofia str. S1296 1107884 +"Salmonella enterica subsp. enterica serovar O7:Hh:1,5" 1095634 +"Salmonella enterica subsp. enterica serovar O7:Hc:1,5" 1095633 +Salmonella enterica subsp. enterica serovar Cerro FSL R8-0235 1094506 +Salmonella enterica subsp. enterica serovar Typhimurium str. G455 1094461 +Salmonella enterica subsp. enterica serovar Typhimurium str. SDT1291 1094460 +Salmonella enterica subsp. enterica serovar Enteritidis str. 50-3079 1090945 +Salmonella enterica subsp. enterica serovar Stanley str. SARB 60 1090941 +Salmonella enterica subsp. diarizonae str. 01-005 1090939 +Salmonella enterica subsp. enterica serovar Senftenberg str. SARB 59 1090938 +Salmonella enterica subsp. enterica serovar Gallinarum/pullorum str. RKS5078 1081093 +Salmonella enterica subsp. enterica serovar Braenderup str. S-500 1079987 +Salmonella enterica subsp. enterica serovar Hindmarsh 1079901 +Salmonella enterica subsp. enterica serovar Muenchen str. baa1674 1079478 +Salmonella enterica subsp. enterica serovar Muenchen str. baa1594 1079477 +Salmonella enterica subsp. enterica serovar Enteritidis str. 62-1976 1079476 +Salmonella enterica subsp. enterica serovar Enteritidis str. 81-2625 1079475 +Salmonella enterica subsp. enterica serovar Javiana str. 10721 1079474 +Salmonella enterica subsp. enterica serovar Montevideo str. 8387 1079473 +Salmonella enterica subsp. enterica serovar Pullorum str. 10398 1079472 +Salmonella enterica subsp. enterica serovar Pullorum str. 13036 1079471 +Salmonella enterica subsp. enterica serovar Pullorum str. 19945 1079470 +Salmonella enterica subsp. enterica serovar Saintpaul str. JO2008 1079469 +Salmonella enterica subsp. salamae str. 3588/07 1078775 +Salmonella enterica subsp. enterica serovar Fresno 1077085 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4923 1074541 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4890 1074540 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4889 1074539 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4844 1074538 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4842 1074537 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4841 1074536 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4840 1074535 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4839 1074534 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4838 1074533 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4679 1074532 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4673 1074531 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4464 1074530 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_3515 1074529 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_2868 1074528 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_2533 1074527 +Salmonella enterica subsp. enterica serovar Montevideo str. S5_470 1074526 +Salmonella enterica subsp. enterica serovar Montevideo str. S5_457 1074525 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_5057 1074524 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_5054 1074523 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_5050 1074522 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4936 1074521 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4935 1074520 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4934 1074519 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4933 1074518 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4932 1074517 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4931 1074516 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4930 1074515 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4929 1074514 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4928 1074513 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4927 1074512 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4926 1074511 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4925 1074510 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4924 1074509 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4922 1074508 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4921 1074507 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4920 1074506 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4919 1074505 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4918 1074504 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4916 1074503 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4893 1074502 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4892 1074501 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4891 1074500 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4888 1074499 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4887 1074498 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4846 1074497 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4845 1074496 +Salmonella enterica subsp. enterica serovar Montevideo str. R8_4843 1074495 +Salmonella enterica subsp. enterica serovar Agona str. 400100 30-11 1072602 +Salmonella enterica subsp. enterica serovar Agona str. 400100 7-9 1072601 +Salmonella enterica subsp. enterica serovar Agona str. 400100 6-5 1072600 +Salmonella enterica subsp. enterica serovar Agona str. 400100 5-3 1072599 +Salmonella enterica subsp. enterica serovar Agona str. 400096 16 1072598 +Salmonella enterica subsp. enterica serovar Agona str. 400095 22 1072597 +Salmonella enterica subsp. enterica serovar Agona str. 400095 19 1072596 +Salmonella enterica subsp. enterica serovar Agona str. 400095 18 1072595 +Salmonella enterica subsp. enterica serovar Agona str. 400095 17 1072594 +Salmonella enterica subsp. enterica serovar Agona str. 400095 14 1072593 +Salmonella enterica subsp. enterica serovar Agona str. 400095 13 1072592 +Salmonella enterica subsp. enterica serovar Agona str. 400095 11 1072591 +Salmonella enterica subsp. enterica serovar Agona str. 392869-2 1072590 +Salmonella enterica subsp. enterica serovar Agona str. 392869-1 1072589 +Salmonella enterica subsp. enterica serovar Agona str. 246555-3 1072588 +Salmonella enterica subsp. enterica serovar Agona str. 241981 1072587 +Salmonella enterica subsp. enterica serovar Paratyphi A str. ZJ98-53 1072572 +Salmonella enterica subsp. enterica serovar Paratyphi A str. YN09620 1072571 +Salmonella enterica subsp. enterica serovar Paratyphi A str. JX05-19 1072570 +Salmonella enterica subsp. enterica serovar Paratyphi A str. GZ9A00052 1072569 +Salmonella enterica subsp. enterica serovar Paratyphi A str. GXS2268 1072568 +Salmonella enterica subsp. enterica serovar Thompson str. RM6836 1064551 +Salmonella enterica subsp. enterica serovar Heidelberg str. N653 1054966 +Salmonella enterica subsp. enterica serovar Heidelberg str. N4541 1054965 +Salmonella enterica subsp. enterica serovar Heidelberg str. 670102-3 1054964 +Salmonella enterica subsp. enterica serovar Heidelberg str. N4403 1054963 +Salmonella enterica subsp. enterica serovar Heidelberg str. 579083-10 1054962 +Salmonella enterica subsp. enterica serovar Heidelberg str. 622737-21 1054961 +Salmonella enterica subsp. enterica serovar Heidelberg str. N4496 1054960 +Salmonella enterica subsp. enterica serovar Heidelberg str. N1536 1054959 +Salmonella enterica subsp. enterica serovar Heidelberg str. N1514 1054958 +Salmonella enterica subsp. enterica serovar Heidelberg str. N189 1054957 +Salmonella enterica subsp. enterica serovar Heidelberg str. 622737-14 1054956 +Salmonella enterica subsp. enterica serovar Heidelberg str. 622737-12 1054955 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-014588 1054954 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-014316 1054953 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-013988 1054952 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-013343 1054951 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA 39 1054950 +Salmonella enterica subsp. enterica serovar Heidelberg str. 579083-19 1054949 +Salmonella enterica subsp. enterica serovar Heidelberg str. 632675-24 1054948 +"Salmonella enterica subsp. houtenae serovar 44:z4,z23:-" 1050193 +"Salmonella enterica subsp. diarizonae serovar O61:k:1,5" 1050192 +"Salmonella enterica subsp. houtenae serovar 48:g,z51:-" 1050190 +Salmonella enterica subsp. enterica serovar Typhimurium str. AZ 057 1037262 +Salmonella enterica subsp. enterica serovar Heidelberg str. 579082-8 1037261 +Salmonella enterica subsp. enterica serovar Heidelberg str. 622737-11 1037259 +Salmonella enterica subsp. enterica serovar Heidelberg str. 607310-1 1037258 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-013374 1037257 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-013312 1037256 +Salmonella enterica subsp. enterica serovar Heidelberg str. 670102-5 1030007 +Salmonella enterica subsp. enterica serovar Heidelberg str. N19992 1030006 +Salmonella enterica subsp. enterica serovar Heidelberg str. N418 1030005 +Salmonella enterica subsp. enterica serovar Heidelberg str. 607309-34 1030004 +Salmonella enterica subsp. enterica serovar Heidelberg str. 640151-11 1030003 +Salmonella enterica subsp. enterica serovar Heidelberg str. 607309-5 1030002 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-014319 1030001 +Salmonella enterica subsp. enterica serovar Heidelberg str. RI-11-013193 1030000 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA31 1029999 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA32 1029998 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA35 1029997 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA37 1029996 +Salmonella enterica subsp. enterica serovar Agona str. 0322 1029990 +Salmonella enterica subsp. enterica serovar Agona str. 0292 1029989 +Salmonella enterica subsp. enterica serovar Enteritidis str. 50-5646 1029986 +Salmonella enterica subsp. enterica serovar Enteritidis str. 6.0562-1 1029985 +Salmonella enterica subsp. enterica serovar Enteritidis str. SARB17 1029984 +Salmonella enterica subsp. enterica serovar Abony str. 0014 1029983 +Salmonella enterica subsp. enterica serovar Tallahassee str. 0012 1029982 +Salmonella enterica subsp. enterica serovar Tennessee str. 2691 1029981 +Salmonella enterica subsp. enterica serovar Kentucky str. 5349 1029980 +Salmonella enterica subsp. enterica serovar Pullorum str. ATCC 9120 1029979 +Salmonella enterica subsp. enterica serovar Typhimurium str. SARA13 1029978 +Salmonella enterica subsp. enterica serovar Paratyphi B str. SARA42 1029977 +Salmonella enterica subsp. enterica serovar Paratyphi B str. SPB7 1016998 +Salmonella enterica subsp. enterica serovar Typhimurium str. 798 1008297 +Salmonella enterica subsp. enterica serovar Oslo 1005394 +Salmonella enterica subsp. enterica serovar Tennessee str. TXSC_TXSC08-21 1003192 +Salmonella enterica subsp. enterica serovar Tennessee str. TXSC_TXSC08-19 1003191 +Salmonella enterica subsp. enterica serovar Agona str. SAR B1 1003190 +Salmonella enterica subsp. enterica serovar Agona str. SA-5 1003189 +Salmonella enterica subsp. enterica serovar Agona str. SA-4 1003188 +Salmonella enterica subsp. enterica serovar Agona str. SA-3 1003187 +Salmonella enterica subsp. enterica serovar Agona str. SA-2 1003186 +Salmonella enterica subsp. enterica serovar Agona str. SA-1 1003185 +Salmonella enterica subsp. enterica serovar Enteritidis str. RM2968 998822 +Salmonella enterica subsp. enterica serovar Enteritidis str. RM4369 998821 +Salmonella enterica subsp. enterica serovar Newport str. RI_10P079 997345 +Salmonella enterica subsp. enterica serovar Newport str. RI_10P078 997344 +Salmonella enterica subsp. enterica serovar Newport str. RI_10P069 997343 +Salmonella enterica subsp. enterica serovar Newport str. RI_10P068 997342 +Salmonella enterica subsp. enterica serovar Newport str. WA_14900 997341 +Salmonella enterica subsp. enterica serovar Newport str. WA_14885 997340 +Salmonella enterica subsp. enterica serovar Newport str. WA_14882 997339 +Salmonella enterica subsp. enterica serovar Newport str. WA_14881 997338 +Salmonella enterica subsp. enterica serovar Newport str. VA_R100512572 997337 +Salmonella enterica subsp. enterica serovar Newport str. VA_R100512570 997336 +Salmonella enterica subsp. enterica serovar Newport str. VA_R100506907 997335 +Salmonella enterica subsp. enterica serovar Oranienburg str. 701 997334 +Salmonella enterica subsp. enterica serovar Oranienburg str. 0250 997333 +Salmonella enterica subsp. enterica serovar Meleagridis str. 0047 997332 +Salmonella enterica subsp. enterica serovar Choleraesuis str. 0008 997331 +Salmonella enterica subsp. enterica serovar Choleraesuis str. 0006 997330 +Salmonella enterica subsp. enterica serovar Enteritidis str. 33944 997329 +Salmonella enterica subsp. enterica serovar Enteritidis str. 76-2651 997328 +Salmonella enterica subsp. enterica serovar Typhimurium str. L-3553 996633 +Salmonella enterica subsp. enterica serovar Typhimurium str. UK-1 990282 +Salmonella enterica subsp. enterica serovar Virchow str. ATCC 51955 984254 +Salmonella enterica subsp. enterica serovar Newport str. S103RVX 984253 +Salmonella enterica subsp. enterica serovar Newport str. A182RVB 984252 +Salmonella enterica subsp. enterica serovar Newport str. Pond080-2TTA 984251 +Salmonella enterica subsp. enterica serovar Newport str. 637564_17 984250 +Salmonella enterica subsp. enterica serovar Newport str. 36807 984249 +Salmonella enterica subsp. enterica serovar Newport str. 36805 984248 +Salmonella enterica subsp. enterica serovar Newport str. 36804 984247 +Salmonella enterica subsp. enterica serovar Newport str. 36803 984246 +Salmonella enterica subsp. enterica serovar Newport str. 36802 984245 +Salmonella enterica subsp. enterica serovar Newport str. 36801 984244 +Salmonella enterica subsp. enterica serovar Newport str. 36799 984243 +Salmonella enterica subsp. enterica serovar Montevideo str. CT_02035320 984242 +Salmonella enterica subsp. enterica serovar Montevideo str. CT_02035318 984241 +Salmonella enterica subsp. enterica serovar Montevideo str. CT_02035278 984240 +Salmonella enterica subsp. enterica serovar Mbandaka str. ATCC 51958 984237 +Salmonella enterica subsp. enterica serovar Kentucky str. ATCC 9263 984236 +Salmonella enterica subsp. enterica serovar Gaminara str. ATCC BAA-711 984235 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648901 16-16 984234 +Salmonella enterica subsp. enterica serovar Enteritidis str. 543463 42-20 984233 +Salmonella enterica subsp. enterica serovar Enteritidis str. 561362 9-7 984232 +Salmonella enterica subsp. enterica serovar Enteritidis str. 642044 8-1 984231 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648901 6-18 984230 +Salmonella enterica subsp. enterica serovar Enteritidis str. 653049 13-19 984229 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648905 5-18 984228 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648904 3-6 984227 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648903 1-6 984226 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648902 6-8 984225 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648901 39-2 984224 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648901 1-17 984223 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648900 1-16 984222 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648899 3-17 984221 +Salmonella enterica subsp. enterica serovar Enteritidis str. 648898 4-5 984220 +Salmonella enterica subsp. enterica serovar Enteritidis str. 642046 4-7 984219 +Salmonella enterica subsp. enterica serovar Enteritidis str. 642044 4-1 984218 +Salmonella enterica subsp. enterica serovar Enteritidis str. 561362 1-1 984217 +Salmonella enterica subsp. enterica serovar Enteritidis str. 543463 40-18 984216 +Salmonella enterica subsp. enterica serovar Enteritidis str. 543463 22-17 984215 +Salmonella enterica subsp. enterica serovar Enteritidis str. 22558 984214 +Salmonella enterica subsp. enterica serovar Enteritidis str. CHS4 984213 +Salmonella enterica subsp. enterica serovar Enteritidis str. 17927 984212 +Salmonella enterica subsp. enterica serovar Anatum str. ATCC BAA-1592 984211 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA30 947304 +Salmonella enterica subsp. enterica serovar Typhimurium str. TN061786 946034 +Salmonella enterica subsp. enterica serovar Javiana str. PRS_2010_0720 945541 +Salmonella enterica subsp. enterica serovar Newport str. PRS_2010_0624 945539 +Salmonella enterica subsp. enterica serovar Chester str. ATCC 11997 941190 +Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 11511 941189 +Salmonella enterica subsp. enterica serovar Pomona str. ATCC 10729 941188 +Salmonella enterica subsp. enterica serovar Inverness str. ATCC 10720 941187 +"Salmonella enterica subsp. diarizonae serovar 65:c:1,5,7" 940240 +"Salmonella enterica subsp. diarizonae serovar 61:c:1,5,(7)" 940239 +"Salmonella enterica subsp. diarizonae serovar 60:z52:1,5" 940238 +"Salmonella enterica subsp. diarizonae serovar 47:l,v:1,5,(7)" 940237 +"Salmonella enterica subsp. diarizonae serovar 42:l,v:1,5,7" 940236 +Salmonella enterica subsp. enterica serovar Nima 940233 +Salmonella enterica subsp. enterica serovar Michigan 940232 +Salmonella enterica subsp. enterica serovar Edinburgh 940231 +Salmonella enterica subsp. enterica serovar Enteritidis str. 638970-15 938147 +Salmonella enterica subsp. enterica serovar Newport str. DC_10-450 938146 +Salmonella enterica subsp. enterica serovar Newport str. DC_10-449 938145 +Salmonella enterica subsp. enterica serovar Newport str. DC_10-446 938144 +Salmonella enterica subsp. enterica serovar Rubislaw str. ATCC 10717 938143 +Salmonella enterica subsp. enterica serovar Choleraesuis str. ATCC 10708 938142 +Salmonella enterica subsp. enterica serovar Sloterdijk str. ATCC 15791 938141 +Salmonella enterica subsp. enterica serovar Sendai str. 55-2461 937594 +Salmonella enterica subsp. enterica serovar Weltevreden str. 2007-60-3289-1 936157 +Salmonella enterica subsp. enterica serovar Newport str. MA_10EN1469 935708 +Salmonella enterica subsp. enterica serovar Newport str. VA_R100808502 935707 +Salmonella enterica subsp. enterica serovar Newport str. VA_R100804798 935706 +Salmonella enterica subsp. enterica serovar Thompson str. ATCC 8391 935705 +Salmonella enterica subsp. enterica serovar Agona str. ATCC BAA-707 935703 +Salmonella enterica subsp. enterica serovar Agona str. ATCC 51957 935702 +Salmonella enterica subsp. enterica serovar Agona str. R0102 935289 +Salmonella enterica subsp. enterica serovar Bardo 932733 +Salmonella enterica subsp. enterica serovar Newport str. Levine 15 930779 +Salmonella enterica subsp. enterica serovar Newport str. Levine 1 930778 +Salmonella enterica subsp. enterica serovar Paratyphi B str. ATCC 8759 930777 +Salmonella enterica subsp. enterica serovar Paratyphi B str. ATCC 51962 930776 +Salmonella enterica subsp. enterica serovar Paratyphi B str. ATCC 19940 930775 +Salmonella enterica subsp. enterica serovar Paratyphi B str. ATCC 10719 930774 +Salmonella enterica subsp. enterica serovar Senftenberg str. ATCC 8400 930773 +Salmonella enterica subsp. enterica serovar Senftenberg str. ATCC 43845 930772 +Salmonella enterica subsp. enterica serovar Braenderup str. ATCC BAA-664 930771 +Salmonella enterica subsp. enterica serovar Muenchen str. ATCC 8388 930770 +Salmonella enterica subsp. enterica serovar Enteritidis str. 8b-1 930769 +Salmonella enterica subsp. enterica serovar Enteritidis str. CVM_69-4941 930768 +Salmonella enterica subsp. enterica serovar Enteritidis str. 22510-1 926037 +Salmonella enterica subsp. enterica serovar Enteritidis str. 78-1757 926036 +Salmonella enterica subsp. enterica serovar Enteritidis str. 77-2659 926035 +Salmonella enterica subsp. enterica serovar Enteritidis str. 77-1427 926034 +Salmonella enterica subsp. enterica serovar Enteritidis str. SL913 925133 +Salmonella enterica subsp. enterica serovar Enteritidis str. SL909 925132 +Salmonella enterica subsp. enterica serovar Enteritidis str. CVM_81-2490 925131 +Salmonella enterica subsp. enterica serovar Enteritidis str. 13183-1 925130 +Salmonella enterica subsp. enterica serovar Enteritidis str. CVM_76-3618 925129 +Salmonella enterica subsp. enterica serovar Enteritidis str. CVM_56-3991 925128 +Salmonella enterica subsp. enterica serovar Enteritidis str. CVM_N202 925127 +Salmonella enterica subsp. enterica serovar Enteritidis str. SE15-1 925126 +Salmonella enterica subsp. enterica serovar Heidelberg str. SARA36 925125 +Salmonella enterica subsp. enterica serovar Manchester 915158 +Salmonella enterica subsp. enterica serovar Montevideo str. S5-403 913242 +Salmonella enterica subsp. enterica serovar Alachua str. R6-377 913241 +Salmonella enterica subsp. enterica serovar Alachua 913240 +Salmonella enterica subsp. enterica serovar Wandsworth str. A4-580 913086 +Salmonella enterica subsp. enterica serovar Wandsworth 913085 +Salmonella enterica subsp. enterica serovar Urbana str. R8-2977 913084 +Salmonella enterica subsp. enterica serovar Uganda str. R8-3404 913083 +Salmonella enterica subsp. enterica serovar Senftenberg str. A4-543 913082 +Salmonella enterica subsp. enterica serovar Rubislaw str. A4-653 913081 +Salmonella enterica subsp. enterica serovar Mississippi str. A4-633 913080 +Salmonella enterica subsp. enterica serovar Mississippi 913079 +Salmonella enterica subsp. enterica serovar Minnesota str. A4-603 913078 +Salmonella enterica subsp. enterica serovar Johannesburg str. S5-703 913077 +Salmonella enterica subsp. enterica serovar Johannesburg 913076 +Salmonella enterica subsp. enterica serovar Inverness str. R8-3668 913075 +Salmonella enterica subsp. enterica serovar Inverness 913074 +Salmonella enterica subsp. enterica serovar Hvittingfoss str. A4-620 913073 +Salmonella enterica subsp. enterica serovar Give str. S5-487 913072 +Salmonella enterica subsp. enterica serovar Gaminara str. A4-567 913071 +Salmonella enterica subsp. enterica serovar Gaminara 913070 +Salmonella enterica subsp. enterica serovar Baildon str. R6-199 913069 +Salmonella enterica subsp. enterica serovar Baildon 913068 +Salmonella enterica subsp. enterica serovar Adelaide str. A4-669 913063 +Salmonella enterica subsp. enterica serovar Enteritidis str. 639672-50 910419 +Salmonella enterica subsp. enterica serovar Enteritidis str. 639672-46 910418 +Salmonella enterica subsp. enterica serovar Enteritidis str. 629164-37 910417 +Salmonella enterica subsp. enterica serovar Enteritidis str. 629164-26 910416 +Salmonella enterica subsp. enterica serovar Enteritidis str. 596866-70 910415 +Salmonella enterica subsp. enterica serovar Enteritidis str. 596866-22 910414 +Salmonella enterica subsp. enterica serovar Enteritidis str. 485549-17 910413 +Salmonella enterica subsp. enterica serovar Gallinarum str. SG9 909947 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST4/74 909946 +Salmonella enterica subsp. enterica serovar Dublin str. SD3246 909945 +Salmonella enterica subsp. enterica serovar Enteritidis str. ATCC BAA-1587 909465 +Salmonella enterica subsp. enterica serovar Tshiongwe 905066 +Salmonella enterica subsp. enterica serovar Bsilla 905065 +Salmonella enterica subsp. enterica serovar Choleraesuis str. SCSA50 904139 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC_2009K1153 891424 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC_2009K1277 891423 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC_2009K1283 891422 +Salmonella enterica subsp. enterica serovar Typhimurium str. CDC_2009K1158 891421 +Salmonella enterica subsp. enterica serovar Javiana str. ATCC BAA-1593 891420 +Salmonella enterica subsp. enterica serovar Enteritidis str. 629163 891414 +Salmonella enterica subsp. enterica serovar Enteritidis str. 607307-6 891413 +Salmonella enterica subsp. enterica serovar Enteritidis str. 607308-9 891412 +Salmonella enterica subsp. enterica serovar Enteritidis str. 77-0424 891411 +Salmonella enterica subsp. enterica serovar Enteritidis str. 607307-2 887070 +Salmonella enterica subsp. enterica serovar Enteritidis str. 607308-19 887069 +Salmonella enterica subsp. enterica serovar Enteritidis str. 607308-16 887068 +Salmonella enterica subsp. enterica serovar Enteritidis str. 635290-58 887067 +Salmonella enterica subsp. enterica serovar Enteritidis str. 640631 887066 +Salmonella enterica subsp. enterica serovar Enteritidis str. 639016-6 887065 +Salmonella enterica subsp. enterica serovar Enteritidis str. 622731-39 887064 +Salmonella enterica subsp. enterica serovar Enteritidis str. 576709 887063 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1791 886728 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1745 886727 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1725 886726 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1575 886725 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1455 886724 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_0956 886723 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1811 886722 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1808 886721 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1795 886720 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1565 886719 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1559 886718 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1445 886717 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1444 886716 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_0968 886715 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1747 885387 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1457 885386 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_0899 885385 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_0895 885384 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1729 885383 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1010 885382 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1018 885381 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1558 885380 +"Salmonella enterica subsp. arizonae serovar 62:z4,z23:- str. RSK2980" 882884 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1810 882879 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1441 882878 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1543 882877 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1580 882876 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1566 882875 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1594 882874 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1884 882873 +Salmonella enterica subsp. enterica serovar Enteritidis str. CDC_2010K_1882 882872 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2010008287 882869 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2010008286 882868 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2010008285 882867 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2010008284 882866 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2010008283 882865 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2010008282 882864 +Salmonella enterica subsp. enterica serovar Montevideo str. IA_2009159199 882863 +Salmonella enterica subsp. enterica serovar Montevideo str. CT_02035327 882862 +Salmonella enterica subsp. enterica serovar Montevideo str. CT_02035321 882860 +Salmonella enterica subsp. enterica serovar Muenster str. USMARC-S2125.1 877469 +Salmonella enterica subsp. enterica serovar Newport str. USMARC-S3124.1 877468 +Salmonella enterica subsp. enterica serovar Montevideo str. 315731156 871593 +Salmonella enterica subsp. enterica serovar Montevideo str. 2009085258 871592 +Salmonella enterica subsp. enterica serovar Montevideo str. 2009083312 871591 +Salmonella enterica subsp. enterica serovar Montevideo str. MB111609-0052 871590 +Salmonella enterica subsp. enterica serovar Montevideo str. MB110209-0055 871589 +Salmonella enterica subsp. enterica serovar Montevideo str. MB102109-0047 871588 +Salmonella enterica subsp. enterica serovar Montevideo str. MB101509-0077 871587 +Salmonella enterica subsp. enterica serovar Montevideo str. 556152 871586 +Salmonella enterica subsp. enterica serovar Kentucky str. 29439 866919 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i:- str. 08-1739" 866915 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i:- str. 08-1700" 866914 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i:- str. 08-1736" 866913 +Salmonella enterica subsp. enterica serovar Montevideo str. 507440-20 859199 +Salmonella enterica subsp. enterica serovar Montevideo str. 609460 859198 +Salmonella enterica subsp. enterica serovar Newport str. CVM 4176 859197 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19536 859196 +Salmonella enterica subsp. enterica serovar Montevideo str. 556150-1 858318 +Salmonella enterica subsp. enterica serovar Montevideo str. 609458-1 858317 +Salmonella enterica subsp. enterica serovar Montevideo str. 446600 858316 +Salmonella enterica subsp. enterica serovar Montevideo str. 413180 858315 +Salmonella enterica subsp. enterica serovar Montevideo str. 366867 858314 +Salmonella enterica subsp. enterica serovar Montevideo str. 414877 858313 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19470 858312 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19593 858311 +Salmonella enterica subsp. enterica serovar Newport str. CVM 37978 858310 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19443 858309 +Salmonella enterica subsp. enterica serovar Newport str. CVM 21554 858308 +Salmonella enterica subsp. enterica serovar Newport str. CVM N1543 858307 +Salmonella enterica subsp. enterica serovar Newport str. CVM N18486 858306 +Salmonella enterica subsp. enterica serovar Newport str. CVM 22462 858305 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19447 796737 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19449 796736 +Salmonella enterica subsp. enterica serovar Newport str. CVM 19567 796735 +Salmonella enterica subsp. enterica serovar Newport str. CVM 35202 796734 +Salmonella enterica subsp. enterica serovar Newport str. CVM 21550 796733 +Salmonella enterica subsp. enterica serovar Newport str. CVM 22513 796732 +Salmonella enterica subsp. enterica serovar Newport str. CVM 21538 796731 +Salmonella enterica subsp. enterica serovar Newport str. CVM 22425 796730 +"Salmonella enterica subsp. enterica serovar 6,7:d:-" 794865 +Salmonella enterica subsp. enterica serovar Newport str. CVM 21559 789647 +Salmonella enterica subsp. enterica serovar Newport str. CVM 35188 789646 +Salmonella enterica subsp. enterica serovar Newport str. CVM 33953 789645 +Salmonella enterica subsp. enterica serovar Newport str. CVM 21539 789644 +Salmonella enterica subsp. enterica serovar Newport str. CVM 35199 789643 +Salmonella enterica subsp. enterica serovar Newport str. CVM 35185 789642 +Salmonella enterica subsp. enterica serovar Montevideo str. MD_MDA09249507 789332 +Salmonella enterica subsp. enterica serovar Montevideo str. 81038-01 766762 +Salmonella enterica subsp. enterica serovar Montevideo str. 4441 H 766761 +Salmonella enterica subsp. enterica serovar Montevideo str. 80959-06 763922 +Salmonella enterica subsp. enterica serovar Montevideo str. 42N 763921 +Salmonella enterica subsp. enterica serovar Montevideo str. 29N 763920 +Salmonella enterica subsp. enterica serovar Montevideo str. 19N 763919 +Salmonella enterica subsp. enterica serovar Senftenberg str. 361154004 749965 +Salmonella enterica subsp. enterica serovar Senftenberg str. 316235162 749964 +Salmonella enterica subsp. enterica serovar Senftenberg str. NC_MB012510-0038 749962 +Salmonella enterica subsp. enterica serovar Senftenberg str. 423984-2 749961 +Salmonella enterica subsp. enterica serovar Senftenberg str. 423984-1 749960 +Salmonella enterica subsp. enterica serovar Montevideo str. ATCC BAA710 749953 +Salmonella enterica subsp. enterica serovar Montevideo str. SARB31 749952 +Salmonella enterica subsp. enterica serovar Montevideo str. CASC_09SCPH15965 749951 +Salmonella enterica subsp. enterica serovar Montevideo str. OH_2009072675 749950 +Salmonella enterica subsp. enterica serovar Montevideo str. NC_MB110209-0054 749949 +Salmonella enterica subsp. enterica serovar Montevideo str. LQC 10 749948 +Salmonella enterica subsp. enterica serovar Montevideo str. SARB30 749947 +Salmonella enterica subsp. enterica serovar Montevideo str. 50262 749943 +Salmonella enterica subsp. enterica serovar Montevideo str. 50270 749942 +Salmonella enterica subsp. enterica serovar Tennessee str. 4535 749930 +Salmonella enterica subsp. enterica serovar Montevideo str. 531954 745022 +Salmonella enterica subsp. enterica serovar Montevideo str. 515920-2 745021 +Salmonella enterica subsp. enterica serovar Montevideo str. 515920-1 745020 +Salmonella enterica subsp. enterica serovar Montevideo str. 495297-4 745019 +Salmonella enterica subsp. enterica serovar Montevideo str. 495297-3 745018 +Salmonella enterica subsp. enterica serovar Montevideo str. 495297-1 745017 +Salmonella enterica subsp. enterica serovar Montevideo str. 316111868 745016 +Salmonella enterica subsp. enterica serovar Montevideo str. 315996572 745015 +Salmonella enterica subsp. enterica serovar Typhimurium str. T000240 718274 +Salmonella enterica subsp. enterica serovar Paratyphi B str. SARA62 702985 +Salmonella enterica subsp. enterica serovar Paratyphi B str. SARA61 702984 +Salmonella enterica subsp. enterica serovar Paratyphi B str. SARA56 702983 +Salmonella enterica subsp. enterica serovar Saintpaul str. SARA26 702982 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST18563 702981 +Salmonella enterica subsp. enterica serovar Typhimurium str. ST4581 702980 +Salmonella enterica subsp. enterica serovar Enteritidis str. CHS44 702979 +Salmonella enterica subsp. enterica serovar Enteritidis str. SE30663 702978 +Salmonella enterica subsp. enterica serovar Enteritidis str. 22704 702976 +Salmonella enterica subsp. enterica serovar Enteritidis str. SE8a 696870 +Salmonella enterica subsp. enterica serovar Enteritidis str. 436 696869 +Salmonella enterica subsp. enterica serovar Enteritidis str. PT23 696868 +Salmonella enterica subsp. enterica serovar Enteritidis str. 18569 696867 +Salmonella enterica subsp. enterica serovar Enteritidis str. 13-1 696866 +Salmonella enterica subsp. enterica serovar Enteritidis str. SE10 696865 +Salmonella enterica subsp. enterica serovar Enteritidis str. 20037 696864 +Salmonella enterica subsp. enterica serovar Dublin str. SL1438 687915 +Salmonella enterica subsp. enterica serovar Rissen str. 150 687914 +Salmonella enterica subsp. enterica serovar Dublin str. ATCC 39184 687860 +Salmonella enterica subsp. enterica serovar Gallinarum str. 9184 685040 +Salmonella enterica subsp. enterica serovar Kiambu 682797 +Salmonella enterica subsp. enterica serovar Strasbourg 682796 +Salmonella enterica subsp. enterica serovar Mygdal 659432 +Salmonella enterica subsp. enterica serovar Dakar 630526 +Salmonella enterica subsp. enterica serovar Typhi str. SGSC2661 596159 +Salmonella enterica subsp. enterica serovar Muenchen str. SARB34 596158 +Salmonella enterica subsp. enterica serovar Abortusovis str. SSM0041 596157 +Salmonella enterica subsp. enterica serovar Poona str. SGSC4934 596156 +Salmonella enterica subsp. enterica serovar Infantis str. SARB27 596155 +Salmonella enterica subsp. enterica serovar Corvallis 593905 +Salmonella enterica subsp. enterica serovar Amsterdam 593904 +Salmonella enterica subsp. enterica serovar Bonn 589371 +Salmonella enterica subsp. enterica serovar Typhimurium str. 5579 589366 +Salmonella enterica subsp. enterica serovar Typhimurium str. A130 589363 +Salmonella enterica subsp. enterica serovar Typhimurium str. 14028S 588858 +Salmonella enterica subsp. enterica serovar Newport str. CVM36720 585201 +Salmonella enterica subsp. enterica serovar Tennessee str. CDC07-0191 573395 +Salmonella enterica subsp. enterica serovar Pomona 570935 +Salmonella enterica subsp. enterica serovar Typhimurium str. DT2 568709 +Salmonella enterica subsp. enterica serovar Typhimurium str. D23580 568708 +Salmonella enterica subsp. enterica serovar Hartford 568095 +Salmonella enterica subsp. enterica serovar Paratyphi C str. SARB 49 566547 +Salmonella enterica subsp. enterica serovar Schwarzengrund str. KMR78 565039 +Salmonella enterica subsp. enterica serovar Panama str. KMR64 565038 +Salmonella enterica subsp. enterica serovar Indiana str. KMR53 565037 +Salmonella enterica subsp. enterica serovar Brandenburg str. KMR12 565036 +Salmonella enterica subsp. enterica serovar Enteritidis str. 48-0811 565035 +Salmonella enterica subsp. enterica serovar Paratyphi A str. AKU_12601 554290 +Salmonella enterica subsp. enterica serovar Gallinarum str. 287/91 550538 +Salmonella enterica subsp. enterica serovar Enteritidis str. P125109 550537 +Salmonella enterica subsp. enterica serovar Typhi str. Ty21a 527001 +Salmonella enterica subsp. diarizonae str. ATCC BAA-1579 523839 +Salmonella enterica subsp. salamae str. ATCC BAA-1582 523838 +Salmonella enterica subsp. salamae str. ATCC BAA-1583 523837 +Salmonella enterica subsp. enterica serovar Miami str. ATCC BAA-1586 523836 +Salmonella enterica subsp. indica str. ATCC BAA-1576 523835 +Salmonella enterica subsp. indica str. ATCC BAA-1578 523834 +"Salmonella enterica subsp. arizonae serovar 41:z4,z23:- str. ATCC BAA-1577" 523833 +Salmonella enterica subsp. houtenae str. ATCC BAA-1580 523832 +Salmonella enterica subsp. houtenae str. ATCC BAA-1581 523831 +Salmonella enterica subsp. enterica serovar Paratyphi B str. ATCC BAA-1584 523830 +Salmonella enterica subsp. enterica serovar Paratyphi B str. ATCC BAA-1585 523829 +Salmonella enterica subsp. enterica serovar Muenster str. ATCC BAA-1575 523828 +Salmonella enterica subsp. enterica serovar Typhi str. 404ty 497977 +Salmonella enterica subsp. enterica serovar Typhi str. E00-7866 497976 +Salmonella enterica subsp. enterica serovar Typhi str. E01-6750 497975 +Salmonella enterica subsp. enterica serovar Typhi str. E02-1180 497974 +Salmonella enterica subsp. enterica serovar Typhi str. E98-0664 497973 +Salmonella enterica subsp. enterica serovar Typhi str. E98-2068 496068 +Salmonella enterica subsp. enterica serovar Typhi str. J185 496067 +Salmonella enterica subsp. enterica serovar Typhi str. M223 496066 +Salmonella enterica subsp. enterica serovar Typhi str. AG3 496065 +Salmonella enterica subsp. enterica serovar Typhi str. E98-3139 496064 +Salmonella enterica subsp. enterica serovar Wangata 487006 +Salmonella enterica subsp. enterica serovar Uphill 487005 +Salmonella enterica subsp. enterica serovar Uganda 487004 +Salmonella enterica subsp. enterica serovar Taksony 487003 +Salmonella enterica subsp. enterica serovar Singapore 487002 +Salmonella enterica subsp. enterica serovar Newington 487001 +Salmonella enterica subsp. enterica serovar Molade 487000 +Salmonella enterica subsp. enterica serovar Meleagridis 486999 +Salmonella enterica subsp. enterica serovar Litchfield 486998 +Salmonella enterica subsp. enterica serovar Lille 486997 +Salmonella enterica subsp. enterica serovar Kunzendorf 486996 +Salmonella enterica subsp. enterica serovar Idikan 486995 +Salmonella enterica subsp. enterica serovar Hvittingfoss 486994 +Salmonella enterica subsp. enterica serovar Eastbourne 486993 +Salmonella enterica subsp. enterica serovar Durban 486992 +Salmonella enterica subsp. enterica serovar Dowd 486991 +Salmonella enterica subsp. enterica serovar Copenhagen 486990 +Salmonella enterica subsp. enterica serovar Arizona 486989 +Salmonella enterica subsp. enterica serovar Arechavaleta 486988 +Salmonella enterica subsp. enterica serovar '02-6026 18:1 v-z-Arizona' 486987 +Salmonella enterica subsp. enterica serovar Concord 483687 +Salmonella enterica subsp. enterica serovar Paratyphi C str. RKS4594 476213 +Salmonella enterica subsp. enterica serovar Weltevreden str. HI_N05-537 465518 +Salmonella enterica subsp. enterica serovar Virchow str. SL491 465517 +Salmonella enterica subsp. enterica serovar Hadar str. RI_05P066 465516 +Salmonella enterica subsp. enterica serovar Lansing 459283 +Salmonella enterica subsp. enterica serovar Kentucky str. CDC 191 454231 +Salmonella enterica subsp. enterica serovar Heidelberg str. SL476 454169 +Salmonella enterica subsp. enterica serovar Newport str. SL317 454168 +Salmonella enterica subsp. enterica serovar Javiana str. GA_MM04042433 454167 +Salmonella enterica subsp. enterica serovar Agona str. SL483 454166 +Salmonella enterica subsp. enterica serovar Schwarzengrund str. SL480 454165 +Salmonella enterica subsp. enterica serovar Heidelberg str. SL486 454164 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i:- str. CVM23701" 440534 +"Salmonella enterica subsp. enterica serovar 4,[5],12:i:-" 440524 +Salmonella enterica subsp. enterica serovar Dublin str. CT_02021853 439851 +Salmonella enterica subsp. enterica serovar Saintpaul str. SARA29 439847 +Salmonella enterica subsp. enterica serovar Saintpaul str. SARA23 439846 +Salmonella enterica subsp. enterica serovar Schwarzengrund str. CVM19633 439843 +Salmonella enterica subsp. enterica serovar Kentucky str. CVM29188 439842 +Salmonella enterica subsp. enterica serovar Poona 436295 +Salmonella enterica subsp. enterica serovar Newport str. SL254 423368 +Salmonella enterica subsp. enterica serovar Washington 406014 +Salmonella enterica subsp. enterica serovar Zanzibar 399588 +Salmonella enterica subsp. enterica serovar Rissen 399587 +Salmonella enterica subsp. enterica serovar Orion 399586 +Salmonella enterica subsp. enterica serovar Coeln 399584 +Salmonella enterica subsp. enterica serovar Blegdam 399583 +Salmonella enterica subsp. enterica serovar Binza 399582 +Salmonella enterica subsp. enterica serovar Agama 399581 +Salmonella enterica subsp. enterica serovar Keurmassar 375284 +Salmonella enterica subsp. enterica serovar Newlands 367181 +Salmonella enterica subsp. enterica serovar Javiana 363569 +Salmonella enterica subsp. enterica serovar Sendai 363568 +Salmonella enterica subsp. enterica serovar Kedougou 358771 +Salmonella enterica subsp. enterica serovar Westhampton 356621 +Salmonella enterica subsp. enterica serovar Tallahassee 356544 +"Salmonella enterica subsp. enterica serovar 4,12:i:-" 353569 +Salmonella enterica subsp. enterica serovar Schwarzengrund 340190 +Salmonella enterica subsp. enterica serovar Manhattan 340189 +Salmonella enterica subsp. enterica serovar Cerro 340188 +Salmonella enterica subsp. enterica serovar Fischerkietz 328659 +Salmonella enterica subsp. enterica serovar Wagenia 322833 +Salmonella enterica subsp. enterica serovar Duesseldorf 322832 +Salmonella enterica subsp. enterica serovar Choleraesuis str. SC-B67 321314 +Salmonella enterica subsp. salamae serovar Greenside 297361 +Salmonella enterica subsp. enterica serovar Paratyphi A str. ATCC 9150 295319 +Salmonella enterica subsp. enterica serovar Emek 286784 +Salmonella enterica subsp. enterica serovar Indiana 286783 +Salmonella enterica subsp. enterica serovar Stanleyville 286782 +Salmonella enterica subsp. enterica serovar Kinshasa 286781 +Salmonella enterica subsp. enterica serovar Miami 286780 +"Salmonella enterica subsp. houtenae serovar 45a,b:g,z51:-" 286760 +Salmonella enterica subsp. enterica serovar Enteritidis str. LK5 272989 +Salmonella enterica subsp. enterica serovar Grumpensis 260681 +Salmonella enterica subsp. enterica serovar Livingstone 260680 +Salmonella enterica subsp. enterica serovar Madjorio 260679 +Salmonella enterica subsp. enterica serovar Goldcoast 260678 +Salmonella enterica subsp. enterica serovar Urbana 260677 +Salmonella enterica subsp. enterica serovar Lexington 260676 +Salmonella enterica subsp. enterica serovar Poeseldorf 260369 +Salmonella enterica subsp. enterica serovar Bergen 260368 +Salmonella enterica subsp. enterica serovar Aberdeen 260367 +Salmonella enterica subsp. enterica serovar Garoli 260366 +Salmonella enterica subsp. enterica serovar Java 224729 +Salmonella enterica subsp. enterica serovar Kottbus 224727 +Salmonella enterica subsp. enterica serovar Typhi str. CT18 220341 +Salmonella enterica subsp. enterica serovar Liverpool 216804 +Salmonella enterica subsp. enterica serovar Typhimurium str. SL1344 216597 +Salmonella enterica subsp. enterica serovar Rachaburi 212106 +Salmonella enterica subsp. enterica serovar Albany 211968 +Salmonella enterica subsp. enterica serovar Typhi str. Ty2 209261 +Salmonella enterica subsp. enterica serovar Haifa 192956 +Salmonella enterica subsp. enterica serovar Kentucky 192955 +Salmonella enterica subsp. enterica serovar Mbandaka 192954 +Salmonella enterica subsp. enterica serovar Stanley 192953 +Salmonella enterica subsp. enterica serovar Cubana 189201 +"Salmonella enterica subsp. salamae serovar 4,12:z:1,7" 181898 +"Salmonella enterica subsp. salamae serovar 4,12,27:i:z35" 181897 +Salmonella enterica subsp. enterica serovar Travis 181830 +Salmonella enterica subsp. enterica serovar Tennyson 181829 +Salmonella enterica subsp. enterica serovar Tejas 181828 +Salmonella enterica subsp. enterica serovar Sloterdijk 181798 +Salmonella enterica subsp. enterica serovar Vellore 181797 +Salmonella enterica subsp. enterica serovar Texas 181737 +Salmonella enterica subsp. enterica serovar Schleissheim 181736 +Salmonella enterica subsp. enterica serovar Azteca 181735 +Salmonella enterica subsp. enterica serovar Havana 179997 +Salmonella typhimurium TR7095 178328 +Salmonella enterica subsp. enterica serovar Duisburg 174641 +Salmonella enterica subsp. enterica serovar Reading 165302 +Salmonella enterica subsp. enterica serovar Bury 152690 +Salmonella enterica subsp. enterica serovar Enteritidis 149539 +Salmonella enterica subsp. enterica serovar Braenderup 149391 +Salmonella enterica subsp. enterica serovar London 149390 +Salmonella enterica subsp. enterica serovar Toulon 149389 +Salmonella enterica subsp. enterica serovar Mikawasima 149388 +Salmonella enterica subsp. enterica serovar Brandenburg 149387 +Salmonella enterica subsp. enterica serovar Chester 149386 +Salmonella enterica subsp. enterica serovar Hadar 149385 +Salmonella enterica subsp. enterica serovar Wien 149384 +Salmonella enterica subsp. enterica serovar Tennessee 143221 +Salmonella enterica subsp. enterica serovar Virginia 140099 +Salmonella enterica subsp. enterica serovar Bredeney 134047 +Salmonella enterica subsp. enterica serovar Choleraesuis 119912 +Salmonella enterica subsp. enterica serovar Ohio 117541 +Salmonella enterica subsp. enterica serovar Montevideo 115981 +Salmonella enterica subsp. enterica serovar Newport 108619 +Salmonella enterica subsp. enterica serovar Typhimurium str. LT2 99287 +Salmonella enterica subsp. enterica serovar Dublin 98360 +Salmonella enterica subsp. enterica serovar Typhimurium 90371 +Salmonella enterica subsp. enterica serovar Typhi 90370 +Salmonella enterica subsp. enterica serovar Saintpaul 90105 +Salmonella enterica subsp. enterica serovar Typhimurium str. DT104 85569 +Salmonella enterica subsp. enterica serovar Muenster 82689 +Salmonella thompson C1 75555 +Salmonella enterica subsp. enterica serovar Naestved 71517 +Salmonella enterica subsp. enterica serovar Minnesota 70803 +"Salmonella enterica subsp. houtenae serovar 43:z4,z23:-" 59244 +Salmonella enterica subsp. VII 59208 +Salmonella enterica subsp. indica 59207 +Salmonella enterica subsp. houtenae 59205 +Salmonella enterica subsp. diarizonae 59204 +Salmonella enterica subsp. arizonae 59203 +Salmonella enterica subsp. salamae 59202 +Salmonella enterica subsp. enterica 59201 +Salmonella enterica subsp. enterica serovar Anatum 58712 +Salmonella enterica subsp. enterica serovar Waycross 58101 +Salmonella enterica subsp. houtenae serovar Houten 58100 +Salmonella enterica subsp. enterica serovar Chingola 58099 +Salmonella enterica subsp. enterica serovar Bovismorbificans 58097 +Salmonella enterica subsp. enterica serovar Bareilly 58096 +Salmonella enterica subsp. enterica serovar Agona 58095 +Salmonella enterica subsp. enterica serovar Weltevreden 57743 +Salmonella enterica subsp. enterica serovar Matopeni 57742 +Salmonella enterica subsp. enterica serovar Blockley 57741 +Salmonella enterica subsp. enterica serovar Paratyphi C 57046 +Salmonella enterica subsp. enterica serovar Paratyphi B 57045 +Salmonella enterica subsp. enterica serovar Borreze 55400 +Salmonella enterica subsp. enterica serovar Paratyphi A 54388 +Salmonella enterica subsp. enterica serovar Abortusovis 53961 +Salmonella enterica subsp. enterica serovar Virchow 48409 +Salmonella enterica subsp. enterica serovar Austin 47066 +Salmonella enterica subsp. salamae serovar Sofia 46629 +Salmonella enterica subsp. enterica serovar Shomron 46627 +Salmonella enterica subsp. enterica serovar Give 46626 +Salmonella enterica subsp. enterica serovar Setubal 44469 +Salmonella enterica subsp. enterica serovar Maregrosso 44468 +Salmonella enterica subsp. enterica serovar Typhisuis 41529 +"Salmonella enterica subsp. houtenae serovar 16:z4,z32:--" 41524 +"Salmonella enterica subsp. VII serovar 40:z4,z24:--" 41521 +"Salmonella enterica subsp. VII serovar 1,40:g,z51:--" 41520 +"Salmonella enterica subsp. salamae serovar 42:f,g,t:--" 41518 +Salmonella enterica subsp. salamae serovar 58:d:z6 41517 +Salmonella enterica subsp. arizonae serovar 62:z36:- 41515 +"Salmonella enterica subsp. arizonae serovar 62:z4,z23:-" 41514 +Salmonella enterica subsp. enterica serovar Pensacola 34042 +Salmonella enterica subsp. enterica serovar Othmarschen 34041 +Salmonella enterica subsp. enterica serovar Newmexico 34040 +Salmonella enterica subsp. enterica serovar Banana 34039 +Salmonella enterica subsp. enterica serovar Abony 29482 +Salmonella enterica subsp. enterica serovar Simsbury 29481 +Salmonella enterica subsp. enterica serovar Monschaui 29480 +Salmonella enterica subsp. enterica serovar Marrtens 29479 +Salmonella enterica subsp. enterica serovar Enteritidis var. jena 29478 +Salmonella enterica subsp. enterica serovar Essen 29477 +Salmonella enterica subsp. enterica serovar Enteritidis var. danysz 29476 +Salmonella enterica subsp. enterica serovar Enteritidis var. chaco 29475 +Salmonella enterica subsp. enterica serovar California 29474 +Salmonella enterica subsp. enterica serovar Adelaide 29473 +Salmonella enterica subsp. enterica serovar Panama 29472 +Salmonella enterica 28901 +Salmonella enterica subsp. enterica serovar Senftenberg 28150 +Salmonella enterica subsp. enterica serovar Rostock 28149 +Salmonella enterica subsp. enterica serovar Oranienburg 28147 +Salmonella enterica subsp. enterica serovar Moscow 28146 +Salmonella enterica subsp. enterica serovar Derby 28144 +Salmonella enterica subsp. enterica serovar Budapest 28143 +Salmonella enterica subsp. enterica serovar Berta 28142 +Salmonella enterica subsp. enterica serovar Ordonez 612 +Salmonella enterica subsp. enterica serovar Heidelberg 611 +Salmonella enterica subsp. enterica serovar Abortus 610 +Salmonella enterica subsp. enterica serovar Abortusequi 607 +Salmonella enterica subsp. enterica serovar Pullorum 605 +Salmonella enterica subsp. enterica serovar Gallinarum/pullorum 604 +Salmonella enterica subsp. enterica serovar Thompson 600 +Salmonella enterica subsp. enterica serovar Rubislaw 598 +Salmonella enterica subsp. enterica serovar Potsdam 597 +Salmonella enterica subsp. enterica serovar Muenchen 596 +Salmonella enterica subsp. enterica serovar Infantis 595 +Salmonella enterica subsp. enterica serovar Gallinarum 594 diff --git a/taxons.tsv b/taxons.tsv new file mode 100644 index 0000000..995de73 --- /dev/null +++ b/taxons.tsv @@ -0,0 +1,3 @@ +Listeria monocytogenes 1639 +Salmonella enterica 28901 +Escherichia coli 562 \ No newline at end of file