Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe

Commits:

9 changed files:

Changes:

  • client/src/main/java/fr/ird/observe/client/FloatingObjectReferencesManager.java
    ... ... @@ -25,8 +25,10 @@ package fr.ird.observe.client;
    25 25
     import com.google.common.collect.ImmutableSet;
    
    26 26
     import fr.ird.observe.client.configuration.ClientConfig;
    
    27 27
     import fr.ird.observe.client.db.ObserveSwingDataSource;
    
    28
    +import fr.ird.observe.client.ui.util.ProgressModel;
    
    28 29
     import fr.ird.observe.services.dto.FloatingObjectReference;
    
    29 30
     import java.util.Arrays;
    
    31
    +import java.util.Iterator;
    
    30 32
     import java.util.Optional;
    
    31 33
     import java.util.Set;
    
    32 34
     import java.util.TreeSet;
    
    ... ... @@ -76,13 +78,20 @@ public class FloatingObjectReferencesManager {
    76 78
             return ImmutableSet.copyOf(references.stream().map(FloatingObjectReference::getFloatingObjectId).collect(Collectors.toSet()));
    
    77 79
         }
    
    78 80
     
    
    79
    -    public void sanitize(ObserveSwingDataSource dataSource) {
    
    81
    +    public void sanitize(ProgressModel progressModel, ObserveSwingDataSource dataSource) {
    
    80 82
     
    
    81 83
             ImmutableSet<String> existingIds = getIds();
    
    82 84
             ImmutableSet<String> ids = dataSource.getFloatingObjectService().retainExistingIds(existingIds);
    
    83 85
             int beforeSize = references.size();
    
    84 86
     
    
    85
    -        references.removeIf(reference -> !ids.contains(reference.getFloatingObjectId()));
    
    87
    +        Iterator<FloatingObjectReference> iterator = references.iterator();
    
    88
    +        while (iterator.hasNext()) {
    
    89
    +            FloatingObjectReference reference = iterator.next();
    
    90
    +            if (!ids.contains(reference.getFloatingObjectId())) {
    
    91
    +                iterator.remove();
    
    92
    +            }
    
    93
    +            progressModel.incrementsCurrentStep();
    
    94
    +        }
    
    86 95
     
    
    87 96
             save(beforeSize);
    
    88 97
     
    

  • client/src/main/java/fr/ird/observe/client/ObserveOpenDataManager.java
    ... ... @@ -25,6 +25,7 @@ package fr.ird.observe.client;
    25 25
     import com.google.common.base.Preconditions;
    
    26 26
     import fr.ird.observe.client.db.ClientDataContext;
    
    27 27
     import fr.ird.observe.client.db.ObserveSwingDataSource;
    
    28
    +import fr.ird.observe.client.ui.util.ProgressModel;
    
    28 29
     import fr.ird.observe.services.ObserveServicesProvider;
    
    29 30
     import fr.ird.observe.services.dto.IdHelper;
    
    30 31
     import fr.ird.observe.services.dto.referential.ProgramDto;
    
    ... ... @@ -46,7 +47,6 @@ public class ObserveOpenDataManager implements Closeable {
    46 47
             this.dataContext = dataContext;
    
    47 48
         }
    
    48 49
     
    
    49
    -    // Program
    
    50 50
         public boolean canOpenProgram() {
    
    51 51
             return !dataContext.isOpenProgram();
    
    52 52
         }
    
    ... ... @@ -290,7 +290,7 @@ public class ObserveOpenDataManager implements Closeable {
    290 290
             dataContext.resetOpen();
    
    291 291
         }
    
    292 292
     
    
    293
    -    public void sanitizeOpenIds(String[] ids) {
    
    293
    +    public void sanitizeOpenIds(ProgressModel progressModel, String[] ids) {
    
    294 294
             if (ids != null) {
    
    295 295
     
    
    296 296
                 boolean exists = true;
    
    ... ... @@ -342,6 +342,7 @@ public class ObserveOpenDataManager implements Closeable {
    342 342
                     if (!exists) {
    
    343 343
                         ids[i] = null;
    
    344 344
                     }
    
    345
    +                progressModel.incrementsCurrentStep();
    
    345 346
                 }
    
    346 347
             }
    
    347 348
         }
    

  • client/src/main/java/fr/ird/observe/client/db/ObserveDataSourcesManager.java
    ... ... @@ -36,6 +36,7 @@ import fr.ird.observe.client.ui.ObserveMainUI;
    36 36
     import fr.ird.observe.client.ui.ObserveUIMode;
    
    37 37
     import fr.ird.observe.client.ui.actions.menu.storage.ChangeStorageAction;
    
    38 38
     import fr.ird.observe.client.ui.storage.StorageUIModel;
    
    39
    +import fr.ird.observe.client.ui.util.ProgressModel;
    
    39 40
     import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration;
    
    40 41
     import fr.ird.observe.services.configuration.ObserveDataSourceInformation;
    
    41 42
     import fr.ird.observe.services.configuration.rest.ObserveDataSourceConfigurationRest;
    
    ... ... @@ -493,7 +494,7 @@ public class ObserveDataSourcesManager implements Closeable {
    493 494
                     applicationContext.getConfig().saveTreeOpenNodeIds(dataContext.getOpenIds());
    
    494 495
                     dataContext.populateOpens();
    
    495 496
     
    
    496
    -                mainUI.getInitializer().cleanNavigationUI();
    
    497
    +                mainUI.getInitializer().cleanNavigationUI(new ProgressModel());
    
    497 498
     
    
    498 499
                     // on met a jour l'état dans la config
    
    499 500
                     applicationContext.getConfig().setMainStorageOpened(false);
    
    ... ... @@ -551,25 +552,29 @@ public class ObserveDataSourcesManager implements Closeable {
    551 552
                             log.debug("loading ui for storage " + source.getLabel() + ": " + mainUI.getName());
    
    552 553
                         }
    
    553 554
     
    
    555
    +                    ProgressModel progressModel = source.getProgressModel();
    
    556
    +
    
    554 557
                         ClientDataContext dataContext = mainUI.getDataContext();
    
    555 558
                         dataContext.setEnabled(true);
    
    556 559
     
    
    557
    -                    mainUI.getInitializer().cleanNavigationUI();
    
    560
    +                    mainUI.getInitializer().cleanNavigationUI(progressModel);
    
    558 561
     
    
    559 562
                         String[] openIds = config.getTreeOpenNodeIds();
    
    560 563
     
    
    561
    -                    //FIXME On utilise les open ids uniquement en écriture ? le test semble faux
    
    562
    -                    if (source.canReadData()) {
    
    563
    -                        applicationContext.getOpenDataManager().sanitizeOpenIds(openIds);
    
    564
    +                    if (source.canWriteData()) {
    
    565
    +                        applicationContext.getOpenDataManager().sanitizeOpenIds(progressModel, openIds);
    
    564 566
                         }
    
    567
    +
    
    565 568
                         if (source.canWriteData()) {
    
    566
    -                        applicationContext.getFloatingObjectReferencesManager().sanitize(source);
    
    569
    +                        applicationContext.getFloatingObjectReferencesManager().sanitize(progressModel,source);
    
    567 570
                         }
    
    568 571
     
    
    569 572
                         dataContext.populateOpens(openIds);
    
    570
    -                    mainUI.getInitializer().loadNavigationUI();
    
    573
    +
    
    574
    +                    mainUI.getInitializer().loadNavigationUI(progressModel);
    
    571 575
     
    
    572 576
                         mainUI.getModel().setMode(ObserveUIMode.DB);
    
    577
    +                    progressModel.incrementsCurrentStep();
    
    573 578
     
    
    574 579
                         mainUI.getStatus().setStatus(t("observe.message.db.loaded", source.getLabel()));
    
    575 580
     
    

  • client/src/main/java/fr/ird/observe/client/db/ObserveSwingDataSource.java
    ... ... @@ -32,6 +32,7 @@ import fr.ird.observe.client.ObserveSwingApplicationContext;
    32 32
     import fr.ird.observe.client.configuration.ClientConfig;
    
    33 33
     import fr.ird.observe.client.db.event.ObserveSwingDataSourceEvent;
    
    34 34
     import fr.ird.observe.client.db.event.ObserveSwingDataSourceListener;
    
    35
    +import fr.ird.observe.client.ui.util.ProgressModel;
    
    35 36
     import fr.ird.observe.services.ObserveServiceInitializer;
    
    36 37
     import fr.ird.observe.services.ObserveServicesProvider;
    
    37 38
     import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration;
    
    ... ... @@ -135,6 +136,8 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements
    135 136
     
    
    136 137
         private ObserveDataSourceConnection connection;
    
    137 138
     
    
    139
    +    private ProgressModel progressModel;
    
    140
    +
    
    138 141
         // indique que la connexion a expiré mais que la source n'est pas complétement fermer
    
    139 142
         private boolean expired;
    
    140 143
     
    
    ... ... @@ -243,7 +246,7 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements
    243 246
             fireOpened();
    
    244 247
         }
    
    245 248
     
    
    246
    -    //    @Override
    
    249
    +    @Override
    
    247 250
         public void close() {
    
    248 251
     
    
    249 252
             checkIsOpen();
    
    ... ... @@ -769,4 +772,12 @@ public class ObserveSwingDataSource extends AbstractSerializableBean implements
    769 772
         public <S extends ObserveService> S getService(Class<S> serviceType) {
    
    770 773
             return servicesProvider.getService(serviceType);
    
    771 774
         }
    
    775
    +
    
    776
    +    public ProgressModel getProgressModel() {
    
    777
    +        return progressModel;
    
    778
    +    }
    
    779
    +
    
    780
    +    public void setProgressModel(ProgressModel progressModel) {
    
    781
    +        this.progressModel = progressModel;
    
    782
    +    }
    
    772 783
     }

  • client/src/main/java/fr/ird/observe/client/ui/ObserveMainUIInitializer.java
    ... ... @@ -39,6 +39,7 @@ import fr.ird.observe.client.ui.tree.navigation.nodes.ReferenceNavigationTreeNod
    39 39
     import fr.ird.observe.client.ui.tree.navigation.nodes.StringNavigationTreeNodeSupport;
    
    40 40
     import fr.ird.observe.client.ui.util.ObserveSwingValidatorMessageTableModel;
    
    41 41
     import fr.ird.observe.client.ui.util.ObserveValidatorMessageTableRenderer;
    
    42
    +import fr.ird.observe.client.ui.util.ProgressModel;
    
    42 43
     import fr.ird.observe.services.decoration.DecoratorService;
    
    43 44
     import fr.ird.observe.services.decoration.ObserveI18nDecoratorHelper;
    
    44 45
     import fr.ird.observe.services.dto.constants.ReferentialLocale;
    
    ... ... @@ -552,11 +553,14 @@ public class ObserveMainUIInitializer {
    552 553
          * Nettoye des ui tout ce qui concerne un modèle de navigation.
    
    553 554
          * <p>
    
    554 555
          * <b>Note:</b> cette méthode doit être appelée avant tout rechargement de modèle de naivgation.
    
    556
    +     *
    
    557
    +     * @param progressModel progress model to interact with ui
    
    555 558
          */
    
    556
    -    public void cleanNavigationUI() {
    
    559
    +    public void cleanNavigationUI(ProgressModel progressModel) {
    
    557 560
     
    
    558 561
             // reset content uis
    
    559 562
             ui.getContentLayout().reset(ui.getContent());
    
    563
    +        progressModel.incrementsCurrentStep();
    
    560 564
     
    
    561 565
             // clean messages
    
    562 566
             ui.getContextValue(SwingValidatorMessageTableModel.class).clear();
    
    ... ... @@ -565,6 +569,7 @@ public class ObserveMainUIInitializer {
    565 569
             NavigationTree tree = ui.getNavigation();
    
    566 570
     
    
    567 571
             tree.clearModel();
    
    572
    +        progressModel.incrementsCurrentStep();
    
    568 573
     
    
    569 574
             // no tree navigation view
    
    570 575
             tree.setVisible(false);
    
    ... ... @@ -575,16 +580,20 @@ public class ObserveMainUIInitializer {
    575 580
          * Charge dans l'ui un nouveau modèle de navigation.
    
    576 581
          * <p>
    
    577 582
          * <b>Note:</b> cette méthode doit être appelée après tout rechargement de modèle de naivgation.
    
    578
    -     **/
    
    579
    -    public void loadNavigationUI() {
    
    583
    +     *
    
    584
    +     * @param progressModel the progress model to interact with ui
    
    585
    +     */
    
    586
    +    public void loadNavigationUI(ProgressModel progressModel) {
    
    580 587
     
    
    581 588
             NavigationTree tree = ui.getNavigation();
    
    582 589
     
    
    583 590
             NavigationTreeModel treeModel = tree.getTreeModel();
    
    584 591
             treeModel.populate();
    
    592
    +        progressModel.incrementsCurrentStep();
    
    585 593
     
    
    586 594
             // select initial node
    
    587 595
             tree.selectInitialNode();
    
    596
    +        progressModel.incrementsCurrentStep();
    
    588 597
     
    
    589 598
             tree.setVisible(true);
    
    590 599
     
    

  • client/src/main/java/fr/ird/observe/client/ui/storage/StorageBackupUILauncher.java
    ... ... @@ -155,14 +155,13 @@ public class StorageBackupUILauncher extends StorageUILauncher {
    155 155
     
    
    156 156
                         for (DataReference trip : entry.getValue()) {
    
    157 157
     
    
    158
    -                        progressModel.incrementsCurrentStep();
    
    159 158
                             ExportTripRequest exportRequest = new ExportTripRequest(false, entry.getKey().getId(), trip.getId());
    
    160 159
                             ExportTripResult exportTripResult = managementService.exportTrip(exportRequest);
    
    161
    -
    
    162 160
                             progressModel.incrementsCurrentStep();
    
    163 161
     
    
    164 162
                             ImportTripRequest importTripRequest = new ImportTripRequest(exportTripResult);
    
    165 163
                             tmpManagementService.importTrip(importTripRequest);
    
    164
    +                        progressModel.incrementsCurrentStep();
    
    166 165
     
    
    167 166
                         }
    
    168 167
     
    
    ... ... @@ -170,13 +169,12 @@ public class StorageBackupUILauncher extends StorageUILauncher {
    170 169
     
    
    171 170
                 }
    
    172 171
     
    
    173
    -            progressModel.incrementsCurrentStep();
    
    174
    -
    
    175 172
                 if (log.isInfoEnabled()) {
    
    176 173
                     log.info("Exporting to " + backupFile);
    
    177 174
                 }
    
    178 175
     
    
    179 176
                 sourceToBackup.getDataSourceService().backup(backupFile);
    
    177
    +            progressModel.incrementsCurrentStep();
    
    180 178
     
    
    181 179
             } catch (DatabaseNotFoundException | DatabaseConnexionNotAuthorizedException | BabModelVersionException | IncompatibleDataSourceCreateConfigurationException | DataSourceCreateWithNoReferentialImportException e) {
    
    182 180
                 throw new ObserveSwingTechnicalException(e);
    

  • client/src/main/java/fr/ird/observe/client/ui/storage/StorageUIHandler.java
    ... ... @@ -42,6 +42,7 @@ import fr.ird.observe.client.ui.storage.tabs.SecurityModel;
    42 42
     import fr.ird.observe.client.ui.storage.tabs.SelectDataUI;
    
    43 43
     import fr.ird.observe.client.ui.storage.tabs.StorageTabUI;
    
    44 44
     import fr.ird.observe.client.ui.tree.selection.SelectionTreeModel;
    
    45
    +import fr.ird.observe.client.ui.util.ProgressModel;
    
    45 46
     import fr.ird.observe.services.configuration.ObserveDataSourceConfiguration;
    
    46 47
     import fr.ird.observe.services.configuration.ObserveDataSourceInformation;
    
    47 48
     import fr.ird.observe.services.configuration.rest.ObserveDataSourceConfigurationRest;
    
    ... ... @@ -357,15 +358,12 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    357 358
             ClientConfig config = observeContext.getConfig();
    
    358 359
     
    
    359 360
             // faut-il detruire la base locale ?
    
    360
    -        boolean destroyLocalBase =
    
    361
    -                config.isLocalStorageExist() &&
    
    362
    -                        model.getDbMode() == DbMode.CREATE_LOCAL;
    
    361
    +        boolean destroyLocalBase = config.isLocalStorageExist() && model.getDbMode() == DbMode.CREATE_LOCAL;
    
    363 362
     
    
    364 363
             if (log.isDebugEnabled()) {
    
    365 364
                 log.debug(">>> should destroy local db ? " + destroyLocalBase);
    
    366 365
             }
    
    367 366
     
    
    368
    -
    
    369 367
             ObserveDataSourcesManager dataSourcesManager = observeContext.getDataSourcesManager();
    
    370 368
             ObserveSwingDataSource currentDataSource = dataSourcesManager.getMainDataSource();
    
    371 369
     
    
    ... ... @@ -375,9 +373,36 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    375 373
                 localDataSource = currentDataSource;
    
    376 374
             }
    
    377 375
     
    
    376
    +        ProgressModel progressModel = model.getProgressModel();
    
    377
    +
    
    378
    +        int stepsCount = 8;
    
    379
    +
    
    380
    +        if (destroyLocalBase || model.isDoBackup()) {
    
    381
    +            stepsCount++;
    
    382
    +        }
    
    383
    +        if (destroyLocalBase) {
    
    384
    +            stepsCount++;
    
    385
    +        }
    
    386
    +        if (model.isDoBackup()) {
    
    387
    +            stepsCount++;
    
    388
    +        }
    
    389
    +        if (currentDataSource != null && currentDataSource.isOpen()) {
    
    390
    +            stepsCount++;
    
    391
    +        }
    
    392
    +        if (DbMode.USE_LOCAL.equals((model.getDbMode()))) {
    
    393
    +            stepsCount += 2;
    
    394
    +        }
    
    395
    +        String[] openIds = config.getTreeOpenNodeIds();
    
    396
    +        stepsCount += openIds.length;
    
    397
    +        stepsCount += observeContext.getFloatingObjectReferencesManager().getNames().size();
    
    398
    +
    
    399
    +        progressModel.installUI(ui.getCONFIRM().getProgressBar());
    
    400
    +        progressModel.setStepsCount(stepsCount);
    
    401
    +
    
    378 402
             boolean localDbIsSane = true;
    
    379 403
             if (destroyLocalBase || model.isDoBackup()) {
    
    380 404
                 if (localDataSource == null) {
    
    405
    +
    
    381 406
                     ObserveDataSourceConfigurationTopiaH2 localConfiguration = dataSourcesManager.newH2DataSourceConfiguration(config, t("observe.storage.label.local"));
    
    382 407
     
    
    383 408
                     // la base ne doit pas etre mise a jour dans ce cas
    
    ... ... @@ -413,6 +438,8 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    413 438
                         localDataSource = null;
    
    414 439
                     }
    
    415 440
                 }
    
    441
    +
    
    442
    +            progressModel.incrementsCurrentStep();
    
    416 443
             }
    
    417 444
     
    
    418 445
             if (model.isDoBackup()) {
    
    ... ... @@ -439,6 +466,8 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    439 466
                     UIHelper.handlingError(e);
    
    440 467
                     return;
    
    441 468
                 }
    
    469
    +
    
    470
    +            progressModel.incrementsCurrentStep();
    
    442 471
             }
    
    443 472
     
    
    444 473
             if (destroyLocalBase) {
    
    ... ... @@ -465,6 +494,8 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    465 494
                         return;
    
    466 495
                     }
    
    467 496
                 }
    
    497
    +
    
    498
    +            progressModel.incrementsCurrentStep();
    
    468 499
             }
    
    469 500
     
    
    470 501
             // suppression du storage precedent
    
    ... ... @@ -473,8 +504,13 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    473 504
                     log.debug(">>> close main storage " + currentDataSource);
    
    474 505
                 }
    
    475 506
                 // on doit fermer le storage en cours d'utilisation
    
    476
    -            currentDataSource.close();
    
    507
    +            try {
    
    508
    +                currentDataSource.close();
    
    509
    +            } catch (Exception e) {
    
    510
    +                UIHelper.handlingError(e);
    
    511
    +            }
    
    477 512
             }
    
    513
    +        progressModel.incrementsCurrentStep();
    
    478 514
     
    
    479 515
             // suppression du storage local
    
    480 516
             if (localDataSource != null
    
    ... ... @@ -486,7 +522,11 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    486 522
                     log.debug(">>> close local storage " + localDataSource);
    
    487 523
                 }
    
    488 524
                 // on doit fermer le storage local ouvert
    
    489
    -            localDataSource.close();
    
    525
    +            try {
    
    526
    +                localDataSource.close();
    
    527
    +            } catch (Exception e) {
    
    528
    +                UIHelper.handlingError(e);
    
    529
    +            }
    
    490 530
             }
    
    491 531
     
    
    492 532
             if (log.isDebugEnabled()) {
    
    ... ... @@ -498,14 +538,19 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    498 538
             try {
    
    499 539
     
    
    500 540
                 currentDataSource = ObserveSwingApplicationContext.get().getDataSourcesManager().newDataSourceFromModel(model);
    
    541
    +            currentDataSource.setProgressModel(progressModel);
    
    501 542
     
    
    502 543
                 // si on utilise la base local on lance une migration de la base si necessaire
    
    503 544
                 if (DbMode.USE_LOCAL.equals((model.getDbMode()))) {
    
    504 545
     
    
    505 546
                     ObserveDataSourceInformation dataSourceInformation = currentDataSource.checkCanConnect();
    
    506 547
     
    
    548
    +                progressModel.incrementsCurrentStep();
    
    549
    +
    
    507 550
                     currentDataSource.migrateData(dataSourceInformation, config.getModelVersion());
    
    508 551
     
    
    552
    +                progressModel.incrementsCurrentStep();
    
    553
    +
    
    509 554
                 }
    
    510 555
     
    
    511 556
                 dataSourcesManager.setMainDataSource(currentDataSource);
    
    ... ... @@ -543,6 +588,8 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    543 588
                     currentDataSource.open();
    
    544 589
                 }
    
    545 590
     
    
    591
    +            progressModel.incrementsCurrentStep();
    
    592
    +
    
    546 593
                 if (DbMode.CREATE_LOCAL.equals(model.getDbMode())
    
    547 594
                         && (CreationMode.IMPORT_REMOTE_STORAGE.equals(model.getCreationMode()) || CreationMode.IMPORT_SERVER_STORAGE.equals(model.getCreationMode()))
    
    548 595
                         && config.isLocalStorageExist()) {
    
    ... ... @@ -572,6 +619,8 @@ public class StorageUIHandler implements UIHandler<StorageUI> {
    572 619
                     log.info(">>> main storage opened " + currentDataSource.getLabel());
    
    573 620
                 }
    
    574 621
     
    
    622
    +            progressModel.incrementsCurrentStep();
    
    623
    +
    
    575 624
             } catch (Exception ex) {
    
    576 625
                 UIHelper.handlingError(ex);
    
    577 626
                 throw new RuntimeException(ex);
    

  • client/src/main/java/fr/ird/observe/client/ui/storage/StorageUILauncher.java
    ... ... @@ -100,7 +100,6 @@ public class StorageUILauncher extends WizardUILancher<StorageStep, StorageUIMod
    100 100
         @Override
    
    101 101
         protected void doAction(StorageUI ui) {
    
    102 102
             ui.getModel().setBusy(true);
    
    103
    -        super.doAction(ui);
    
    104 103
         }
    
    105 104
     
    
    106 105
         @Override
    

  • client/src/main/java/fr/ird/observe/client/ui/util/ProgressModel.java
    ... ... @@ -23,6 +23,7 @@ package fr.ird.observe.client.ui.util;
    23 23
      */
    
    24 24
     
    
    25 25
     import javax.swing.JProgressBar;
    
    26
    +import javax.swing.SwingUtilities;
    
    26 27
     import org.jdesktop.beans.AbstractBean;
    
    27 28
     
    
    28 29
     /**
    
    ... ... @@ -70,6 +71,6 @@ public class ProgressModel extends AbstractBean {
    70 71
         }
    
    71 72
     
    
    72 73
         public void incrementsCurrentStep() {
    
    73
    -        setCurrentStep(getCurrentStep() + 1);
    
    74
    +        SwingUtilities.invokeLater(() -> setCurrentStep(getCurrentStep() + 1));
    
    74 75
         }
    
    75 76
     }