/** Add facet to App Engine module on imported modules */
  @Override
  public void importData(
      @NotNull final Collection<DataNode<IdeaAppEngineProject>> toImport,
      @NotNull final Project project,
      boolean synchronous) {
    if (toImport.isEmpty()) {
      return;
    }

    RunResult result =
        new WriteCommandAction.Simple(project) {
          @Override
          protected void run() throws Throwable {
            Map<String, IdeaAppEngineProject> importModulesMap = indexByModuleName(toImport);
            for (Module module : ModuleManager.getInstance(project).getModules()) {
              if (importModulesMap.containsKey(module.getName())) {
                AppEngineGradleFacet facet =
                    addAppEngineGradleFacet(importModulesMap.get(module.getName()), module);
                addAppEngineRunConfiguration(module, facet);
                UsageTracker.getInstance()
                    .trackEvent(GctTracking.CATEGORY, GctTracking.GRADLE_IMPORT, null, null);
              }
            }
          }
        }.execute();
    Throwable error = result.getThrowable();
    if (error != null) {
      LOG.error(String.format("Failed to set up App Engine Gradle Modules"));
      syncFailed(project, error.getMessage());
    }
  }
  private static Library addProjectLibrary(
      Module module,
      ModifiableRootModel model,
      String libName,
      List<VirtualFile> classesRoots,
      List<VirtualFile> sourceRoots) {
    LibraryTable libraryTable = ProjectLibraryTable.getInstance(module.getProject());
    RunResult<Library> result =
        new WriteAction<Library>() {
          @Override
          protected void run(@NotNull Result<Library> result) throws Throwable {
            Library library = libraryTable.createLibrary(libName);
            Library.ModifiableModel libraryModel = library.getModifiableModel();
            try {
              for (VirtualFile root : classesRoots) {
                libraryModel.addRoot(root, OrderRootType.CLASSES);
              }
              for (VirtualFile root : sourceRoots) {
                libraryModel.addRoot(root, OrderRootType.SOURCES);
              }
              libraryModel.commit();
            } catch (Throwable t) {
              //noinspection SSBasedInspection
              libraryModel.dispose();
              throw t;
            }

            model.addLibraryEntry(library);
            OrderEntry[] orderEntries = model.getOrderEntries();
            OrderEntry last = orderEntries[orderEntries.length - 1];
            System.arraycopy(orderEntries, 0, orderEntries, 1, orderEntries.length - 1);
            orderEntries[0] = last;
            model.rearrangeOrderEntries(orderEntries);
            result.setResult(library);
          }
        }.execute();
    result.throwException();
    return result.getResultObject();
  }