public synchronized void load() {
    long startTs = System.currentTimeMillis();
    long readEnd = startTs;
    try {
      List<InternalExternalProjectInfo> projectInfos = load(myProject);
      readEnd = System.currentTimeMillis();

      boolean isOpenedProject = hasLinkedExternalProjects() && !ExternalSystemUtil.isNewProject(myProject);
      if (projectInfos == null || (projectInfos.isEmpty() && isOpenedProject)) {
        markDirtyAllExternalProjects();
      }

      for (InternalExternalProjectInfo projectInfo : ContainerUtil.notNullize(projectInfos)) {
        Pair<ProjectSystemId, File> key = Pair.create(projectInfo.getProjectSystemId(), new File(projectInfo.getExternalProjectPath()));
        InternalExternalProjectInfo projectInfoReceivedBeforeStorageInitialization = myExternalRootProjects.get(key);
        if (projectInfoReceivedBeforeStorageInitialization != null &&
            projectInfoReceivedBeforeStorageInitialization.getLastSuccessfulImportTimestamp() > 0) {
          // do not override the last successful import data which was received before this data storage initialization
          continue;
        }
        if (validate(projectInfo)) {
          InternalExternalProjectInfo merged =
            myExternalRootProjects.merge(key, projectInfo, (oldInfo, info) -> {
              // do not override the last successful import data which was received before this data storage initialization
              return oldInfo.getLastSuccessfulImportTimestamp() > 0 ? oldInfo : info;
            });
          if (merged.getLastImportTimestamp() != merged.getLastSuccessfulImportTimestamp()) {
            markDirty(merged.getExternalProjectPath());
          }
        }
        else {
          String projectPath = projectInfo.getNullSafeExternalProjectPath();
          if (projectPath != null) {
            markDirty(projectPath);
          }
        }
      }
    }
    catch (CancellationException e) {
      throw e;
    }
    catch (Throwable e) {
      markDirtyAllExternalProjects();
      LOG.error(e);
    }

    mergeLocalSettings();

    incModificationCount();

    long finishTs = System.currentTimeMillis();
    LOG.info("Load external projects data in " + (finishTs - startTs) + " millis (read time: " + (readEnd - startTs) + ")");
  }
public synchronized void load()