public void addSupport(
     final @NotNull Module module, final @NotNull ModifiableRootModel rootModel) {
   List<Library> addedLibraries = new ArrayList<Library>();
   List<FrameworkSupportNode> selectedFrameworks = getSelectedNodes();
   sortFrameworks(selectedFrameworks);
   List<FrameworkSupportConfigurable> selectedConfigurables =
       new ArrayList<FrameworkSupportConfigurable>();
   final IdeaModifiableModelsProvider modifiableModelsProvider =
       new IdeaModifiableModelsProvider();
   for (FrameworkSupportNode node : selectedFrameworks) {
     FrameworkSupportInModuleConfigurable configurable = node.getConfigurable();
     if (configurable
         instanceof OldFrameworkSupportProviderWrapper.FrameworkSupportConfigurableWrapper) {
       selectedConfigurables.add(
           ((OldFrameworkSupportProviderWrapper.FrameworkSupportConfigurableWrapper) configurable)
               .getConfigurable());
     }
     final LibraryCompositionSettings settings = getLibraryCompositionSettings(node);
     Library library =
         settings != null
             ? settings.addLibraries(rootModel, addedLibraries, myLibrariesContainer)
             : null;
     if (configurable
         instanceof OldFrameworkSupportProviderWrapper.FrameworkSupportConfigurableWrapper) {
       ((OldFrameworkSupportProviderWrapper.FrameworkSupportConfigurableWrapper) configurable)
           .getConfigurable()
           .addSupport(module, rootModel, library);
     } else {
       configurable.addSupport(module, rootModel, modifiableModelsProvider);
     }
   }
   for (FrameworkSupportNode node : selectedFrameworks) {
     FrameworkSupportInModuleProvider provider = node.getUserObject();
     if (provider instanceof OldFrameworkSupportProviderWrapper) {
       final FrameworkSupportProvider oldProvider =
           ((OldFrameworkSupportProviderWrapper) provider).getProvider();
       if (oldProvider instanceof FacetBasedFrameworkSupportProvider
           && !addedLibraries.isEmpty()) {
         ((FacetBasedFrameworkSupportProvider) oldProvider)
             .processAddedLibraries(module, addedLibraries);
       }
     }
   }
   for (FrameworkSupportCommunicator communicator :
       FrameworkSupportCommunicator.EP_NAME.getExtensions()) {
     communicator.onFrameworkSupportAdded(module, rootModel, selectedConfigurables, myModel);
   }
 }
  @Override
  protected void doOKAction() {
    final LibraryCompositionSettings librarySettings = myComponent.getLibraryCompositionSettings();
    if (librarySettings != null) {
      final ModifiableRootModel modifiableModel =
          myModifiableModelsProvider.getModuleModifiableModel(myModule);
      if (!askAndRemoveDuplicatedLibraryEntry(
          modifiableModel, librarySettings.getLibraryDescription())) {
        if (myConfigurable.isOnlyLibraryAdded()) {
          myModifiableModelsProvider.disposeModuleModifiableModel(modifiableModel);
          return;
        }
        return;
      }

      // Fix
      new WriteAction() {
        @Override
        protected void run(final Result result) {
          myModifiableModelsProvider.commitModuleModifiableModel(modifiableModel);
        }
      }.execute();

      final boolean downloaded = librarySettings.downloadFiles(getRootPane());
      if (!downloaded) {
        int answer =
            Messages.showYesNoDialog(
                getRootPane(),
                ProjectBundle.message("warning.message.some.required.libraries.wasn.t.downloaded"),
                CommonBundle.getWarningTitle(),
                Messages.getWarningIcon());
        if (answer != 0) {
          return;
        }
      }
    }

    new WriteAction() {
      @Override
      protected void run(final Result result) {
        final ModifiableRootModel rootModel =
            myModifiableModelsProvider.getModuleModifiableModel(myModule);
        if (librarySettings != null) {
          librarySettings.addLibraries(
              rootModel, new ArrayList<Library>(), myModel.getLibrariesContainer());
        }
        myConfigurable.addSupport(myModule, rootModel, myModifiableModelsProvider);
        myModifiableModelsProvider.commitModuleModifiableModel(rootModel);
      }
    }.execute();
    super.doOKAction();
  }