Skip to content

Commit c75e223

Browse files
committed
Validate duplicate data set names
1 parent 1db986b commit c75e223

File tree

2 files changed

+38
-14
lines changed

2 files changed

+38
-14
lines changed

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/creation/ErrorMessageDialog.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import java.awt.Dimension;
66
import java.awt.FlowLayout;
77
import java.awt.GridBagLayout;
8+
import java.util.Arrays;
89
import java.util.List;
910

1011
import javax.swing.BorderFactory;
@@ -83,6 +84,14 @@ public boolean shouldContinue() {
8384
return shouldContinue;
8485
}
8586

87+
public boolean isEmpty() {
88+
return y == 0;
89+
}
90+
91+
public void addSection(MessageType messageType, String title, String icon, String message) {
92+
addSection(messageType, title, icon, Arrays.asList(message));
93+
}
94+
8695
public void addSection(MessageType messageType, String title, String icon, List<String> messages) {
8796
final boolean isError = messageType == MessageType.ERROR;
8897
if(isError) {

EnrichmentMapPlugin/src/main/java/org/baderlab/csplugins/enrichmentmap/view/creation/MasterDetailDialogPage.java

Lines changed: 29 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import java.awt.Component;
99
import java.awt.FlowLayout;
1010
import java.io.File;
11-
import java.util.Arrays;
11+
import java.util.ArrayList;
1212
import java.util.Iterator;
1313
import java.util.List;
14+
import java.util.Map;
1415
import java.util.Optional;
16+
import java.util.function.Function;
1517
import java.util.stream.Collectors;
1618
import java.util.stream.Stream;
1719

@@ -356,17 +358,15 @@ public void allFinished(FinishStatus finishStatus) {
356358
}
357359

358360
private boolean validateInput() {
359-
ErrorMessageDialog dialog = null;
361+
ErrorMessageDialog dialog = errorMessageDialogFactory.create(callback.getDialogFrame());
360362

361363
// Check if the user provided a global expression file, warn if there are also per-dataset expression files.
362364
if(!isNullOrEmpty(commonPanel.getExpressionFile())) {
363365
for(DataSetListItem item : dataSetListModel.toList()) {
364366
DetailPanel panel = item.getDetailPanel();
365367
if(panel instanceof EditDataSetPanel && !isNullOrEmpty(((EditDataSetPanel)panel).getExpressionFileName())) {
366-
if(dialog == null)
367-
dialog = errorMessageDialogFactory.create(callback.getDialogFrame());
368-
List<String> messages = Arrays.asList("A common expression file has been provided. Per-dataset expression files will be ignored.");
369-
dialog.addSection(MessageType.WARN, commonPanel.getDisplayName(), commonPanel.getIcon(), messages);
368+
String message = "A common expression file has been provided. Per-dataset expression files will be ignored.";
369+
dialog.addSection(MessageType.WARN, commonPanel.getDisplayName(), commonPanel.getIcon(), message);
370370
break;
371371
}
372372
}
@@ -377,32 +377,47 @@ private boolean validateInput() {
377377
for(DataSetListItem item : dataSetListModel.toList()) {
378378
DetailPanel panel = item.getDetailPanel();
379379
if(panel instanceof EditDataSetPanel && !isNullOrEmpty(((EditDataSetPanel)panel).getGMTFileName())) {
380-
if(dialog == null)
381-
dialog = errorMessageDialogFactory.create(callback.getDialogFrame());
382-
List<String> messages = Arrays.asList("A common GMT file has been provided. Per-dataset GMT files will be ignored.");
383-
dialog.addSection(MessageType.WARN, commonPanel.getDisplayName(), commonPanel.getIcon(), messages);
380+
String message = "A common GMT file has been provided. Per-dataset GMT files will be ignored.";
381+
dialog.addSection(MessageType.WARN, commonPanel.getDisplayName(), commonPanel.getIcon(), message);
384382
break;
385383
}
386384
}
387385
}
388386

387+
{ // Check for duplicate data set names
388+
Map<String,Long> dataSetNameCount = dataSetListModel.stream()
389+
.map(DataSetListItem::getDetailPanel)
390+
.filter(panel -> panel instanceof EditDataSetPanel)
391+
.map(panel -> (EditDataSetPanel)panel)
392+
.map(EditDataSetPanel::getDataSetName)
393+
.collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
394+
395+
List<String> messages = new ArrayList<>();
396+
dataSetNameCount.forEach((name,count) -> {
397+
if(count > 1) {
398+
messages.add("Duplicate data set name: '" + name + "'");
399+
}
400+
});
401+
402+
if(!messages.isEmpty()) {
403+
dialog.addSection(MessageType.ERROR, "Duplicate Data Set Names", commonPanel.getIcon(), messages);
404+
}
405+
}
406+
389407
// Check for input errors.
390408
for(DataSetListItem item : dataSetListModel.toList()) {
391409
DetailPanel panel = item.getDetailPanel();
392410
List<String> messages = panel.validateInput();
393411
if(!messages.isEmpty()) {
394-
if(dialog == null)
395-
dialog = errorMessageDialogFactory.create(callback.getDialogFrame());
396412
dialog.addSection(MessageType.ERROR, panel.getDisplayName(), panel.getIcon(), messages);
397413
}
398414
}
399415

400-
if(dialog != null) {
416+
if(!dialog.isEmpty()) {
401417
dialog.pack();
402418
dialog.setLocationRelativeTo(callback.getDialogFrame());
403419
dialog.setModal(true);
404420
dialog.setVisible(true);
405-
406421
// This will always return false if the dialog has error messages.
407422
// If the dialog only has warning messages then the user can choose to continue.
408423
return dialog.shouldContinue();

0 commit comments

Comments
 (0)