private void importMissing( @NotNull IdeModifiableModelsProvider modelsProvider, @NotNull Set<LibraryDependencyData> toImport, @NotNull Map<OrderEntry, OrderAware> orderEntryDataMap, @NotNull ModifiableRootModel moduleRootModel, @NotNull LibraryTable moduleLibraryTable, @NotNull Module module) { for (final LibraryDependencyData dependencyData : toImport) { final LibraryData libraryData = dependencyData.getTarget(); final String libraryName = libraryData.getInternalName(); switch (dependencyData.getLevel()) { case MODULE: final Library moduleLib; if (libraryName.isEmpty()) { moduleLib = moduleLibraryTable.createLibrary(); } else { moduleLib = moduleLibraryTable.createLibrary(libraryName); } final LibraryOrderEntry existingLibraryDependency = syncExistingLibraryDependency( modelsProvider, dependencyData, moduleLib, moduleRootModel, module); orderEntryDataMap.put(existingLibraryDependency, dependencyData); break; case PROJECT: final Library projectLib = modelsProvider.getLibraryByName(libraryName); if (projectLib == null) { final LibraryOrderEntry existingProjectLibraryDependency = syncExistingLibraryDependency( modelsProvider, dependencyData, moduleLibraryTable.createLibrary(libraryName), moduleRootModel, module); orderEntryDataMap.put(existingProjectLibraryDependency, dependencyData); break; } LibraryOrderEntry orderEntry = moduleRootModel.addLibraryEntry(projectLib); orderEntryDataMap.put(orderEntry, dependencyData); setLibraryScope(orderEntry, projectLib, module, dependencyData); } } }
public static boolean isRelated(@NotNull Library library, @NotNull LibraryData libraryData) { return getLibraryName(library).equals(libraryData.getInternalName()); }
@Override protected Map<OrderEntry, OrderAware> importData( @NotNull final Collection<DataNode<LibraryDependencyData>> nodesToImport, @NotNull final Module module, @NotNull final IdeModifiableModelsProvider modelsProvider) { // The general idea is to import all external project library dependencies and module libraries // which don't present at the // ide side yet and remove all project library dependencies and module libraries which present // at the ide but not at // the given collection. // The trick is that we should perform module settings modification inside try/finally block // against target root model. // That means that we need to prepare all necessary data, obtain a model and modify it as // necessary. final Map<Set<String> /* library paths */, LibraryDependencyData> moduleLibrariesToImport = ContainerUtilRt.newHashMap(); final Map<String /* library name + scope */, LibraryDependencyData> projectLibrariesToImport = ContainerUtilRt.newHashMap(); final Set<LibraryDependencyData> toImport = ContainerUtilRt.newLinkedHashSet(); final Map<OrderEntry, OrderAware> orderEntryDataMap = ContainerUtil.newLinkedHashMap(); boolean hasUnresolved = false; for (DataNode<LibraryDependencyData> dependencyNode : nodesToImport) { LibraryDependencyData dependencyData = dependencyNode.getData(); LibraryData libraryData = dependencyData.getTarget(); hasUnresolved |= libraryData.isUnresolved(); switch (dependencyData.getLevel()) { case MODULE: Set<String> paths = ContainerUtilRt.newHashSet(); for (String path : libraryData.getPaths(LibraryPathType.BINARY)) { paths.add( ExternalSystemApiUtil.toCanonicalPath(path) + dependencyData.getScope().name()); } moduleLibrariesToImport.put(paths, dependencyData); toImport.add(dependencyData); break; case PROJECT: projectLibrariesToImport.put( libraryData.getInternalName() + dependencyData.getScope().name(), dependencyData); toImport.add(dependencyData); } } final boolean finalHasUnresolved = hasUnresolved; final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module); LibraryTable moduleLibraryTable = modifiableRootModel.getModuleLibraryTable(); syncExistingAndRemoveObsolete( modelsProvider, moduleLibrariesToImport, projectLibrariesToImport, toImport, orderEntryDataMap, modifiableRootModel, finalHasUnresolved); // Import missing library dependencies. if (!toImport.isEmpty()) { importMissing( modelsProvider, toImport, orderEntryDataMap, modifiableRootModel, moduleLibraryTable, module); } return orderEntryDataMap; }