void () { ApplicationManager.getApplication().runWriteAction(() -> { final ArrayList<Sdk> itemsInTable = new ArrayList<>(); final ProjectJdkTable jdkTable = ProjectJdkTable.getInstance(); final Sdk[] allFromTable = jdkTable.getAllJdks(); // Delete removed and fill itemsInTable for (final Sdk tableItem : allFromTable) { if (myProjectSdks.containsKey(tableItem)) { itemsInTable.add(tableItem); } else { jdkTable.removeJdk(tableItem); } } // Now all removed items are deleted from table, itemsInTable contains all items in table for (Sdk originalJdk : itemsInTable) { final Sdk modifiedJdk = myProjectSdks.get(originalJdk); LOG.assertTrue(modifiedJdk != null); LOG.assertTrue(originalJdk != modifiedJdk); jdkTable.updateJdk(originalJdk, modifiedJdk); } // Add new items to table final Sdk[] allJdks = jdkTable.getAllJdks(); for (final Sdk projectJdk : myProjectSdks.keySet()) { LOG.assertTrue(projectJdk != null); if (ArrayUtilRt.find(allJdks, projectJdk) == -1) { jdkTable.addJdk(projectJdk); jdkTable.updateJdk(projectJdk, myProjectSdks.get(projectJdk)); SdkDownloadTracker.getInstance().tryRegisterSdkDownloadFailureHandler(projectJdk, () -> { ApplicationManager.getApplication().runWriteAction(() -> { ProjectJdkTable.getInstance().removeJdk(projectJdk); }); }); } } }); }