Skip to content

Commit

Permalink
Merge pull request fli-iam#2517 from LaurentPV/laurent_issue#2266_shu…
Browse files Browse the repository at this point in the history
…p_reimport

Laurent issue#2266 shup reimport if status ERROR
  • Loading branch information
michaelkain authored Dec 10, 2024
2 parents e3c1b26 + edfd060 commit e548108
Show file tree
Hide file tree
Showing 7 changed files with 92 additions and 82 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,12 @@ public void actionPerformed(final ActionEvent event) {
JOptionPane.showMessageDialog(mainWindow.frame, QualityUtils.getQualityControlreportScrollPane(qualityControlResult),
ShUpConfig.resourceBundle.getString("shanoir.uploader.import.quality.check.window.title"), JOptionPane.WARNING_MESSAGE);
}
//Set qualityTag to the importJob in order to update subjectStudy qualityTag on server side
importJob.setQualityTag(qualityControlResult.getUpdatedSubjectStudies().get(0).getQualityTag());
// If Failed Valid No updated subject studies exist in the qualityControlResult
// For Now if Failed Valid then the quality tag of the subject on server side is not updated with an empty value
if (!qualityControlResult.hasFailedValid()) {
//Set qualityTag to the importJob in order to update subjectStudy qualityTag on server side
importJob.setQualityTag(qualityControlResult.getUpdatedSubjectStudies().get(0).getQualityTag());
}
}

Runnable runnable = new ImportFinishRunnable(uploadJob, uploadFolder, importJob, subjectREST.getName());
Expand All @@ -212,7 +216,7 @@ public void actionPerformed(final ActionEvent event) {
} catch (Exception ex) {
logger.error(ex.getMessage(), ex);
JOptionPane.showMessageDialog(mainWindow.frame, ShUpConfig.resourceBundle.getString("shanoir.uploader.import.quality.check.exception.message") + ex.getMessage(),
ShUpConfig.resourceBundle.getString("shanoir.uploader.import.quality.check.window.title"), JOptionPane.ERROR_MESSAGE);
ShUpConfig.resourceBundle.getString("shanoir.uploader.select.error.title"), JOptionPane.ERROR_MESSAGE);
// set status FAILED
ShUpOnloadConfig.getCurrentNominativeDataController().updateNominativeDataPercentage(uploadFolder, UploadState.ERROR.toString());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ public void load(StartupStateContext context) {
shUpStartupDialog.setVisible(false);
shUpStartupDialog.dispose();
MainWindow frame = initJFrame();
CurrentUploadsWindowTable cuw = new CurrentUploadsWindowTable(frame);
CurrentUploadsWindowTable cuw = CurrentUploadsWindowTable.getInstance(frame);
currentNominativeDataController.configure(ShUpOnloadConfig.getWorkFolder(), cuw);
ShUpOnloadConfig.setCurrentNominativeDataController(currentNominativeDataController);
initNominativeDataFilesBeforeLaunchingJobs();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,12 @@
import org.shanoir.uploader.nominativeData.NominativeDataUploadJob;
import org.shanoir.uploader.upload.UploadState;

@SuppressWarnings("deprecation")
public class CurrentUploadsWindowTable implements Observer {

public MainWindow frame;
public static JTable table;
private static CurrentUploadsWindowTable instance;
public final MainWindow frame;
public final JTable table;
Object[] columnNames;
Object[] paths;
public int importColumn = 7;
Expand All @@ -36,7 +38,7 @@ public class CurrentUploadsWindowTable implements Observer {
public int selectedRow;
public int rowsNb;

public CurrentUploadsWindowTable(final MainWindow frame) {
private CurrentUploadsWindowTable(MainWindow frame) {
this.frame = frame;
final Object[] columnNames = {
"id",
Expand All @@ -50,8 +52,29 @@ public CurrentUploadsWindowTable(final MainWindow frame) {
frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.delete")
};
this.columnNames = columnNames;
table = new JTable(new DefaultTableModel(columnNames, 0));
table.setPreferredScrollableViewportSize(new Dimension(800, 100));
// Create the non editable table to display the current uploads
this.table = new JTable(new DefaultTableModel(columnNames, 0) {

@Override
public boolean isCellEditable(int row, int column) {
return false;
}
});

initTable();
frame.scrollPaneUpload.getViewport().add(table);
}

// Method to create the singleton instance of the class
public static synchronized CurrentUploadsWindowTable getInstance(MainWindow frame) {
if (instance == null) {
instance = new CurrentUploadsWindowTable(frame);
}
return instance;
}

private void initTable() {
table.setPreferredScrollableViewportSize(new Dimension(800, 100));
table.setFillsViewportHeight(true);

table.getColumnModel().getColumn(0).setPreferredWidth(0);
Expand Down Expand Up @@ -80,8 +103,7 @@ public CurrentUploadsWindowTable(final MainWindow frame) {
// Change Background color of action column
table.getColumnModel().getColumn(importColumn).setCellRenderer(new Background_Renderer());
table.getColumnModel().getColumn(deleteColumn).setCellRenderer(new Background_Renderer());
frame.scrollPaneUpload.getViewport().add(table);
}
}

public void fillTable(Map<String, NominativeDataUploadJob> initialUploads) {
DefaultTableModel model = (DefaultTableModel) table.getModel();
Expand All @@ -101,28 +123,31 @@ private void addLastRow(DefaultTableModel model) {
}

private void addRow(DefaultTableModel model, String key, NominativeDataUploadJob nominativeDataUploadJob) {
String actionImport = (String) frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.import");
String actionDelete = (String) frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.delete");

switch (nominativeDataUploadJob.getUploadState()) {
case UploadState.READY -> model.addRow(new Object[] { key, nominativeDataUploadJob.getPatientPseudonymusHash(),
case UploadState.READY, UploadState.ERROR -> model.addRow(new Object[] { key, nominativeDataUploadJob.getPatientPseudonymusHash(),
nominativeDataUploadJob.getPatientName(), nominativeDataUploadJob.getIPP(),
nominativeDataUploadJob.getStudyDate(), nominativeDataUploadJob.getMriSerialNumber(),
nominativeDataUploadJob.getUploadState().toString(),
(String) frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.import"),
(String) frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.delete")
actionImport,
actionDelete
});
case UploadState.FINISHED_UPLOAD -> model.addRow(new Object[] { key, nominativeDataUploadJob.getPatientPseudonymusHash(),
nominativeDataUploadJob.getPatientName(), nominativeDataUploadJob.getIPP(),
nominativeDataUploadJob.getStudyDate(), nominativeDataUploadJob.getMriSerialNumber(),
nominativeDataUploadJob.getUploadPercentage(), "",
(String) frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.delete") });
case UploadState.ERROR -> model.addRow(new Object[] { key, nominativeDataUploadJob.getPatientPseudonymusHash(),
nominativeDataUploadJob.getPatientName(), nominativeDataUploadJob.getIPP(),
nominativeDataUploadJob.getStudyDate(), nominativeDataUploadJob.getMriSerialNumber(),
nominativeDataUploadJob.getUploadState().toString(), "",
(String) frame.resourceBundle.getString("shanoir.uploader.currentUploads.Action.delete") });
nominativeDataUploadJob.getUploadPercentage(),
"",
actionDelete
});
default -> model.addRow(new Object[] { key, nominativeDataUploadJob.getPatientPseudonymusHash(),
nominativeDataUploadJob.getPatientName(), nominativeDataUploadJob.getIPP(),
nominativeDataUploadJob.getStudyDate(), nominativeDataUploadJob.getMriSerialNumber(),
nominativeDataUploadJob.getUploadPercentage(), "", "" });
nominativeDataUploadJob.getUploadPercentage(),
"",
""
});
}
}

Expand All @@ -148,17 +173,17 @@ public void updatePercent(String path, String percentage) {
* Create the GUI and show it. For thread safety, this method should be invoked
* from the event-dispatching thread.
*/
private void showGUI(MainWindow frame, final Object[][] currentUploadsTable) {
private void showGUI(MainWindow frame) {
frame.scrollPaneUpload.getViewport().add(table);
}

public void showWindow(final MainWindow frame, final Object[][] currentUploadsTable, final Object[] paths) {
public void showWindow(final MainWindow frame, final Object[] paths) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
this.paths = paths;
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
showGUI(frame, currentUploadsTable);
showGUI(frame);
}
});
}
Expand Down Expand Up @@ -195,14 +220,14 @@ public void udpateMainWindowUploadStatistics(CurrentNominativeDataModel currentN
|| "READY".compareTo(entry.getValue().getUploadPercentage()) == 0) {
// Do Nothing
} else {
if (entry.getValue().getUploadPercentage().equals("FINISHED")) {
if (entry.getValue().getUploadPercentage().equals(finishedUploadState)) {
totalUploadPercent += 100;
nbFinishUpload++;
} else if (entry.getValue().getUploadPercentage().equals("ERROR")) {
} else if (entry.getValue().getUploadPercentage().equals(errorUploadState)) {
nbErrorUpload++;
} else {
nbStartUpload++;
int percent = Integer.valueOf(entry.getValue().getUploadPercentage().substring(0,
int percent = Integer.parseInt(entry.getValue().getUploadPercentage().substring(0,
entry.getValue().getUploadPercentage().length() - 2));
totalUploadPercent += percent;
}
Expand All @@ -229,6 +254,7 @@ public void udpateMainWindowUploadStatistics(CurrentNominativeDataModel currentN
}
}

@Override
public void update(Observable o, Object arg) {
CurrentNominativeDataModel currentNominativeDataModel = (CurrentNominativeDataModel) o;
String[] msg = (String[]) arg;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,20 +44,22 @@ public class CurrentNominativeDataController {

private CurrentUploadsWindowTable cuw;

@SuppressWarnings("deprecation")
public void configure(final File workFolderFilePath, final CurrentUploadsWindowTable cuw) {
this.cuw = cuw;
this.currentNominativeDataModel = new CurrentNominativeDataModel();
currentNominativeDataModel.addObserver(cuw);
this.cuw = cuw;
processWorkFolder(workFolderFilePath);

cuw.table.addMouseListener(new MouseAdapter() {
public DefaultTableModel model = (DefaultTableModel) cuw.table.getModel();

@Override
public void mouseClicked(MouseEvent e) {
int row = cuw.table.getSelectedRow();
int col = cuw.table.getSelectedColumn();
int rows = cuw.table.getRowCount();
// Last row and last column: delete all
// Last row and last column: delete all imports whatever their status
if (col == cuw.deleteColumn && row == rows - 1) {
String message = cuw.frame.resourceBundle
.getString("shanoir.uploader.currentUploads.Action.deleteAll.confirmation.message");
Expand Down Expand Up @@ -99,10 +101,10 @@ public void mouseClicked(MouseEvent e) {
|| uploadState.equals(cuw.readyUploadState)) {
showDeleteConfirmationDialog(workFolderFilePath, cuw, row);
}
// start the import
// start the import or try reimporting an exam with status "ERROR"
} else if (col == cuw.importColumn && row != -1) {
String uploadState = (String) cuw.table.getModel().getValueAt(row, cuw.uploadStateColumn);
if (uploadState.equals(cuw.readyUploadState)) {
if (uploadState.equals(cuw.readyUploadState) || uploadState.equals(cuw.errorUploadState)) {
String uploadJobFilePath = (String) cuw.table.getModel().getValueAt(row, 0) + File.separator + UploadJobManager.UPLOAD_JOB_XML;
File uploadJobFile = new File(uploadJobFilePath);
uploadJobManager = new UploadJobManager(uploadJobFile);
Expand Down Expand Up @@ -158,9 +160,7 @@ public void mouseEntered(MouseEvent e) {
int x = e.getX() - bounds.x;
int y = e.getY() - bounds.y;
cuw.rowsNb = cuw.table.getRowCount();
if (cuw.selectedRow == cuw.rowsNb - 1 && col == cuw.importColumn) {
cuw.table.getColumnModel().getColumn(col).setCellRenderer(new DeleteAllRenderer());
} else if (col == cuw.importColumn) {
if (col == cuw.deleteColumn) {
try {
cuw.table.getColumnModel().getColumn(col).setCellRenderer(new Delete_Renderer());
} catch (Exception exp) {
Expand Down Expand Up @@ -270,9 +270,9 @@ public void addNewNominativeData(File folder, NominativeDataUploadJob nominative
currentNominativeDataModel.addUpload(folder.getAbsolutePath(), nominativeDataUploadJob);
}

public class DeleteAllRenderer extends DefaultTableCellRenderer {
DeleteAllRenderer() {
}
public class Delete_Renderer extends DefaultTableCellRenderer {
Delete_Renderer() {
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
Expand All @@ -282,61 +282,40 @@ public Component getTableCellRendererComponent(JTable table, Object value, boole
tableCellRendererComponent.setBackground(Color.LIGHT_GRAY);
setHorizontalAlignment(SwingConstants.CENTER);
tableCellRendererComponent.setFont(tableCellRendererComponent.getFont().deriveFont(Font.BOLD));
if (row == cuw.rowsNb - 1) {
if (value instanceof String) {
String string = (String) value;
setText(getHTML(string));

if (value instanceof String) {
String string = (String) value;
if (row != cuw.rowsNb - 1) {
setText(getDeleteHTML(string));
setToolTipText(cuw.frame.resourceBundle
.getString("shanoir.uploader.currentUploads.Action.delete.tooltip"));
} else {
setText(getDeleteAllHTML(string));
setToolTipText(cuw.frame.resourceBundle
.getString("shanoir.uploader.currentUploads.Action.deleteAll.tooltip"));
}
}
return tableCellRendererComponent;
}

private String getHTML(String string) {
private String getDeleteHTML(String string) {
StringBuilder sb = new StringBuilder();
sb.append("<html>");
sb.append("<span style=\"color: red;\"><b>");
sb.append("<span style=\"color: blue;\"><b>");
sb.append(string);
sb.append("</b></span>");
sb.append("</html>");
return sb.toString();
}

}

public class Delete_Renderer extends DefaultTableCellRenderer {
Delete_Renderer() {
}

@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
int row, int column) {
Component tableCellRendererComponent = super.getTableCellRendererComponent(table, value, isSelected,
hasFocus, row, column);
tableCellRendererComponent.setBackground(Color.LIGHT_GRAY);
setHorizontalAlignment(SwingConstants.CENTER);
tableCellRendererComponent.setFont(tableCellRendererComponent.getFont().deriveFont(Font.BOLD));
if (row == cuw.selectedRow) {
if (value instanceof String) {
String string = (String) value;
setText(getHTML(string));
setToolTipText(cuw.frame.resourceBundle
.getString("shanoir.uploader.currentUploads.Action.delete.tooltip"));
}
}
return tableCellRendererComponent;
}

private String getHTML(String string) {
private String getDeleteAllHTML(String string) {
StringBuilder sb = new StringBuilder();
sb.append("<html>");
sb.append("<span style=\"color: blue;\"><b>");
sb.append("<span style=\"color: purple;\"><b>");
sb.append(string);
sb.append("</b></span>");
sb.append("</html>");
return sb.toString();
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
*
*/

@SuppressWarnings("deprecation")
public class CurrentNominativeDataModel extends Observable {

private static final Logger logger = LoggerFactory.getLogger(CurrentNominativeDataModel.class);
Expand Down
6 changes: 3 additions & 3 deletions shanoir-uploader/src/main/resources/messages_en.properties
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ shanoir.uploader.exportimport=Start auto-import...
shanoir.uploader.exportonly=Export only
shanoir.uploader.existingSubjectsLabel=OR select an existing subject:
shanoir.uploader.failedUploadsMessagePart1=<html><pre>Some error occured during upload.\n
shanoir.uploader.failedUploadsMessagePart2=Please delete the upload that failed\n and try to upload it again</pre></html>
shanoir.uploader.failedUploadsMessagePart2=You can try to upload it again \nby clicking on "Import".</pre></html>
shanoir.uploader.failedUploadsSummary=Failed uploads:
shanoir.uploader.fileMenu.openCD=Open DICOM files...
shanoir.uploader.fileMenu=File
Expand Down Expand Up @@ -188,7 +188,7 @@ shanoir.uploader.import.dicom.manufacturer=Manufacturer:
shanoir.uploader.import.dicom.manufacturer.model.name=Manufacturer's model:
shanoir.uploader.import.dicom.station.name=Station name:
shanoir.uploader.import.quality.check.window.title=Quality Control
shanoir.uploader.import.quality.check.exception.message=The quality control could not be done for the following reasons:\n\n
shanoir.uploader.import.quality.check.exception.message=The quality control encountered the following error:\n\n
shanoir.uploader.import.quality.check.failed.message=The quality control could not be validated for the following reasons:\n\n
shanoir.uploader.import.quality.check.warning.message=The quality control reported the following warnings:\n\n
shanoir.uploader.import.start.auto.import.message=The automatic import has been started and is now running in the background.
Expand Down Expand Up @@ -221,7 +221,7 @@ shanoir.uploader.studyIDLabel=<html><em>and / or</em> Study ID:<html>
shanoir.uploader.outputDirectoryLabel=Output directory:
shanoir.uploader.patientNameLabel=Patient name:
shanoir.uploader.patientNameLabel.tooltip=Last name and first names should be separated by a comma. Only the first letters of the last name are sufficient.
shanoir.uploader.preImportDialog.title=ImportDialog
shanoir.uploader.preImportDialog.title=Import Form
shanoir.uploader.profile.select.label=Select Profile:
shanoir.uploader.profile.select.button=Select
shanoir.uploader.profile.remember.label=Remember profile
Expand Down
Loading

0 comments on commit e548108

Please sign in to comment.