From 6d50f65056805cb28a4f7c8ab34493623b3a5caa Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Tue, 15 Sep 2015 14:38:48 +0300 Subject: [PATCH] external system: use platform modifiable models during project import; move modifiable models provider from maven to external system API for reuse --- .../JavaProjectDataService.java | 11 +- .../external-system-api.iml | 1 + .../ArtifactExternalDependenciesImporter.java | 39 ++ .../service/project/IdeModelsProvider.java | 68 +++ .../project/IdeModifiableModelsProvider.java | 46 +- .../service/project/PlatformFacade.java | 96 ---- .../manage/AbstractProjectDataService.java | 28 +- .../project/manage/ProjectDataService.java | 26 +- .../project/manage/ProjectDataServiceEx.java | 52 --- .../AbstractExternalSystemLocalSettings.java | 9 +- .../util/ExternalSystemApiUtil.java | 10 +- .../external-system-impl.iml | 2 +- .../action/AttachExternalProjectAction.java | 2 +- .../action/DetachExternalProjectAction.java | 8 +- .../RefreshAllExternalProjectsAction.java | 2 +- .../action/RefreshExternalProjectAction.java | 4 +- .../AbstractIdeModifiableModelsProvider.java | 428 ++++++++++++++++++ ...ifactExternalDependenciesImporterImpl.java | 7 +- .../IdeModifiableModelsProviderImpl.java | 90 ++++ .../IdeUIModifiableModelsProvider.java | 51 +-- .../service/project/PlatformFacadeImpl.java | 250 ---------- .../project/ProjectStructureHelper.java | 69 --- .../manage/AbstractDependencyDataService.java | 48 +- .../manage/ContentRootDataService.java | 82 ++-- .../project/manage/LibraryDataService.java | 139 +++--- .../manage/LibraryDependencyDataService.java | 316 ++++++------- .../project/manage/ModuleDataService.java | 168 +++---- .../manage/ModuleDependencyDataService.java | 72 ++- .../project/manage/ProjectDataManager.java | 154 ++++--- .../manage/ProjectDataServiceImpl.java | 27 +- .../AbstractExternalProjectImportBuilder.java | 26 +- .../task/AbstractToolWindowService.java | 31 +- .../ui/ExternalProjectDataSelectorDialog.java | 22 +- .../util/ExternalSystemUtil.java | 181 +------- .../ExternalSystemViewDefaultContributor.java | 6 +- .../project/ExternalProjectServiceTest.groovy | 31 +- .../test/ExternalProjectBuilder.groovy | 4 +- .../TestExternalSystemLocalSettings.groovy | 5 +- .../src/META-INF/ExternalSystemExtensions.xml | 3 - .../maven/AppEngineFacetImporter.java | 6 +- .../service/GradleInstallationManager.java | 9 +- ...BuildClasspathModuleGradleDataService.java | 12 +- .../data/ExternalProjectDataService.java | 18 +- .../gradle/settings/GradleLocalSettings.java | 5 +- plugins/maven/maven.iml | 4 +- .../idea/maven/importing/FacetImporter.java | 15 +- .../idea/maven/importing/GroovyImporter.java | 5 +- .../MavenBaseModifiableModelsProvider.java | 219 --------- .../MavenDefaultModifiableModelsProvider.java | 149 ------ .../maven/importing/MavenFoldersImporter.java | 3 +- .../idea/maven/importing/MavenImporter.java | 7 +- .../maven/importing/MavenModuleImporter.java | 7 +- .../maven/importing/MavenProjectImporter.java | 11 +- .../importing/MavenRootModelAdapter.java | 11 +- .../maven/project/MavenProjectsManager.java | 20 +- .../maven/wizards/MavenProjectBuilder.java | 8 +- .../maven/importing/FoldersImportingTest.java | 5 +- .../maven/importing/GroovyImporterTest.java | 3 +- .../maven/importing/MiscImportingTest.java | 3 +- .../project/MavenFoldersImporterTest.java | 6 +- 60 files changed, 1334 insertions(+), 1806 deletions(-) create mode 100644 platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporter.java create mode 100644 platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java rename plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModifiableModelsProvider.java => platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProvider.java (65%) delete mode 100644 platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/PlatformFacade.java delete mode 100644 platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceEx.java create mode 100644 platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/AbstractIdeModifiableModelsProvider.java rename plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java => platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java (95%) create mode 100644 platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java rename plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenUIModifiableModelsProvider.java => platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java (67%) delete mode 100644 platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java delete mode 100644 platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ProjectStructureHelper.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenBaseModifiableModelsProvider.java delete mode 100644 plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java diff --git a/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java b/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java index 25cbb042946d..49987616c95b 100644 --- a/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java +++ b/java/java-impl/src/com/intellij/externalSystem/JavaProjectDataService.java @@ -19,7 +19,7 @@ import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.Key; import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService; import com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; @@ -53,8 +53,7 @@ public class JavaProjectDataService extends AbstractProjectDataService> toImport, @Nullable final ProjectData projectData, @NotNull final Project project, - @NotNull final PlatformFacade platformFacade, - final boolean synchronous) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { if (toImport.isEmpty() || projectData == null) { return; } @@ -93,7 +92,7 @@ public class JavaProjectDataService extends AbstractProjectDataService + \ No newline at end of file diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporter.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporter.java new file mode 100644 index 000000000000..1836b1207bbf --- /dev/null +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporter.java @@ -0,0 +1,39 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.externalSystem.service.project; + +import com.intellij.packaging.artifacts.Artifact; +import com.intellij.packaging.artifacts.ModifiableArtifactModel; +import com.intellij.packaging.elements.PackagingElement; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.ui.ManifestFileConfiguration; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.List; + +/** + * @author Vladislav.Soroka + * @since 9/11/2015 + */ +public interface ArtifactExternalDependenciesImporter { + @Nullable + public ManifestFileConfiguration getManifestFile(@NotNull Artifact artifact, @NotNull PackagingElementResolvingContext context); + + List> getExternalDependenciesList(@NotNull Artifact artifact); + + void applyChanges(ModifiableArtifactModel artifactModel, PackagingElementResolvingContext context); +} diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java new file mode 100644 index 000000000000..1935f3602f2c --- /dev/null +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModelsProvider.java @@ -0,0 +1,68 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.externalSystem.service.project; + +import com.intellij.openapi.externalSystem.model.project.*; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.roots.ModuleOrderEntry; +import com.intellij.openapi.roots.OrderEntry; +import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.vfs.VirtualFile; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +/** + * @author Vladislav.Soroka + * @since 9/11/2015 + */ +public interface IdeModelsProvider { + @NotNull + Module[] getModules(); + + @NotNull + Module[] getModules(@NotNull ProjectData projectData); + + @NotNull + OrderEntry[] getOrderEntries(@NotNull Module module); + + @Nullable + Module findIdeModule(@NotNull ModuleData module); + + @Nullable + Module findIdeModule(@NotNull String ideModuleName); + + @Nullable + Library findIdeLibrary(@NotNull LibraryData libraryData); + + @Nullable + ModuleOrderEntry findIdeModuleDependency(@NotNull ModuleDependencyData dependency, @NotNull Module module); + + @Nullable + OrderEntry findIdeModuleOrderEntry(LibraryDependencyData data); + + @NotNull + VirtualFile[] getContentRoots(Module module); + + @NotNull + Library[] getAllLibraries(); + + @Nullable + Library getLibraryByName(String name); + + @NotNull + String[] getLibraryUrls(@NotNull Library library, @NotNull OrderRootType type); +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModifiableModelsProvider.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProvider.java similarity index 65% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModifiableModelsProvider.java rename to platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProvider.java index 2f5202f19262..33148bcea989 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModifiableModelsProvider.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2009 JetBrains s.r.o. + * Copyright 2000-2015 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -13,52 +13,56 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.importing; +package com.intellij.openapi.externalSystem.service.project; import com.intellij.facet.ModifiableFacetModel; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.packaging.artifacts.ModifiableArtifactModel; import com.intellij.packaging.elements.PackagingElementResolvingContext; +import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; -import org.jetbrains.idea.maven.project.MavenModelsProvider; -public interface MavenModifiableModelsProvider extends MavenModelsProvider { - ModifiableModuleModel getModuleModel(); +/** + * @author Vladislav.Soroka + * @since 9/11/2015 + */ +public interface IdeModifiableModelsProvider extends IdeModelsProvider { + @NotNull + Module newModule(@NotNull @NonNls String filePath, final String moduleTypeId); - ModifiableRootModel getRootModel(Module module); + @NotNull + ModifiableModuleModel getModifiableModuleModel(); - ModifiableFacetModel getFacetModel(Module module); + @NotNull + ModifiableRootModel getModifiableRootModel(Module module); - ModifiableArtifactModel getArtifactModel(); + @NotNull + ModifiableFacetModel getModifiableFacetModel(Module module); - PackagingElementResolvingContext getPackagingElementResolvingContext(); + @NotNull + LibraryTable.ModifiableModel getModifiableProjectLibrariesModel(); - ArtifactExternalDependenciesImporter getArtifactExternalDependenciesImporter(); + Library.ModifiableModel getModifiableLibraryModel(Library library); - LibraryTable.ModifiableModel getProjectLibrariesModel(); - - Library[] getAllLibraries(); - - Library getLibraryByName(String name); + @NotNull + ModifiableArtifactModel getModifiableArtifactModel(); Library createLibrary(String name); void removeLibrary(Library library); - Library.ModifiableModel getLibraryModel(Library library); + ModalityState getModalityStateForQuestionDialogs(); - @NotNull - String[] getLibraryUrls(@NotNull Library library, @NotNull OrderRootType type); + ArtifactExternalDependenciesImporter getArtifactExternalDependenciesImporter(); + + PackagingElementResolvingContext getPackagingElementResolvingContext(); void commit(); void dispose(); - - ModalityState getModalityStateForQuestionDialogs(); } diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/PlatformFacade.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/PlatformFacade.java deleted file mode 100644 index 34d03b5abdd0..000000000000 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/PlatformFacade.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.intellij.openapi.externalSystem.service.project; - -import com.intellij.openapi.externalSystem.model.project.*; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.ModuleOrderEntry; -import com.intellij.openapi.roots.OrderEntry; -import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.roots.libraries.LibraryTable; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Consumer; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; - -/** - * IntelliJ Platform code provides a lot of statical bindings to the interested pieces of data. For example we need to execute code - * like below to get list of modules for the target project: - *
- *   ModuleManager.getInstance(project).getModules()
- * 
- * That means that it's not possible to test target classes in isolation if corresponding infrastructure is not set up. - * However, we don't want to set it up if we execute a simple standalone test. - *

- * This interface is intended to encapsulate access to the underlying ide platform functionality. - *

- * Implementations of this interface are expected to be thread-safe. - * - * @author Denis Zhdanov - * @since 1/26/12 11:32 AM - */ -public interface PlatformFacade { - - @NotNull - LibraryTable getProjectLibraryTable(@NotNull Project project); - - @NotNull - Collection getModules(@NotNull Project project); - - @NotNull - Collection getModules(@NotNull Project project, @NotNull ProjectData projectData); - - @NotNull - Collection getOrderEntries(@NotNull Module module); - - /** - * Allows to derive from the given VFS file path that may be compared to the path used by the gradle api. - *

- * Generally, this method is necessary for processing binary library paths - they point to jar files and VFS uses - * '!' marks in their paths internally. - * - * @param file target file - * @return given file's path that may be compared to the one used by the gradle api - */ - @NotNull - String getLocalFileSystemPath(@NotNull VirtualFile file); - - /** - * Creates a module of the specified type at the specified path and adds it to the project - * to which the module manager is related. - * - * - * @param project - * @param filePath the path at which the module is created. - * @param moduleTypeId the ID of the module type to create. - * @return the module instance. - */ - Module newModule(Project project, @NotNull @NonNls String filePath, final String moduleTypeId); - - ModifiableRootModel getModuleModifiableModel(Module module); - - @Nullable - Module findIdeModule(@NotNull ModuleData module, @NotNull Project ideProject); - - @Nullable - Module findIdeModule(@NotNull String ideModuleName, @NotNull Project ideProject); - - @Nullable - Library findIdeLibrary(@NotNull LibraryData libraryData, @NotNull Project ideProject); - - @SuppressWarnings("MethodMayBeStatic") - @Nullable - ModuleOrderEntry findIdeModuleDependency(@NotNull ModuleDependencyData dependency, @NotNull ModifiableRootModel model); - - @Nullable - OrderEntry findIdeModuleOrderEntry(LibraryDependencyData data, Project project); - - void updateModule(@NotNull Module module, @NotNull Consumer task); - - void updateLibraryTable(@NotNull Project project, @NotNull Consumer task); - - void updateLibrary(@NotNull Library library, @NotNull Consumer task); -} diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractProjectDataService.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractProjectDataService.java index 2507d4f79fd4..df3e862d8a07 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractProjectDataService.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractProjectDataService.java @@ -18,7 +18,7 @@ package com.intellij.openapi.externalSystem.service.project.manage; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.Key; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import org.jetbrains.annotations.NotNull; @@ -31,7 +31,7 @@ import java.util.Collections; * @author Vladislav.Soroka * @since 5/5/2015 */ -public abstract class AbstractProjectDataService implements ProjectDataServiceEx { +public abstract class AbstractProjectDataService implements ProjectDataService { public final Computable.PredefinedValueComputable> EMPTY_LIST = new Computable.PredefinedValueComputable>(Collections.emptyList()); @@ -44,8 +44,7 @@ public abstract class AbstractProjectDataService implements ProjectDataSer public void importData(@NotNull Collection> toImport, @Nullable ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { } @NotNull @@ -53,7 +52,7 @@ public abstract class AbstractProjectDataService implements ProjectDataSer public Computable> computeOrphanData(@NotNull Collection> toImport, @NotNull ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade) { + @NotNull IdeModifiableModelsProvider modelsProvider) { return EMPTY_LIST; } @@ -62,23 +61,6 @@ public abstract class AbstractProjectDataService implements ProjectDataSer @NotNull Collection> toIgnore, @NotNull ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { - } - - /** - * @deprecated to be removed in v15 - */ - @Deprecated - @Override - public void importData(@NotNull Collection> toImport, @NotNull Project project, boolean synchronous) { - } - - /** - * @deprecated to be removed in v15 - */ - @Deprecated - @Override - public void removeData(@NotNull Collection toRemove, @NotNull Project project, boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { } } diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataService.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataService.java index c047e168906b..c019045a7dab 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataService.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataService.java @@ -18,9 +18,13 @@ package com.intellij.openapi.externalSystem.service.project.manage; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.Key; +import com.intellij.openapi.externalSystem.model.project.ProjectData; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.Order; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Computable; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -75,9 +79,20 @@ public interface ProjectDataService { * * @param toImport * @param project - * @param synchronous */ - void importData(@NotNull Collection> toImport, @NotNull Project project, boolean synchronous); + void importData(@NotNull Collection> toImport, + @Nullable ProjectData projectData, + @NotNull Project project, + @NotNull IdeModifiableModelsProvider modelsProvider); + + /** + * Compute orphan data. + */ + @NotNull + Computable> computeOrphanData(@NotNull Collection> toImport, + @NotNull ProjectData projectData, + @NotNull Project project, + @NotNull IdeModifiableModelsProvider modelsProvider); /** * Asks to remove all given ide project entities. @@ -88,7 +103,10 @@ public interface ProjectDataService { * * @param toRemove project entities to remove * @param project target project - * @param synchronous flag which defines if entities removal should be synchronous */ - void removeData(@NotNull Collection toRemove, @NotNull Project project, boolean synchronous); + void removeData(@NotNull Computable> toRemove, + @NotNull Collection> toIgnore, + @NotNull ProjectData projectData, + @NotNull Project project, + @NotNull IdeModifiableModelsProvider modelsProvider); } diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceEx.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceEx.java deleted file mode 100644 index 84689e96eab4..000000000000 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceEx.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.openapi.externalSystem.service.project.manage; - -import com.intellij.openapi.externalSystem.model.DataNode; -import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.util.Computable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; - -/** - * @author Vladislav.Soroka - * @since 4/13/2015 - */ -public interface ProjectDataServiceEx extends ProjectDataService { - - void importData(@NotNull Collection> toImport, - @Nullable ProjectData projectData, - @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous); - - @NotNull - Computable> computeOrphanData(@NotNull Collection> toImport, - @NotNull ProjectData projectData, - @NotNull Project project, - @NotNull PlatformFacade platformFacade); - - void removeData(@NotNull Computable> toRemove, - @NotNull Collection> toIgnore, - @NotNull ProjectData projectData, - @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous); -} diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java index df5401bfeaae..ecbec259dd3a 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/settings/AbstractExternalSystemLocalSettings.java @@ -21,11 +21,11 @@ import com.intellij.openapi.externalSystem.model.execution.ExternalTaskExecution import com.intellij.openapi.externalSystem.model.execution.ExternalTaskPojo; import com.intellij.openapi.externalSystem.model.project.ExternalProjectBuildClasspathPojo; import com.intellij.openapi.externalSystem.model.project.ExternalProjectPojo; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.view.ExternalProjectsViewState; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.util.SystemProperties; import com.intellij.util.containers.ContainerUtilRt; @@ -80,15 +80,12 @@ public abstract class AbstractExternalSystemLocalSettings { @NotNull private final ProjectSystemId myExternalSystemId; @NotNull private final Project myProject; - @NotNull private final PlatformFacade myPlatformFacade; protected AbstractExternalSystemLocalSettings(@NotNull ProjectSystemId externalSystemId, - @NotNull Project project, - @NotNull PlatformFacade facade) + @NotNull Project project) { myExternalSystemId = externalSystemId; myProject = project; - myPlatformFacade = facade; } /** @@ -254,7 +251,7 @@ public abstract class AbstractExternalSystemLocalSettings { for (ExternalProjectSettings projectSettings : settings.getLinkedProjectsSettings()) { pathsToForget.remove(projectSettings.getExternalProjectPath()); } - for (Module module : myPlatformFacade.getModules(myProject)) { + for (Module module : ModuleManager.getInstance(myProject).getModules()) { String id = module.getOptionValue(ExternalSystemConstants.EXTERNAL_SYSTEM_ID_KEY); if (!myExternalSystemId.toString().equals(id)) { continue; diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java index 2541aec5dc63..d64ff221715a 100644 --- a/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/util/ExternalSystemApiUtil.java @@ -21,7 +21,6 @@ import com.intellij.openapi.application.Application; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.PathManager; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.ExternalSystemAutoImportAware; import com.intellij.openapi.externalSystem.ExternalSystemManager; @@ -32,13 +31,13 @@ import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.model.settings.ExternalSystemExecutionSettings; import com.intellij.openapi.externalSystem.service.ParametersEnhancer; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.settings.ExternalSystemSettingsListener; import com.intellij.openapi.fileTypes.FileTypes; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.OrderRootType; @@ -501,7 +500,7 @@ public class ExternalSystemApiUtil { } public static void executeProjectChangeAction(@NotNull final DisposeAwareProjectChange task) { - executeProjectChangeAction(false, task); + executeProjectChangeAction(true, task); } public static void executeProjectChangeAction(boolean synchronous, @NotNull final DisposeAwareProjectChange task) { @@ -660,8 +659,7 @@ public class ExternalSystemApiUtil { } externalModulePaths.remove(linkedExternalProjectPath); - PlatformFacade platformFacade = ServiceManager.getService(PlatformFacade.class); - for (Module module : platformFacade.getModules(ideProject)) { + for (Module module : ModuleManager.getInstance(ideProject).getModules()) { String path = getExternalProjectPath(module); if (!StringUtil.isEmpty(path) && !externalModulePaths.remove(path)) { return false; @@ -670,6 +668,8 @@ public class ExternalSystemApiUtil { return externalModulePaths.isEmpty(); } + + public static void storeLastUsedExternalProjectPath(@Nullable String path, @NotNull ProjectSystemId externalSystemId) { if (path != null) { PropertiesComponent.getInstance().setValue(LAST_USED_PROJECT_PATH_PREFIX + externalSystemId.getReadableName(), path); diff --git a/platform/external-system-impl/external-system-impl.iml b/platform/external-system-impl/external-system-impl.iml index 843b483bd11c..e16919a7e633 100644 --- a/platform/external-system-impl/external-system-impl.iml +++ b/platform/external-system-impl/external-system-impl.iml @@ -24,7 +24,7 @@ - + diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java index 04b1dec9c56a..cafd4784df0e 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java @@ -37,7 +37,7 @@ import com.intellij.projectImport.ProjectImportProvider; * @author Denis Zhdanov * @since 6/14/13 1:28 PM */ -public class AttachExternalProjectAction extends AnAction implements DumbAware { +public class AttachExternalProjectAction extends AnAction { public AttachExternalProjectAction() { getTemplatePresentation().setText(ExternalSystemBundle.message("action.attach.external.project.text", "external")); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/DetachExternalProjectAction.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/DetachExternalProjectAction.java index 467f94d299b6..5c4c9d7d75d7 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/DetachExternalProjectAction.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/DetachExternalProjectAction.java @@ -17,20 +17,19 @@ package com.intellij.openapi.externalSystem.action; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.AnActionEvent; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys; import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManager; import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemBundle; import com.intellij.openapi.externalSystem.view.ProjectNode; import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.SystemInfoRt; @@ -44,7 +43,7 @@ import java.util.List; * @author Denis Zhdanov * @since 6/13/13 5:42 PM */ -public class DetachExternalProjectAction extends ExternalSystemNodeAction implements DumbAware { +public class DetachExternalProjectAction extends ExternalSystemNodeAction { public DetachExternalProjectAction() { super(ProjectData.class); @@ -79,9 +78,8 @@ public class DetachExternalProjectAction extends ExternalSystemNodeAction orphanModules = ContainerUtilRt.newArrayList(); - for (Module module : platformFacade.getModules(project)) { + for (Module module : ModuleManager.getInstance(project).getModules()) { if (!ExternalSystemApiUtil.isExternalSystemAwareModule(projectSystemId, module)) continue; String path = ExternalSystemApiUtil.getExternalRootProjectPath(module); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshAllExternalProjectsAction.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshAllExternalProjectsAction.java index 0a7af0ab1d52..31979f1bfc49 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshAllExternalProjectsAction.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshAllExternalProjectsAction.java @@ -27,7 +27,7 @@ import java.util.List; * @author Denis Zhdanov * @since 1/23/12 3:48 PM */ -public class RefreshAllExternalProjectsAction extends AnAction implements DumbAware, AnAction.TransparentUpdate { +public class RefreshAllExternalProjectsAction extends AnAction implements AnAction.TransparentUpdate { public RefreshAllExternalProjectsAction() { getTemplatePresentation().setText(ExternalSystemBundle.message("action.refresh.all.projects.text", "external")); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshExternalProjectAction.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshExternalProjectAction.java index 712f0628ec3c..e5efa029810a 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshExternalProjectAction.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/RefreshExternalProjectAction.java @@ -22,13 +22,13 @@ import org.jetbrains.annotations.NotNull; import java.util.List; /** - * * Forces the ide to retrieve the most up-to-date info about the linked external project and updates project state if necessary + * Forces the ide to retrieve the most up-to-date info about the linked external project and updates project state if necessary * (e.g. imports missing libraries). * * @author Vladislav.Soroka * @since 9/18/13 */ -public class RefreshExternalProjectAction extends ExternalSystemNodeAction implements DumbAware { +public class RefreshExternalProjectAction extends ExternalSystemNodeAction { public RefreshExternalProjectAction() { super(AbstractExternalEntityData.class); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/AbstractIdeModifiableModelsProvider.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/AbstractIdeModifiableModelsProvider.java new file mode 100644 index 000000000000..221be477a335 --- /dev/null +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/AbstractIdeModifiableModelsProvider.java @@ -0,0 +1,428 @@ +/* + * Copyright 2000-2009 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.externalSystem.service.project; + +import com.intellij.facet.Facet; +import com.intellij.facet.FacetModel; +import com.intellij.facet.FacetTypeId; +import com.intellij.facet.ModifiableFacetModel; +import com.intellij.openapi.application.ModalityState; +import com.intellij.openapi.externalSystem.model.project.*; +import com.intellij.openapi.module.ModifiableModuleModel; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.*; +import com.intellij.openapi.roots.ex.ProjectRootManagerEx; +import com.intellij.openapi.roots.impl.ModifiableModelCommitter; +import com.intellij.openapi.roots.impl.ModuleRootManagerImpl; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.libraries.LibraryTable; +import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; +import com.intellij.openapi.roots.ui.configuration.FacetsProvider; +import com.intellij.openapi.roots.ui.configuration.ModulesProvider; +import com.intellij.openapi.util.Condition; +import com.intellij.openapi.util.Disposer; +import com.intellij.openapi.util.text.StringUtil; +import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.packaging.artifacts.ArtifactModel; +import com.intellij.packaging.artifacts.ModifiableArtifactModel; +import com.intellij.packaging.elements.ManifestFileProvider; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.impl.artifacts.DefaultManifestFileProvider; +import com.intellij.util.containers.ContainerUtil; +import gnu.trove.THashMap; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.IdentityHashMap; +import java.util.List; +import java.util.Map; + +import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.*; + +public abstract class AbstractIdeModifiableModelsProvider implements IdeModifiableModelsProvider { + @NotNull + protected final Project myProject; + private ModifiableModuleModel myModifiableModuleModel; + private Map myModifiableRootModels = new THashMap(); + private Map myModifiableFacetModels = new THashMap(); + private Map myModifiableLibraryModels = new IdentityHashMap(); + private ModifiableArtifactModel myModifiableArtifactModel; + private AbstractIdeModifiableModelsProvider.MyPackagingElementResolvingContext myPackagingElementResolvingContext; + private final ArtifactExternalDependenciesImporter myArtifactExternalDependenciesImporter; + + public AbstractIdeModifiableModelsProvider(@NotNull Project project) { + myProject = project; + myArtifactExternalDependenciesImporter = new ArtifactExternalDependenciesImporterImpl(); + } + + protected abstract ModifiableArtifactModel doGetModifiableArtifactModel(); + + protected abstract ModifiableModuleModel doGetModifiableModuleModel(); + + protected abstract ModifiableRootModel doGetModifiableRootModel(Module module); + + protected abstract ModifiableFacetModel doGetModifiableFacetModel(Module module); + + protected abstract Library.ModifiableModel doGetModifiableLibraryModel(Library library); + + @NotNull + @Override + public abstract LibraryTable.ModifiableModel getModifiableProjectLibrariesModel(); + + @NotNull + @Override + public Module[] getModules() { + return myModifiableModuleModel == null ? ModuleManager.getInstance(myProject).getModules() : getModifiableModuleModel().getModules(); + } + + @NotNull + @Override + public Module[] getModules(@NotNull final ProjectData projectData) { + final List modules = ContainerUtil.filter(getModules(), new Condition() { + @Override + public boolean value(Module module) { + return isExternalSystemAwareModule(projectData.getOwner(), module) && + StringUtil.equals(projectData.getLinkedExternalProjectPath(), getExternalRootProjectPath(module)); + } + }); + return ContainerUtil.toArray(modules, new Module[modules.size()]); + } + + protected void processExternalArtifactDependencies() { + myArtifactExternalDependenciesImporter.applyChanges(getModifiableArtifactModel(), getPackagingElementResolvingContext()); + } + + @Override + public PackagingElementResolvingContext getPackagingElementResolvingContext() { + if (myPackagingElementResolvingContext == null) { + myPackagingElementResolvingContext = new MyPackagingElementResolvingContext(); + } + return myPackagingElementResolvingContext; + } + + @NotNull + @Override + public OrderEntry[] getOrderEntries(@NotNull Module module) { + return getRootModel(module, false).getOrderEntries(); + } + + @NotNull + @Override + public Module newModule(@NotNull final String filePath, final String moduleTypeId) { + Module module = getModifiableModuleModel().newModule(filePath, moduleTypeId); + // set module type id explicitly otherwise it can not be set if there is an existing module (with the same filePath) and w/o 'type' attribute + module.setOption(Module.ELEMENT_TYPE, moduleTypeId); + return module; + } + + @Nullable + @Override + public Module findIdeModule(@NotNull ModuleData module) { + final Module ideModule = findIdeModule(module.getInternalName()); + return isExternalSystemAwareModule(module.getOwner(), ideModule) ? ideModule : null; + } + + @Nullable + @Override + public Module findIdeModule(@NotNull String ideModuleName) { + for (Module module : getModules()) { + if (ideModuleName.equals(module.getName())) { + return module; + } + } + return null; + } + + @Nullable + @Override + public Library findIdeLibrary(@NotNull LibraryData libraryData) { + final LibraryTable.ModifiableModel libraryTable = getModifiableProjectLibrariesModel(); + for (Library ideLibrary : libraryTable.getLibraries()) { + if (isRelated(ideLibrary, libraryData)) return ideLibrary; + } + return null; + } + + @Nullable + @Override + public ModuleOrderEntry findIdeModuleDependency(@NotNull ModuleDependencyData dependency, @NotNull Module module) { + for (OrderEntry entry : getRootModel(module, false).getOrderEntries()) { + if (entry instanceof ModuleOrderEntry) { + ModuleOrderEntry candidate = (ModuleOrderEntry)entry; + if (dependency.getInternalName().equals(candidate.getModuleName()) && dependency.getScope().equals(candidate.getScope())) { + return candidate; + } + } + } + return null; + } + + @Nullable + @Override + public OrderEntry findIdeModuleOrderEntry(LibraryDependencyData data) { + Module ownerIdeModule = findIdeModule(data.getOwnerModule()); + if (ownerIdeModule == null) return null; + for (OrderEntry entry : getOrderEntries(ownerIdeModule)) { + if (entry instanceof LibraryOrderEntry) { + if (((LibraryOrderEntry)entry).isModuleLevel() && data.getLevel() != LibraryLevel.MODULE) continue; + } + + if (data.getInternalName().equals(entry.getPresentableName())) { + return entry; + } + } + return null; + } + + @Override + @NotNull + public VirtualFile[] getContentRoots(Module module) { + return getRootModel(module, false).getContentRoots(); + } + + @NotNull + @Override + public ModifiableModuleModel getModifiableModuleModel() { + if (myModifiableModuleModel == null) { + myModifiableModuleModel = doGetModifiableModuleModel(); + } + return myModifiableModuleModel; + } + + @Override + @NotNull + public ModifiableRootModel getModifiableRootModel(Module module) { + return (ModifiableRootModel)getRootModel(module, true); + } + + @NotNull + private ModuleRootModel getRootModel(Module module, boolean modifiableModelNeeded) { + ModifiableRootModel result = myModifiableRootModels.get(module); + if (result == null) { + if (!modifiableModelNeeded) return ModuleRootManager.getInstance(module); + result = doGetModifiableRootModel(module); + myModifiableRootModels.put(module, result); + } + return result; + } + + @Override + @NotNull + public ModifiableFacetModel getModifiableFacetModel(Module module) { + ModifiableFacetModel result = myModifiableFacetModels.get(module); + if (result == null) { + result = doGetModifiableFacetModel(module); + myModifiableFacetModels.put(module, result); + } + return result; + } + + @Override + @NotNull + public ModifiableArtifactModel getModifiableArtifactModel() { + if (myModifiableArtifactModel == null) { + myModifiableArtifactModel = doGetModifiableArtifactModel(); + } + return myModifiableArtifactModel; + } + + @Override + @NotNull + public Library[] getAllLibraries() { + return getModifiableProjectLibrariesModel().getLibraries(); + } + + @Override + @Nullable + public Library getLibraryByName(String name) { + return getModifiableProjectLibrariesModel().getLibraryByName(name); + } + + @Override + public Library createLibrary(String name) { + return getModifiableProjectLibrariesModel().createLibrary(name); + } + + @Override + public void removeLibrary(Library library) { + getModifiableProjectLibrariesModel().removeLibrary(library); + } + + @Override + public Library.ModifiableModel getModifiableLibraryModel(Library library) { + Library.ModifiableModel result = myModifiableLibraryModels.get(library); + if (result == null) { + result = doGetModifiableLibraryModel(library); + myModifiableLibraryModels.put(library, result); + } + return result; + } + + @NotNull + @Override + public String[] getLibraryUrls(@NotNull Library library, @NotNull OrderRootType type) { + final Library.ModifiableModel model = myModifiableLibraryModels.get(library); + if (model != null) { + return model.getUrls(type); + } + return library.getUrls(type); + } + + @Override + public ModalityState getModalityStateForQuestionDialogs() { + return ModalityState.NON_MODAL; + } + + @Override + public ArtifactExternalDependenciesImporter getArtifactExternalDependenciesImporter() { + return myArtifactExternalDependenciesImporter; + } + + private class MyPackagingElementResolvingContext implements PackagingElementResolvingContext { + private final ModulesProvider myModulesProvider = new MyModulesProvider(); + private final MyFacetsProvider myFacetsProvider = new MyFacetsProvider(); + private final ManifestFileProvider myManifestFileProvider = new DefaultManifestFileProvider(this); + + @NotNull + public Project getProject() { + return myProject; + } + + @NotNull + public ArtifactModel getArtifactModel() { + return AbstractIdeModifiableModelsProvider.this.getModifiableArtifactModel(); + } + + @NotNull + public ModulesProvider getModulesProvider() { + return myModulesProvider; + } + + @NotNull + public FacetsProvider getFacetsProvider() { + return myFacetsProvider; + } + + public Library findLibrary(@NotNull String level, @NotNull String libraryName) { + if (level.equals(LibraryTablesRegistrar.PROJECT_LEVEL)) { + return getLibraryByName(libraryName); + } + final LibraryTable table = LibraryTablesRegistrar.getInstance().getLibraryTableByLevel(level, myProject); + return table != null ? table.getLibraryByName(libraryName) : null; + } + + @NotNull + @Override + public ManifestFileProvider getManifestFileProvider() { + return myManifestFileProvider; + } + } + + private class MyModulesProvider implements ModulesProvider { + @NotNull + public Module[] getModules() { + return AbstractIdeModifiableModelsProvider.this.getModules(); + } + + public Module getModule(String name) { + return AbstractIdeModifiableModelsProvider.this.findIdeModule(name); + } + + public ModuleRootModel getRootModel(@NotNull Module module) { + return AbstractIdeModifiableModelsProvider.this.getModifiableRootModel(module); + } + + public FacetModel getFacetModel(@NotNull Module module) { + return AbstractIdeModifiableModelsProvider.this.getModifiableFacetModel(module); + } + } + + private class MyFacetsProvider implements FacetsProvider { + @NotNull + public Facet[] getAllFacets(Module module) { + return getModifiableFacetModel(module).getAllFacets(); + } + + @NotNull + public Collection getFacetsByType(Module module, FacetTypeId type) { + return getModifiableFacetModel(module).getFacetsByType(type); + } + + public F findFacet(Module module, FacetTypeId type, String name) { + return getModifiableFacetModel(module).findFacet(type, name); + } + } + + @Override + public void commit() { + ((ProjectRootManagerEx)ProjectRootManager.getInstance(myProject)).mergeRootsChangesDuring(new Runnable() { + public void run() { + processExternalArtifactDependencies(); + for (Library.ModifiableModel each : myModifiableLibraryModels.values()) { + each.commit(); + } + getModifiableProjectLibrariesModel().commit(); + + Collection rootModels = myModifiableRootModels.values(); + ModifiableRootModel[] rootModels1 = rootModels.toArray(new ModifiableRootModel[rootModels.size()]); + for (ModifiableRootModel model : rootModels1) { + assert !model.isDisposed() : "Already disposed: " + model; + } + + if (myModifiableModuleModel != null) { + ModifiableModelCommitter.multiCommit(rootModels1, myModifiableModuleModel); + } else { + for (ModifiableRootModel model : rootModels1) { + model.commit(); + } + } + + for (Map.Entry each : myModifiableFacetModels.entrySet()) { + if(!each.getKey().isDisposed()) { + each.getValue().commit(); + } + } + if (myModifiableArtifactModel != null) { + myModifiableArtifactModel.commit(); + } + } + }); + } + + @Override + public void dispose() { + for (ModifiableRootModel each : myModifiableRootModels.values()) { + if (each.isDisposed()) continue; + each.dispose(); + } + + for (Library.ModifiableModel each : myModifiableLibraryModels.values()) { + Disposer.dispose(each); + } + + myModifiableModuleModel.dispose(); + if (myModifiableArtifactModel != null) { + myModifiableArtifactModel.dispose(); + } + + myModifiableRootModels.clear(); + myModifiableFacetModels.clear(); + myModifiableLibraryModels.clear(); + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java similarity index 95% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java rename to platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java index 1c207437ab28..6e3324f1beaa 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/ArtifactExternalDependenciesImporter.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.importing; +package com.intellij.openapi.externalSystem.service.project; import com.intellij.openapi.roots.ui.configuration.artifacts.ManifestFilesInfo; import com.intellij.openapi.util.Pair; @@ -39,16 +39,18 @@ import java.util.Map; /** * @author nik */ -public class ArtifactExternalDependenciesImporter { +public class ArtifactExternalDependenciesImporterImpl implements ArtifactExternalDependenciesImporter { private final ManifestFilesInfo myManifestFiles = new ManifestFilesInfo(); private final Map>> myExternalDependencies = new HashMap>>(); @Nullable + @Override public ManifestFileConfiguration getManifestFile(@NotNull Artifact artifact, @NotNull PackagingElementResolvingContext context) { return myManifestFiles.getManifestFile(artifact.getRootElement(), artifact.getArtifactType(), context); } + @Override public List> getExternalDependenciesList(@NotNull Artifact artifact) { List> elements = myExternalDependencies.get(artifact); if (elements == null) { @@ -58,6 +60,7 @@ public class ArtifactExternalDependenciesImporter { return elements; } + @Override public void applyChanges(ModifiableArtifactModel artifactModel, final PackagingElementResolvingContext context) { myManifestFiles.saveManifestFiles(); final List, List>>> elementsToInclude = diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java new file mode 100644 index 000000000000..3094999cad06 --- /dev/null +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeModifiableModelsProviderImpl.java @@ -0,0 +1,90 @@ +/* + * Copyright 2000-2015 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.intellij.openapi.externalSystem.service.project; + +import com.intellij.facet.FacetManager; +import com.intellij.facet.ModifiableFacetModel; +import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.module.ModifiableModuleModel; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.module.ModuleManager; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModifiableRootModel; +import com.intellij.openapi.roots.ModuleRootManager; +import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; +import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.libraries.LibraryTable; +import com.intellij.openapi.util.Computable; +import com.intellij.packaging.artifacts.ArtifactManager; +import com.intellij.packaging.artifacts.ModifiableArtifactModel; +import org.jetbrains.annotations.NotNull; + +public class IdeModifiableModelsProviderImpl extends AbstractIdeModifiableModelsProvider { + + private final LibraryTable.ModifiableModel myLibrariesModel; + + public IdeModifiableModelsProviderImpl(Project project) { + super(project); + myLibrariesModel = ProjectLibraryTable.getInstance(myProject).getModifiableModel(); + } + + @NotNull + @Override + public LibraryTable.ModifiableModel getModifiableProjectLibrariesModel() { + return myLibrariesModel; + } + + @Override + protected ModifiableArtifactModel doGetModifiableArtifactModel() { + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public ModifiableArtifactModel compute() { + return ArtifactManager.getInstance(myProject).createModifiableModel(); + } + }); + } + + @Override + protected ModifiableModuleModel doGetModifiableModuleModel() { + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public ModifiableModuleModel compute() { + return ModuleManager.getInstance(myProject).getModifiableModel(); + } + }); + } + + @Override + @NotNull + protected ModifiableRootModel doGetModifiableRootModel(@NotNull final Module module) { + return ApplicationManager.getApplication().runReadAction(new Computable() { + @Override + public ModifiableRootModel compute() { + return ModuleRootManager.getInstance(module).getModifiableModel(); + } + }); + } + + @Override + protected ModifiableFacetModel doGetModifiableFacetModel(Module module) { + return FacetManager.getInstance(module).createModifiableModel(); + } + + @Override + protected Library.ModifiableModel doGetModifiableLibraryModel(Library library) { + return library.getModifiableModel(); + } +} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenUIModifiableModelsProvider.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java similarity index 67% rename from plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenUIModifiableModelsProvider.java rename to platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java index a35f2f6fecfa..9f01240fa204 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenUIModifiableModelsProvider.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package org.jetbrains.idea.maven.importing; +package com.intellij.openapi.externalSystem.service.project; import com.intellij.facet.ModifiableFacetModel; import com.intellij.openapi.application.ModalityState; @@ -27,18 +27,18 @@ import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator; import com.intellij.openapi.roots.ui.configuration.projectRoot.LibrariesModifiableModel; import com.intellij.openapi.roots.ui.configuration.projectRoot.ProjectLibrariesConfigurable; import com.intellij.packaging.artifacts.ModifiableArtifactModel; -import org.jetbrains.idea.maven.utils.MavenUtil; +import org.jetbrains.annotations.NotNull; -public class MavenUIModifiableModelsProvider extends MavenBaseModifiableModelsProvider { +public class IdeUIModifiableModelsProvider extends AbstractIdeModifiableModelsProvider { private final ModifiableModuleModel myModel; private final ModulesConfigurator myModulesConfigurator; private final ModifiableArtifactModel myModifiableArtifactModel; private final LibrariesModifiableModel myLibrariesModel; - public MavenUIModifiableModelsProvider(Project project, - ModifiableModuleModel model, - ModulesConfigurator modulesConfigurator, - ModifiableArtifactModel modifiableArtifactModel) { + public IdeUIModifiableModelsProvider(Project project, + ModifiableModuleModel model, + ModulesConfigurator modulesConfigurator, + ModifiableArtifactModel modifiableArtifactModel) { super(project); myModel = model; myModulesConfigurator = modulesConfigurator; @@ -48,49 +48,34 @@ public class MavenUIModifiableModelsProvider extends MavenBaseModifiableModelsPr myLibrariesModel = configurable.getModelProvider().getModifiableModel(); } + @NotNull @Override - protected ModifiableArtifactModel doGetArtifactModel() { + public LibraryTable.ModifiableModel getModifiableProjectLibrariesModel() { + return myLibrariesModel; + } + + @Override + protected ModifiableArtifactModel doGetModifiableArtifactModel() { return myModifiableArtifactModel; } @Override - protected ModifiableModuleModel doGetModuleModel() { + protected ModifiableModuleModel doGetModifiableModuleModel() { return myModel; } @Override - protected ModifiableRootModel doGetRootModel(Module module) { + protected ModifiableRootModel doGetModifiableRootModel(Module module) { return myModulesConfigurator.getOrCreateModuleEditor(module).getModifiableRootModel(); } @Override - protected ModifiableFacetModel doGetFacetModel(Module module) { + protected ModifiableFacetModel doGetModifiableFacetModel(Module module) { return (ModifiableFacetModel)myModulesConfigurator.getFacetModel(module); } @Override - public LibraryTable.ModifiableModel getProjectLibrariesModel() { - return myLibrariesModel; - } - - public Library[] getAllLibraries() { - return myLibrariesModel.getLibraries(); - } - - public Library getLibraryByName(String name) { - return myLibrariesModel.getLibraryByName(name); - } - - public Library createLibrary(String name) { - return myLibrariesModel.createLibrary(name); - } - - public void removeLibrary(Library library) { - myLibrariesModel.removeLibrary(library); - } - - @Override - protected Library.ModifiableModel doGetLibraryModel(Library library) { + protected Library.ModifiableModel doGetModifiableLibraryModel(Library library) { return myLibrariesModel.getLibraryModifiableModel(library); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java deleted file mode 100644 index f9754f6df718..000000000000 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/PlatformFacadeImpl.java +++ /dev/null @@ -1,250 +0,0 @@ -package com.intellij.openapi.externalSystem.service.project; - -import com.intellij.openapi.application.ApplicationManager; -import com.intellij.openapi.externalSystem.model.project.*; -import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; -import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.roots.libraries.LibraryTable; -import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar; -import com.intellij.openapi.util.Computable; -import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Disposer; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.Consumer; -import com.intellij.util.ExceptionUtil; -import com.intellij.util.containers.ContainerUtil; -import org.jetbrains.annotations.NonNls; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.Collection; - -import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.*; - -/** - * @author Denis Zhdanov - * @since 1/26/12 11:54 AM - */ -public class PlatformFacadeImpl implements PlatformFacade { - - @NotNull - @Override - public LibraryTable getProjectLibraryTable(@NotNull Project project) { - return LibraryTablesRegistrar.getInstance().getLibraryTable(project); - } - - @NotNull - @Override - public Collection getModules(@NotNull Project project) { - return Arrays.asList(ModuleManager.getInstance(project).getModules()); - } - - @NotNull - @Override - public Collection getModules(@NotNull Project project, @NotNull final ProjectData projectData) { - return ContainerUtil.filter(getModules(project), new Condition() { - @Override - public boolean value(Module module) { - return isExternalSystemAwareModule(projectData.getOwner(), module) && - StringUtil.equals(projectData.getLinkedExternalProjectPath(), getExternalRootProjectPath(module)); - } - }); - } - - @NotNull - @Override - public Collection getOrderEntries(@NotNull Module module) { - return Arrays.asList(ModuleRootManager.getInstance(module).getOrderEntries()); - } - - @NotNull - @Override - public String getLocalFileSystemPath(@NotNull VirtualFile file) { - return ExternalSystemApiUtil.getLocalFileSystemPath(file); - } - - @Override - public Module newModule(Project project, @NotNull @NonNls final String filePath, final String moduleTypeId) { - final ModuleManager moduleManager = ModuleManager.getInstance(project); - Module module = doWriteAction(new Computable() { - @Override - public Module compute() { - return moduleManager.newModule(filePath, moduleTypeId); - } - }); - // set module type id explicitly otherwise it can not be set if there is an existing module (with the same filePath) and w/o 'type' attribute - module.setOption(Module.ELEMENT_TYPE, moduleTypeId); - return module; - } - - @Override - public ModifiableRootModel getModuleModifiableModel(Module module) { - final ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module); - return ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public ModifiableRootModel compute() { - return moduleRootManager.getModifiableModel(); - } - }); - } - - @Nullable - @Override - public Module findIdeModule(@NotNull ModuleData module, @NotNull Project ideProject) { - final Module ideModule = findIdeModule(module.getInternalName(), ideProject); - return isExternalSystemAwareModule(module.getOwner(), ideModule) ? ideModule : null; - } - - @Nullable - @Override - public Module findIdeModule(@NotNull String ideModuleName, @NotNull Project ideProject) { - for (Module module : getModules(ideProject)) { - if (ideModuleName.equals(module.getName())) { - return module; - } - } - return null; - } - - @Nullable - @Override - public Library findIdeLibrary(@NotNull final LibraryData libraryData, @NotNull Project ideProject) { - final LibraryTable libraryTable = getProjectLibraryTable(ideProject); - for (Library ideLibrary : libraryTable.getLibraries()) { - if (isRelated(ideLibrary, libraryData)) return ideLibrary; - } - return null; - } - - public boolean isOrphanProjectLibrary(@NotNull final Library library, - @NotNull final Iterable ideModules) { - RootPolicy visitor = new RootPolicy() { - @Override - public Boolean visitLibraryOrderEntry(LibraryOrderEntry ideDependency, Boolean value) { - return !ideDependency.isModuleLevel() && library == ideDependency.getLibrary(); - } - }; - for (Module module : ideModules) { - for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { - if (entry.accept(visitor, false)) return false; - } - } - return true; - } - - @SuppressWarnings("MethodMayBeStatic") - @Nullable - @Override - public ModuleOrderEntry findIdeModuleDependency(@NotNull ModuleDependencyData dependency, @NotNull ModifiableRootModel model) { - for (OrderEntry entry : model.getOrderEntries()) { - if (entry instanceof ModuleOrderEntry) { - ModuleOrderEntry candidate = (ModuleOrderEntry)entry; - if (dependency.getInternalName().equals(candidate.getModuleName()) && - dependency.getScope().equals(candidate.getScope())) { - return candidate; - } - } - } - return null; - } - - @Nullable - @Override - public OrderEntry findIdeModuleOrderEntry(LibraryDependencyData data, Project project) { - Module ownerIdeModule = findIdeModule(data.getOwnerModule(), project); - if (ownerIdeModule == null) return null; - - ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(ownerIdeModule); - - for (OrderEntry entry : moduleRootManager.getOrderEntries()) { - if (entry instanceof LibraryOrderEntry) { - if (((LibraryOrderEntry)entry).isModuleLevel() && data.getLevel() != LibraryLevel.MODULE) continue; - } - - if (data.getInternalName().equals(entry.getPresentableName())) { - return entry; - } - } - return null; - } - - @Override - public void updateModule(@NotNull final Module module, @NotNull Consumer task) { - final ModifiableModelsProvider modifiableModelsProvider = ModifiableModelsProvider.SERVICE.getInstance(); - final ModifiableRootModel modifiableRootModel = - ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public ModifiableRootModel compute() { - return modifiableModelsProvider.getModuleModifiableModel(module); - } - }); - try { - task.consume(modifiableRootModel); - if (modifiableRootModel.isChanged()) { - doWriteAction(new Runnable() { - @Override - public void run() { - modifiableModelsProvider.commitModuleModifiableModel(modifiableRootModel); - } - }); - } - else { - modifiableRootModel.dispose(); - } - } - catch (Throwable t) { - modifiableModelsProvider.disposeModuleModifiableModel(modifiableRootModel); - ExceptionUtil.rethrowAllAsUnchecked(t); - } - } - - @Override - public void updateLibraryTable(@NotNull final Project project, @NotNull Consumer task) { - final ModifiableModelsProvider modifiableModelsProvider = ModifiableModelsProvider.SERVICE.getInstance(); - final LibraryTable.ModifiableModel modifiableModel = - ApplicationManager.getApplication().runReadAction(new Computable() { - @Override - public LibraryTable.ModifiableModel compute() { - return modifiableModelsProvider.getLibraryTableModifiableModel(project); - } - }); - task.consume(modifiableModel); - if (modifiableModel.isChanged()) { - doWriteAction(new Runnable() { - @Override - public void run() { - modifiableModel.commit(); - } - }); - } - } - - @Override - public void updateLibrary(@NotNull final Library library, @NotNull Consumer task) { - final Library.ModifiableModel modifiableModel = library.getModifiableModel(); - try { - task.consume(modifiableModel); - if (modifiableModel.isChanged()) { - doWriteAction(new Runnable() { - @Override - public void run() { - modifiableModel.commit(); - } - }); - } - else { - Disposer.dispose(modifiableModel); - } - } - catch (Throwable t) { - Disposer.dispose(modifiableModel); - ExceptionUtil.rethrowAllAsUnchecked(t); - } - } -} diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ProjectStructureHelper.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ProjectStructureHelper.java deleted file mode 100644 index 3ba4ffbd5bb4..000000000000 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ProjectStructureHelper.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.intellij.openapi.externalSystem.service.project; - -import com.intellij.openapi.externalSystem.model.project.LibraryData; -import com.intellij.openapi.externalSystem.model.project.LibraryDependencyData; -import com.intellij.openapi.externalSystem.model.project.ModuleData; -import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.*; -import com.intellij.openapi.roots.libraries.Library; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -/** - * Thread-safe. - * - * @author Denis Zhdanov - * @since 2/6/12 3:28 PM - */ -public class ProjectStructureHelper { - - @NotNull private final PlatformFacade myFacade; - - public ProjectStructureHelper(@NotNull PlatformFacade facade) { - myFacade = facade; - } - - @Nullable - public Module findIdeModule(@NotNull ModuleData module, @NotNull Project ideProject) { - return myFacade.findIdeModule(module, ideProject); - } - - @Nullable - public Module findIdeModule(@NotNull String ideModuleName, @NotNull Project ideProject) { - return myFacade.findIdeModule(ideModuleName, ideProject); - } - - @Nullable - public Library findIdeLibrary(@NotNull final LibraryData libraryData, @NotNull Project ideProject) { - return myFacade.findIdeLibrary(libraryData, ideProject); - } - - public static boolean isOrphanProjectLibrary(@NotNull final Library library, - @NotNull final Iterable ideModules) { - RootPolicy visitor = new RootPolicy() { - @Override - public Boolean visitLibraryOrderEntry(LibraryOrderEntry ideDependency, Boolean value) { - return !ideDependency.isModuleLevel() && library == ideDependency.getLibrary(); - } - }; - for (Module module : ideModules) { - for (OrderEntry entry : ModuleRootManager.getInstance(module).getOrderEntries()) { - if (entry.accept(visitor, false)) return false; - } - } - return true; - } - - @SuppressWarnings("MethodMayBeStatic") - @Nullable - public ModuleOrderEntry findIdeModuleDependency(@NotNull ModuleDependencyData dependency, @NotNull ModifiableRootModel model) { - return myFacade.findIdeModuleDependency(dependency, model); - } - - @Nullable - public OrderEntry findIdeModuleOrderEntry(LibraryDependencyData data, Project project) { - return myFacade.findIdeModuleOrderEntry(data, project); - } -} diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java index 9954fea22cb9..d47728543672 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/AbstractDependencyDataService.java @@ -18,8 +18,7 @@ package com.intellij.openapi.externalSystem.service.project.manage; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.project.AbstractDependencyData; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; -import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.Order; import com.intellij.openapi.module.Module; @@ -28,7 +27,6 @@ import com.intellij.openapi.roots.ExportableOrderEntry; import com.intellij.openapi.roots.ModifiableRootModel; import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.util.Computable; -import com.intellij.util.ExceptionUtil; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.containers.MultiMap; @@ -50,7 +48,7 @@ public abstract class AbstractDependencyDataService> computeOrphanData(@NotNull final Collection> toImport, @NotNull final ProjectData projectData, @NotNull final Project project, - @NotNull final PlatformFacade platformFacade) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { return new Computable>() { @Override public Collection compute() { @@ -61,10 +59,12 @@ public abstract class AbstractDependencyDataService orphanEntries = ContainerUtil.newSmartList(); - for (Module module : platformFacade.getModules(project, projectData)) { - for (OrderEntry entry : platformFacade.getOrderEntries(module)) { + for (Module module : modelsProvider.getModules(projectData)) { + for (OrderEntry entry : modelsProvider.getOrderEntries(module)) { + //noinspection unchecked if (getOrderEntryType().isInstance(entry) && !byModuleName.get(entry.getOwnerModule().getName()).contains(getOrderEntryName((I)entry))) { + //noinspection unchecked orphanEntries.add((I)entry); } } @@ -87,23 +87,10 @@ public abstract class AbstractDependencyDataService> toIgnore, @NotNull ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { - List models = ContainerUtilRt.newArrayList(); - try { - Map> byModule = groupByModule(toRemoveComputable.compute()); - for (Map.Entry> entry : byModule.entrySet()) { - Module module = entry.getKey(); - Collection depsToRemove = entry.getValue(); - ModifiableRootModel model = platformFacade.getModuleModifiableModel(module); - removeData(depsToRemove, model); - models.add(model); - } - ExternalSystemApiUtil.commitModels(synchronous, project, models); - } - catch (Throwable t) { - ExternalSystemApiUtil.disposeModels(models); - ExceptionUtil.rethrowAllAsUnchecked(t); + @NotNull IdeModifiableModelsProvider modelsProvider) { + Map> byModule = groupByModule(toRemoveComputable.compute()); + for (Map.Entry> entry : byModule.entrySet()) { + removeData(entry.getValue(), entry.getKey(), modelsProvider); } } @@ -121,22 +108,27 @@ public abstract class AbstractDependencyDataService toRemove, - @NotNull ModifiableRootModel moduleRootModel) { - for (ExportableOrderEntry dependency : toRemove) { + @NotNull Module module, + @NotNull IdeModifiableModelsProvider modelsProvider) { + if (toRemove.isEmpty()) { + return; + } + final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module); + for (final ExportableOrderEntry dependency : toRemove) { // The thing is that intellij created order entry objects every time new modifiable model is created, // that's why we can't use target dependency object as is but need to get a reference to the current // entry object from the model instead. - for (OrderEntry entry : moduleRootModel.getOrderEntries()) { + for (OrderEntry entry : modifiableRootModel.getOrderEntries()) { if (entry instanceof ExportableOrderEntry) { ExportableOrderEntry orderEntry = (ExportableOrderEntry)entry; if (orderEntry.getPresentableName().equals(dependency.getPresentableName()) && orderEntry.getScope().equals(dependency.getScope())) { - moduleRootModel.removeOrderEntry(entry); + modifiableRootModel.removeOrderEntry(entry); break; } } else if (entry.getPresentableName().equals(dependency.getPresentableName())) { - moduleRootModel.removeOrderEntry(entry); + modifiableRootModel.removeOrderEntry(entry); break; } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java index abb013009b46..3dab3141671d 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ContentRootDataService.java @@ -25,7 +25,7 @@ import com.intellij.openapi.externalSystem.model.project.ContentRootData.SourceR import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; @@ -42,7 +42,6 @@ import com.intellij.openapi.vcs.changes.ChangeListManager; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ExceptionUtil; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; @@ -59,8 +58,6 @@ import java.util.List; import java.util.Map; /** - * Thread-safe. - * * @author Denis Zhdanov * @since 2/7/12 3:20 PM */ @@ -79,42 +76,32 @@ public class ContentRootDataService extends AbstractProjectDataService> toImport, @Nullable ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { if (toImport.isEmpty()) { return; } - List models = ContainerUtilRt.newArrayList(); - try { - MultiMap, DataNode> byModule = ExternalSystemApiUtil.groupBy(toImport, ProjectKeys.MODULE); - for (Map.Entry, Collection>> entry : byModule.entrySet()) { - Module module = platformFacade.findIdeModule(entry.getKey().getData(), project); - if (module == null) { - LOG.warn(String.format( - "Can't import content roots. Reason: target module (%s) is not found at the ide. Content roots: %s", - entry.getKey(), entry.getValue() - )); - continue; - } - models.add(importData(entry.getValue(), module, platformFacade)); + MultiMap, DataNode> byModule = ExternalSystemApiUtil.groupBy(toImport, ProjectKeys.MODULE); + for (Map.Entry, Collection>> entry : byModule.entrySet()) { + Module module = modelsProvider.findIdeModule(entry.getKey().getData()); + if (module == null) { + LOG.warn(String.format( + "Can't import content roots. Reason: target module (%s) is not found at the ide. Content roots: %s", + entry.getKey(), entry.getValue() + )); + continue; } - ExternalSystemApiUtil.commitModels(synchronous, project, models); - } - catch (Throwable t) { - ExternalSystemApiUtil.disposeModels(models); - ExceptionUtil.rethrowAllAsUnchecked(t); + importData(modelsProvider, entry.getValue(), module); } } - @NotNull - private static ModifiableRootModel importData(@NotNull Collection> data, - @NotNull Module module, - @NotNull PlatformFacade platformFacade) { - ModifiableRootModel model = platformFacade.getModuleModifiableModel(module); - ContentEntry[] contentEntries = model.getContentEntries(); - Map contentEntriesMap = ContainerUtilRt.newHashMap(); - for(ContentEntry contentEntry : contentEntries) { + private static void importData(@NotNull IdeModifiableModelsProvider modelsProvider, + @NotNull final Collection> data, + @NotNull final Module module) { + final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module); + final ContentEntry[] contentEntries = modifiableRootModel.getContentEntries(); + final Map contentEntriesMap = ContainerUtilRt.newHashMap(); + for (ContentEntry contentEntry : contentEntries) { contentEntriesMap.put(contentEntry.getUrl(), contentEntry); } @@ -131,40 +118,45 @@ public class ContentRootDataService extends AbstractProjectDataService node : data) { - ContentRootData contentRoot = node.getData(); + for (final DataNode node : data) { + final ContentRootData contentRoot = node.getData(); - ContentEntry contentEntry = findOrCreateContentRoot(model, contentRoot.getRootPath()); + final ContentEntry contentEntry = findOrCreateContentRoot(modifiableRootModel, contentRoot.getRootPath()); contentEntry.clearExcludeFolders(); contentEntry.clearSourceFolders(); LOG.debug(String.format("Importing content root '%s' for module '%s'", contentRoot.getRootPath(), module.getName())); for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.SOURCE)) { - createSourceRootIfAbsent(contentEntry, path, module.getName(), JavaSourceRootType.SOURCE, false, createEmptyContentRootDirectories); + createSourceRootIfAbsent( + contentEntry, path, module.getName(), JavaSourceRootType.SOURCE, false, createEmptyContentRootDirectories); } for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.TEST)) { - createSourceRootIfAbsent(contentEntry, path, module.getName(), JavaSourceRootType.TEST_SOURCE, false, createEmptyContentRootDirectories); + createSourceRootIfAbsent( + contentEntry, path, module.getName(), JavaSourceRootType.TEST_SOURCE, false, createEmptyContentRootDirectories); } for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.RESOURCE)) { - createSourceRootIfAbsent(contentEntry, path, module.getName(), JavaResourceRootType.RESOURCE, false, createEmptyContentRootDirectories); + createSourceRootIfAbsent( + contentEntry, path, module.getName(), JavaResourceRootType.RESOURCE, false, createEmptyContentRootDirectories); } for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.TEST_RESOURCE)) { - createSourceRootIfAbsent(contentEntry, path, module.getName(), JavaResourceRootType.TEST_RESOURCE, false, createEmptyContentRootDirectories); + createSourceRootIfAbsent( + contentEntry, path, module.getName(), JavaResourceRootType.TEST_RESOURCE, false, createEmptyContentRootDirectories); } for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.SOURCE_GENERATED)) { - createSourceRootIfAbsent(contentEntry, path, module.getName(), JavaSourceRootType.SOURCE, true, createEmptyContentRootDirectories); + createSourceRootIfAbsent( + contentEntry, path, module.getName(), JavaSourceRootType.SOURCE, true, createEmptyContentRootDirectories); } for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.TEST_GENERATED)) { - createSourceRootIfAbsent(contentEntry, path, module.getName(), JavaSourceRootType.TEST_SOURCE, true, createEmptyContentRootDirectories); + createSourceRootIfAbsent( + contentEntry, path, module.getName(), JavaSourceRootType.TEST_SOURCE, true, createEmptyContentRootDirectories); } for (SourceRoot path : contentRoot.getPaths(ExternalSystemSourceType.EXCLUDED)) { createExcludedRootIfAbsent(contentEntry, path, module.getName(), module.getProject()); } contentEntriesMap.remove(contentEntry.getUrl()); } - for(ContentEntry contentEntry : contentEntriesMap.values()) { - model.removeContentEntry(contentEntry); + for (ContentEntry contentEntry : contentEntriesMap.values()) { + modifiableRootModel.removeContentEntry(contentEntry); } - return model; } @NotNull @@ -185,7 +177,7 @@ public class ContentRootDataService extends AbstractProjectDataService sourceRootType, boolean generated, boolean createEmptyContentRootDirectories) { List folders = entry.getSourceFolders(sourceRootType); for (SourceFolder folder : folders) { VirtualFile file = folder.getFile(); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java index c6adf0be167a..84cd012fa27b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDataService.java @@ -9,13 +9,17 @@ import com.intellij.openapi.externalSystem.model.project.LibraryData; import com.intellij.openapi.externalSystem.model.project.LibraryPathType; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.service.project.ExternalLibraryPathTypeMapper; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; import com.intellij.openapi.externalSystem.util.Order; +import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.LibraryOrderEntry; +import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.roots.OrderRootType; +import com.intellij.openapi.roots.RootPolicy; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.util.Computable; @@ -23,7 +27,6 @@ import com.intellij.openapi.vfs.JarFileSystem; import com.intellij.openapi.vfs.VfsUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.ArrayUtil; -import com.intellij.util.Consumer; import com.intellij.util.NotNullFunction; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtilRt; @@ -31,10 +34,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; -import java.util.Collection; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; /** * @author Denis Zhdanov @@ -68,25 +68,22 @@ public class LibraryDataService extends AbstractProjectDataService> toImport, @Nullable final ProjectData projectData, @NotNull final Project project, - @NotNull final PlatformFacade platformFacade, - final boolean synchronous) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { for (DataNode dataNode : toImport) { - importLibrary(dataNode.getData(), project, platformFacade, synchronous); + importLibrary(dataNode.getData(), modelsProvider); } } - private void importLibrary(@NotNull final LibraryData toImport, - @NotNull final Project project, - @NotNull final PlatformFacade platformFacade, - boolean synchronous) { + private void importLibrary(@NotNull final LibraryData toImport, @NotNull final IdeModifiableModelsProvider modelsProvider) { Map> libraryFiles = prepareLibraryFiles(toImport); - Library library = platformFacade.findIdeLibrary(toImport, project); + final String libraryName = toImport.getInternalName(); + Library library = modelsProvider.getLibraryByName(libraryName); if (library != null) { - syncPaths(toImport, library, platformFacade); + syncPaths(toImport, library, modelsProvider); return; } - importLibrary(toImport.getInternalName(), libraryFiles, project, platformFacade); + importLibrary(libraryName, libraryFiles, modelsProvider); } @NotNull @@ -104,22 +101,10 @@ public class LibraryDataService extends AbstractProjectDataService> libraryFiles, - @NotNull final Project project, - @NotNull final PlatformFacade platformFacade) - { - final Library[] intellijLibrary = new Library[1]; - platformFacade.updateLibraryTable(project, new Consumer() { - @Override - public void consume(LibraryTable.ModifiableModel model) { - intellijLibrary[0] = model.createLibrary(libraryName); - } - }); - platformFacade.updateLibrary(intellijLibrary[0], new Consumer() { - @Override - public void consume(Library.ModifiableModel libraryModel) { - registerPaths(libraryFiles, libraryModel, libraryName); - } - }); + @NotNull final IdeModifiableModelsProvider modelsProvider) { + final Library library = modelsProvider.createLibrary(libraryName); + final Library.ModifiableModel libraryModel = modelsProvider.getModifiableLibraryModel(library); + registerPaths(libraryFiles, libraryModel, libraryName); } @SuppressWarnings("MethodMayBeStatic") @@ -170,36 +155,54 @@ public class LibraryDataService extends AbstractProjectDataService> computeOrphanData(@NotNull Collection> toImport, + @NotNull final ProjectData projectData, + @NotNull Project project, + @NotNull final IdeModifiableModelsProvider modelsProvider) { + return new Computable>() { + @Override + public Collection compute() { + final List orphanIdeLibraries = ContainerUtil.newSmartList(); + final LibraryTable.ModifiableModel librariesModel = modelsProvider.getModifiableProjectLibrariesModel(); + for (Library library : librariesModel.getLibraries()) { + if (!ExternalSystemApiUtil.isExternalSystemLibrary(library, projectData.getOwner())) continue; + if (isOrphanProjectLibrary(library, modelsProvider)) { + orphanIdeLibraries.add(library); + } + } + return orphanIdeLibraries; + } + }; + } + @Override public void removeData(@NotNull final Computable> toRemoveComputable, @NotNull Collection> toIgnore, @NotNull ProjectData projectData, @NotNull final Project project, - @NotNull final PlatformFacade platformFacade, - boolean synchronous) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { final Collection toRemove = toRemoveComputable.compute(); if (toRemove.isEmpty()) { return; } - platformFacade.updateLibraryTable(project, new Consumer() { - @Override - public void consume(LibraryTable.ModifiableModel model) { - for (Library library : toRemove) { - String libraryName = library.getName(); - if (libraryName != null) { - Library libraryToRemove = model.getLibraryByName(libraryName); - if (libraryToRemove != null) { - model.removeLibrary(libraryToRemove); - } - } + + final LibraryTable.ModifiableModel librariesModel = modelsProvider.getModifiableProjectLibrariesModel(); + for (Library library : toRemove) { + String libraryName = library.getName(); + if (libraryName != null) { + Library libraryToRemove = librariesModel.getLibraryByName(libraryName); + if (libraryToRemove != null) { + librariesModel.removeLibrary(libraryToRemove); } } - }); + } } private void syncPaths(@NotNull final LibraryData externalLibrary, @NotNull final Library ideLibrary, - @NotNull final PlatformFacade platformFacade) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { if (externalLibrary.isUnresolved()) { return; } @@ -224,21 +227,33 @@ public class LibraryDataService extends AbstractProjectDataService() { - @Override - public void consume(Library.ModifiableModel model) { - for (Map.Entry> entry : toRemove.entrySet()) { - for (String path : entry.getValue()) { - model.removeRoot(path, entry.getKey()); - } - } - - for (Map.Entry> entry : toAdd.entrySet()) { - Map> roots = ContainerUtilRt.newHashMap(); - roots.put(entry.getKey(), ContainerUtil.map(entry.getValue(), PATH_TO_FILE)); - registerPaths(roots, model, externalLibrary.getInternalName()); - } + final Library.ModifiableModel libraryModel = modelsProvider.getModifiableLibraryModel(ideLibrary); + for (Map.Entry> entry : toRemove.entrySet()) { + for (String path : entry.getValue()) { + libraryModel.removeRoot(path, entry.getKey()); } - }); + } + + for (Map.Entry> entry : toAdd.entrySet()) { + Map> roots = ContainerUtilRt.newHashMap(); + roots.put(entry.getKey(), ContainerUtil.map(entry.getValue(), PATH_TO_FILE)); + registerPaths(roots, libraryModel, externalLibrary.getInternalName()); + } + } + + private static boolean isOrphanProjectLibrary(@NotNull final Library library, + @NotNull final IdeModifiableModelsProvider modelsProvider) { + RootPolicy visitor = new RootPolicy() { + @Override + public Boolean visitLibraryOrderEntry(LibraryOrderEntry ideDependency, Boolean value) { + return !ideDependency.isModuleLevel() && library == ideDependency.getLibrary(); + } + }; + for (Module module : modelsProvider.getModules()) { + for (OrderEntry entry : modelsProvider.getOrderEntries(module)) { + if (entry.accept(visitor, false)) return false; + } + } + return true; } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java index 05682aa6e6fb..94543d494ec8 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/LibraryDependencyDataService.java @@ -20,7 +20,7 @@ import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.Key; import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.*; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.Order; @@ -34,8 +34,6 @@ import com.intellij.openapi.roots.impl.ModuleLibraryOrderEntryImpl; import com.intellij.openapi.roots.libraries.Library; import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.util.ExceptionUtil; -import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; @@ -43,7 +41,6 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.Set; @@ -74,34 +71,22 @@ public class LibraryDependencyDataService extends AbstractDependencyDataService< public void importData(@NotNull Collection> toImport, @Nullable ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { if (toImport.isEmpty()) { return; } - MyImporter importer = new MyImporter(platformFacade); - try { - MultiMap, DataNode> byModule = ExternalSystemApiUtil.groupBy(toImport, MODULE); - for (Map.Entry, Collection>> entry : byModule.entrySet()) { - Module module = platformFacade.findIdeModule(entry.getKey().getData(), project); - Collection> libraryDependency = entry.getValue(); - if (module == null) { - LOG.warn(String.format( - "Can't import library dependencies %s. Reason: target module (%s) is not found at the ide and can't be imported", - libraryDependency, entry.getKey() - )); - continue; - } - importer.importData(module, libraryDependency); + MultiMap, DataNode> byModule = ExternalSystemApiUtil.groupBy(toImport, MODULE); + for (Map.Entry, Collection>> entry : byModule.entrySet()) { + Module module = modelsProvider.findIdeModule(entry.getKey().getData()); + if (module == null) { + LOG.warn(String.format( + "Can't import library dependencies %s. Reason: target module (%s) is not found at the ide and can't be imported", + entry.getValue(), entry.getKey() + )); + continue; } - // change libraries first - ExternalSystemApiUtil.commitChangedModels(synchronous, project, importer.getLibraryModels()); - ExternalSystemApiUtil.commitModels(synchronous, project, importer.getModels()); - } - catch (Throwable t) { - ExternalSystemApiUtil.disposeModels(importer.getModels()); - ExceptionUtil.rethrowAllAsUnchecked(t); + importData(entry.getValue(), module, modelsProvider); } } @@ -116,157 +101,146 @@ public class LibraryDependencyDataService extends AbstractDependencyDataService< return orderEntry.getLibraryName(); } - private class MyImporter { - private final PlatformFacade myPlatformFacade; - private final List myModels = ContainerUtilRt.newArrayList(); - private final List myLibraryModels = ContainerUtilRt.newArrayList(); + private void importData(@NotNull final Collection> 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/* library paths */, LibraryDependencyData> moduleLibrariesToImport = ContainerUtilRt.newHashMap(); + final Map projectLibrariesToImport = ContainerUtilRt.newHashMap(); + final Set toImport = ContainerUtilRt.newLinkedHashSet(); - private MyImporter(PlatformFacade platformFacade) { - myPlatformFacade = platformFacade; - } - - public List getModels() { - return ContainerUtil.newUnmodifiableList(myModels); - } - - public List getLibraryModels() { - return ContainerUtil.newUnmodifiableList(myLibraryModels); - } - - public void importData(@NotNull Module module, @NotNull Collection> nodesToImport) { - // 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. - Map/* library paths */, LibraryDependencyData> moduleLibrariesToImport = ContainerUtilRt.newHashMap(); - Map projectLibrariesToImport = ContainerUtilRt.newHashMap(); - Set toImport = ContainerUtilRt.newLinkedHashSet(); - - boolean hasUnresolved = false; - for (DataNode dependencyNode : nodesToImport) { - LibraryDependencyData dependencyData = dependencyNode.getData(); - LibraryData libraryData = dependencyData.getTarget(); - hasUnresolved |= libraryData.isUnresolved(); - switch (dependencyData.getLevel()) { - case MODULE: - if (!libraryData.isUnresolved()) { - Set 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); + boolean hasUnresolved = false; + for (DataNode dependencyNode : nodesToImport) { + LibraryDependencyData dependencyData = dependencyNode.getData(); + LibraryData libraryData = dependencyData.getTarget(); + hasUnresolved |= libraryData.isUnresolved(); + switch (dependencyData.getLevel()) { + case MODULE: + if (!libraryData.isUnresolved()) { + Set paths = ContainerUtilRt.newHashSet(); + for (String path : libraryData.getPaths(LibraryPathType.BINARY)) { + paths.add(ExternalSystemApiUtil.toCanonicalPath(path) + dependencyData.getScope().name()); } - break; - case PROJECT: - projectLibrariesToImport.put(libraryData.getInternalName() + dependencyData.getScope().name(), dependencyData); + moduleLibrariesToImport.put(paths, dependencyData); toImport.add(dependencyData); - } - } - - ModifiableRootModel moduleRootModel = myPlatformFacade.getModuleModifiableModel(module); - LibraryTable moduleLibraryTable = moduleRootModel.getModuleLibraryTable(); - LibraryTable libraryTable = myPlatformFacade.getProjectLibraryTable(module.getProject()); - syncExistingAndRemoveObsolete(moduleLibrariesToImport, projectLibrariesToImport, toImport, moduleRootModel, hasUnresolved); - - // Import missing library dependencies. - if (!toImport.isEmpty()) { - importMissing(toImport, moduleRootModel, moduleLibraryTable, libraryTable, module); - } - myModels.add(moduleRootModel); - } - - private void importMissing(@NotNull Set toImport, - @NotNull ModifiableRootModel moduleRootModel, - @NotNull LibraryTable moduleLibraryTable, - @NotNull LibraryTable libraryTable, - @NotNull Module module) { - for (LibraryDependencyData dependencyData : toImport) { - LibraryData libraryData = dependencyData.getTarget(); - String libraryName = libraryData.getInternalName(); - switch (dependencyData.getLevel()) { - case MODULE: - Library moduleLib = moduleLibraryTable.createLibrary(libraryName); - syncExistingLibraryDependency(dependencyData, moduleLib, moduleRootModel, module); - break; - case PROJECT: - Library projectLib = libraryTable.getLibraryByName(libraryName); - if (projectLib == null) { - syncExistingLibraryDependency(dependencyData, moduleLibraryTable.createLibrary(libraryName), moduleRootModel, module); - break; - } - LibraryOrderEntry orderEntry = moduleRootModel.addLibraryEntry(projectLib); - setLibraryScope(orderEntry, projectLib, module, dependencyData); - } + } + break; + case PROJECT: + projectLibrariesToImport.put(libraryData.getInternalName() + dependencyData.getScope().name(), dependencyData); + toImport.add(dependencyData); } } - private void setLibraryScope(@NotNull LibraryOrderEntry orderEntry, - @NotNull Library lib, - @NotNull Module module, - @NotNull LibraryDependencyData dependencyData) { - LOG.debug(String.format("Adding library dependency '%s' to module '%s'", lib.getName(), module.getName())); - orderEntry.setExported(dependencyData.isExported()); - orderEntry.setScope(dependencyData.getScope()); - LOG.debug(String.format("Configuring library dependency '%s' of module '%s' to be%s exported and have scope %s", lib.getName(), module.getName(), dependencyData.isExported() ? " not" : "", dependencyData.getScope())); - } + final boolean finalHasUnresolved = hasUnresolved; - private void syncExistingAndRemoveObsolete(@NotNull Map, LibraryDependencyData> moduleLibrariesToImport, - @NotNull Map projectLibrariesToImport, - @NotNull Set toImport, - @NotNull ModifiableRootModel moduleRootModel, - boolean hasUnresolvedLibraries) { - Set moduleLibraryKey = ContainerUtilRt.newHashSet(); - for (OrderEntry entry : moduleRootModel.getOrderEntries()) { - if (entry instanceof ModuleLibraryOrderEntryImpl) { - ModuleLibraryOrderEntryImpl moduleLibraryOrderEntry = (ModuleLibraryOrderEntryImpl)entry; - Library library = moduleLibraryOrderEntry.getLibrary(); - if (library == null) { - LOG.warn("Skipping module-level library entry because it doesn't have backing Library object. Entry: " + entry); - continue; - } - moduleLibraryKey.clear(); - for (VirtualFile file : library.getFiles(OrderRootType.CLASSES)) { - moduleLibraryKey.add(ExternalSystemApiUtil.getLocalFileSystemPath(file) + moduleLibraryOrderEntry.getScope().name()); - } - LibraryDependencyData existing = moduleLibrariesToImport.remove(moduleLibraryKey); - if (existing == null) { - moduleRootModel.removeOrderEntry(entry); - } - else { - syncExistingLibraryDependency(existing, library, moduleRootModel, moduleLibraryOrderEntry.getOwnerModule()); - toImport.remove(existing); - } - } - else if (entry instanceof LibraryOrderEntry) { - LibraryOrderEntry libraryOrderEntry = (LibraryOrderEntry)entry; - String libraryName = libraryOrderEntry.getLibraryName(); - LibraryDependencyData existing = projectLibrariesToImport.remove(libraryName + libraryOrderEntry.getScope().name()); - if (existing != null) { - toImport.remove(existing); - } - else if (!hasUnresolvedLibraries) { - // There is a possible case that a project has been successfully imported from external model and after - // that network/repo goes down. We don't want to drop existing binary mappings then. - moduleRootModel.removeOrderEntry(entry); - } - } - } - } - - private void syncExistingLibraryDependency(@NotNull LibraryDependencyData libraryDependencyData, - @NotNull Library library, - @NotNull ModifiableRootModel moduleRootModel, - @NotNull Module module) { - Library.ModifiableModel libModel = library.getModifiableModel(); - String libraryName = libraryDependencyData.getInternalName(); - Map> files = myLibraryManager.prepareLibraryFiles(libraryDependencyData.getTarget()); - myLibraryManager.registerPaths(files, libModel, libraryName); - LibraryOrderEntry orderEntry = moduleRootModel.findLibraryOrderEntry(library); - assert orderEntry != null; - setLibraryScope(orderEntry, library, module, libraryDependencyData); - myLibraryModels.add(libModel); + final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module); + LibraryTable moduleLibraryTable = modifiableRootModel.getModuleLibraryTable(); + syncExistingAndRemoveObsolete( + modelsProvider, moduleLibrariesToImport, projectLibrariesToImport, toImport, modifiableRootModel, finalHasUnresolved); + // Import missing library dependencies. + if (!toImport.isEmpty()) { + importMissing(modelsProvider, toImport, modifiableRootModel, moduleLibraryTable, module); } } + + private void importMissing(@NotNull IdeModifiableModelsProvider modelsProvider, + @NotNull Set toImport, + @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 = moduleLibraryTable.createLibrary(libraryName); + syncExistingLibraryDependency(modelsProvider, dependencyData, moduleLib, moduleRootModel, module); + break; + case PROJECT: + final Library projectLib = modelsProvider.getLibraryByName(libraryName); + if (projectLib == null) { + syncExistingLibraryDependency(modelsProvider, dependencyData, moduleLibraryTable.createLibrary(libraryName), moduleRootModel, + module); + break; + } + LibraryOrderEntry orderEntry = moduleRootModel.addLibraryEntry(projectLib); + setLibraryScope(orderEntry, projectLib, module, dependencyData); + } + } + } + + private static void setLibraryScope(@NotNull LibraryOrderEntry orderEntry, + @NotNull Library lib, + @NotNull Module module, + @NotNull LibraryDependencyData dependencyData) { + LOG.debug(String.format("Adding library dependency '%s' to module '%s'", lib.getName(), module.getName())); + orderEntry.setExported(dependencyData.isExported()); + orderEntry.setScope(dependencyData.getScope()); + LOG.debug(String.format( + "Configuring library dependency '%s' of module '%s' to be%s exported and have scope %s", + lib.getName(), module.getName(), dependencyData.isExported() ? " not" : "", dependencyData.getScope() + )); + } + + private void syncExistingAndRemoveObsolete(@NotNull IdeModifiableModelsProvider modelsProvider, + @NotNull Map, LibraryDependencyData> moduleLibrariesToImport, + @NotNull Map projectLibrariesToImport, + @NotNull Set toImport, + @NotNull ModifiableRootModel moduleRootModel, + boolean hasUnresolvedLibraries) { + Set moduleLibraryKey = ContainerUtilRt.newHashSet(); + for (OrderEntry entry : moduleRootModel.getOrderEntries()) { + if (entry instanceof ModuleLibraryOrderEntryImpl) { + ModuleLibraryOrderEntryImpl moduleLibraryOrderEntry = (ModuleLibraryOrderEntryImpl)entry; + Library library = moduleLibraryOrderEntry.getLibrary(); + if (library == null) { + LOG.warn("Skipping module-level library entry because it doesn't have backing Library object. Entry: " + entry); + continue; + } + moduleLibraryKey.clear(); + for (VirtualFile file : library.getFiles(OrderRootType.CLASSES)) { + moduleLibraryKey.add(ExternalSystemApiUtil.getLocalFileSystemPath(file) + moduleLibraryOrderEntry.getScope().name()); + } + LibraryDependencyData existing = moduleLibrariesToImport.remove(moduleLibraryKey); + if (existing == null) { + moduleRootModel.removeOrderEntry(entry); + } + else { + syncExistingLibraryDependency(modelsProvider, existing, library, moduleRootModel, moduleLibraryOrderEntry.getOwnerModule()); + toImport.remove(existing); + } + } + else if (entry instanceof LibraryOrderEntry) { + LibraryOrderEntry libraryOrderEntry = (LibraryOrderEntry)entry; + String libraryName = libraryOrderEntry.getLibraryName(); + LibraryDependencyData existing = projectLibrariesToImport.remove(libraryName + libraryOrderEntry.getScope().name()); + if (existing != null) { + toImport.remove(existing); + } + else if (!hasUnresolvedLibraries) { + // There is a possible case that a project has been successfully imported from external model and after + // that network/repo goes down. We don't want to drop existing binary mappings then. + moduleRootModel.removeOrderEntry(entry); + } + } + } + } + + private void syncExistingLibraryDependency(@NotNull IdeModifiableModelsProvider modelsProvider, + @NotNull final LibraryDependencyData libraryDependencyData, + @NotNull final Library library, + @NotNull final ModifiableRootModel moduleRootModel, + @NotNull final Module module) { + final Library.ModifiableModel libraryModel = modelsProvider.getModifiableLibraryModel(library); + final String libraryName = libraryDependencyData.getInternalName(); + Map> files = myLibraryManager.prepareLibraryFiles(libraryDependencyData.getTarget()); + myLibraryManager.registerPaths(files, libraryModel, libraryName); + LibraryOrderEntry orderEntry = moduleRootModel.findLibraryOrderEntry(library); + assert orderEntry != null; + setLibraryScope(orderEntry, library, module, libraryDependencyData); + } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java index 189fc756df7d..bf276197f871 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDataService.java @@ -15,6 +15,7 @@ */ package com.intellij.openapi.externalSystem.service.project.manage; +import com.intellij.ide.util.projectWizard.ModuleBuilder; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.model.DataNode; @@ -24,10 +25,10 @@ import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.*; +import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.ui.DialogWrapper; @@ -38,7 +39,6 @@ import com.intellij.ui.CheckBoxList; import com.intellij.ui.IdeBorderFactory; import com.intellij.ui.components.JBScrollPane; import com.intellij.util.Consumer; -import com.intellij.util.ExceptionUtil; import com.intellij.util.Function; import com.intellij.util.SmartList; import com.intellij.util.containers.ContainerUtil; @@ -49,7 +49,6 @@ import org.jetbrains.annotations.Nullable; import javax.swing.*; import java.awt.*; -import java.io.File; import java.util.Collection; import java.util.List; @@ -76,74 +75,63 @@ public class ModuleDataService extends AbstractProjectDataService> toImport, @Nullable ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { if (toImport.isEmpty()) { return; } - Collection> toCreate = filterExistingModules(toImport, project, platformFacade); + + final Collection> toCreate = filterExistingModules(toImport, modelsProvider); if (!toCreate.isEmpty()) { - ExternalSystemApiUtil.commitModels(synchronous, project, createModules(project, platformFacade, toCreate)); + createModules(toCreate, modelsProvider); + } + for (DataNode node : toImport) { + Module module = modelsProvider.findIdeModule(node.getData()); + if (module != null) { + syncPaths(module, modelsProvider, node.getData()); + } } - ExternalSystemApiUtil.commitModels(synchronous, project, syncModulesPaths(project, platformFacade, toImport)); } - @NotNull - private static List createModules(@NotNull Project project, - @NotNull PlatformFacade platformFacade, - Collection> toCreate) { - List models = ContainerUtilRt.newArrayList(); - try { - for (DataNode moduleData : toCreate) { - models.add(createModule(project, platformFacade, moduleData)); + private static void createModules(@NotNull Collection> toCreate, + @NotNull IdeModifiableModelsProvider modelsProvider) { + for (final DataNode module : toCreate) { + ModuleData data = module.getData(); + final Module created = modelsProvider.newModule(data.getModuleFilePath(), data.getModuleTypeId()); + + // Ensure that the dependencies are clear (used to be not clear when manually removing the module and importing it via gradle) + final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(created); + + modifiableRootModel.inheritSdk(); + setModuleOptions(created, module); + + RootPolicy visitor = new RootPolicy() { + @Override + public Object visitLibraryOrderEntry(LibraryOrderEntry libraryOrderEntry, Object value) { + modifiableRootModel.removeOrderEntry(libraryOrderEntry); + return value; + } + + @Override + public Object visitModuleOrderEntry(ModuleOrderEntry moduleOrderEntry, Object value) { + modifiableRootModel.removeOrderEntry(moduleOrderEntry); + return value; + } + }; + + for (OrderEntry orderEntry : modifiableRootModel.getOrderEntries()) { + orderEntry.accept(visitor, null); } } - catch (Throwable t) { - ExternalSystemApiUtil.disposeModels(models); - ExceptionUtil.rethrowAllAsUnchecked(t); - } - return models; - } - - private static ModifiableRootModel createModule(@NotNull Project project, - @NotNull PlatformFacade platformFacade, - @NotNull DataNode module) { - ModuleData data = module.getData(); - Module created = platformFacade.newModule(project, data.getModuleFilePath(), data.getModuleTypeId()); - - // Ensure that the dependencies are clear (used to be not clear when manually removing the module and importing it via gradle) - final ModifiableRootModel moduleRootModel = platformFacade.getModuleModifiableModel(created); - moduleRootModel.inheritSdk(); - setModuleOptions(created, module); - - RootPolicy visitor = new RootPolicy() { - @Override - public Object visitLibraryOrderEntry(LibraryOrderEntry libraryOrderEntry, Object value) { - moduleRootModel.removeOrderEntry(libraryOrderEntry); - return value; - } - - @Override - public Object visitModuleOrderEntry(ModuleOrderEntry moduleOrderEntry, Object value) { - moduleRootModel.removeOrderEntry(moduleOrderEntry); - return value; - } - }; - for (OrderEntry orderEntry : moduleRootModel.getOrderEntries()) { - orderEntry.accept(visitor, null); - } - return moduleRootModel; } @NotNull private static Collection> filterExistingModules(@NotNull Collection> modules, - @NotNull Project project, - @NotNull PlatformFacade platformFacade) + @NotNull IdeModifiableModelsProvider modelsProvider) { Collection> result = ContainerUtilRt.newArrayList(); for (DataNode node : modules) { ModuleData moduleData = node.getData(); - Module module = platformFacade.findIdeModule(moduleData, project); + Module module = modelsProvider.findIdeModule(moduleData); if (module == null) { result.add(node); } @@ -154,34 +142,16 @@ public class ModuleDataService extends AbstractProjectDataService syncModulesPaths(@NotNull Project project, - @NotNull PlatformFacade platformFacade, - Collection> toCreate) { - List models = ContainerUtilRt.newArrayList(); - try { - for (DataNode moduleData : toCreate) { - Module module = platformFacade.findIdeModule(moduleData.getData(), project); - if (module != null) { - models.add(syncPaths(module, platformFacade, moduleData.getData())); - } - } - } - catch (Throwable t) { - ExternalSystemApiUtil.disposeModels(models); - ExceptionUtil.rethrowAllAsUnchecked(t); - } - return models; - } - - @NotNull - private static ModifiableRootModel syncPaths(@NotNull Module module, @NotNull PlatformFacade platformFacade, @NotNull ModuleData data) { - ModifiableRootModel modifiableModel = platformFacade.getModuleModifiableModel(module); - CompilerModuleExtension extension = modifiableModel.getModuleExtension(CompilerModuleExtension.class); + private static void syncPaths(@NotNull final Module module, @NotNull IdeModifiableModelsProvider modelsProvider, @NotNull final ModuleData data) { + final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module); + CompilerModuleExtension extension = modifiableRootModel.getModuleExtension(CompilerModuleExtension.class); if (extension == null) { - LOG.warn(String.format("Can't sync paths for module '%s'. Reason: no compiler extension is found for it", module.getName())); - return modifiableModel; + modifiableRootModel.dispose(); + final String errorMsg = + String.format("Can't sync paths for module '%s'. Reason: no compiler extension is found for it", module.getName()); + throw new RuntimeException(errorMsg); } + String compileOutputPath = data.getCompileOutputPath(ExternalSystemSourceType.SOURCE); if (compileOutputPath != null) { extension.setCompilerOutputPath(VfsUtilCore.pathToUrl(compileOutputPath)); @@ -193,7 +163,6 @@ public class ModuleDataService extends AbstractProjectDataService> computeOrphanData(@NotNull final Collection> toImport, @NotNull final ProjectData projectData, @NotNull final Project project, - @NotNull final PlatformFacade platformFacade) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { return new Computable>() { @Override public Collection compute() { List orphanIdeModules = ContainerUtil.newSmartList(); - for (Module module : platformFacade.getModules(project)) { + for (Module module : modelsProvider.getModules()) { if (!ExternalSystemApiUtil.isExternalSystemAwareModule(projectData.getOwner(), module)) continue; final String rootProjectPath = ExternalSystemApiUtil.getExternalRootProjectPath(module); if (projectData.getLinkedExternalProjectPath().equals(rootProjectPath)) { @@ -238,12 +207,11 @@ public class ModuleDataService extends AbstractProjectDataService> toIgnore, @NotNull final ProjectData projectData, @NotNull final Project project, - @NotNull final PlatformFacade platformFacade, - final boolean synchronous) { + @NotNull final IdeModifiableModelsProvider modelsProvider) { final Collection toRemove = toRemoveComputable.compute(); final List modules = new SmartList(toRemove); for (DataNode moduleDataNode : toIgnore) { - final Module module = platformFacade.findIdeModule(moduleDataNode.getData(), project); + final Module module = modelsProvider.findIdeModule(moduleDataNode.getData()); ContainerUtil.addIfNotNull(modules, module); } @@ -261,25 +229,13 @@ public class ModuleDataService extends AbstractProjectDataService>() { @Override public void consume(final List modules) { - ExternalSystemApiUtil.executeProjectChangeAction(synchronous, new DisposeAwareProjectChange(project) { - @Override - public void execute() { - for (Module module : modules) { - if (module.isDisposed()) continue; - - ModuleManager moduleManager = ModuleManager.getInstance(module.getProject()); - String path = module.getModuleFilePath(); - moduleManager.disposeModule(module); - File file = new File(path); - if (file.isFile()) { - boolean success = file.delete(); - if (!success) { - LOG.warn("Can't remove module file at '" + path + "'"); - } - } - } - } - }); + final ModifiableModuleModel moduleModel = modelsProvider.getModifiableModuleModel(); + for (Module module : modules) { + if (module.isDisposed()) continue; + String path = module.getModuleFilePath(); + moduleModel.disposeModule(module); + ModuleBuilder.deleteModuleFile(path); + } } }); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java index b748e9925326..10576a317012 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ModuleDependencyDataService.java @@ -22,7 +22,7 @@ import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.Order; @@ -30,14 +30,12 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.*; import com.intellij.openapi.util.Pair; -import com.intellij.util.ExceptionUtil; import com.intellij.util.containers.ContainerUtilRt; import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; -import java.util.List; import java.util.Map; import static com.intellij.openapi.externalSystem.model.ProjectKeys.MODULE; @@ -61,27 +59,18 @@ public class ModuleDependencyDataService extends AbstractDependencyDataService> toImport, @Nullable ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { - List models = ContainerUtilRt.newArrayList(); - try { - MultiMap, DataNode> byModule = ExternalSystemApiUtil.groupBy(toImport, MODULE); - for (Map.Entry, Collection>> entry : byModule.entrySet()) { - Module ideModule = platformFacade.findIdeModule(entry.getKey().getData(), project); - if (ideModule == null) { - LOG.warn(String.format( - "Can't import module dependencies %s. Reason: target module (%s) is not found at the ide and can't be imported", - entry.getValue(), entry.getKey() - )); - continue; - } - models.add(importData(entry.getValue(), ideModule, platformFacade)); + @NotNull IdeModifiableModelsProvider modelsProvider) { + MultiMap, DataNode> byModule = ExternalSystemApiUtil.groupBy(toImport, MODULE); + for (Map.Entry, Collection>> entry : byModule.entrySet()) { + Module ideModule = modelsProvider.findIdeModule(entry.getKey().getData()); + if (ideModule == null) { + LOG.warn(String.format( + "Can't import module dependencies %s. Reason: target module (%s) is not found at the ide and can't be imported", + entry.getValue(), entry.getKey() + )); + continue; } - ExternalSystemApiUtil.commitModels(synchronous, project, models); - } - catch (Throwable t) { - ExternalSystemApiUtil.disposeModels(models); - ExceptionUtil.rethrowAllAsUnchecked(t); + importData(entry.getValue(), ideModule, modelsProvider); } } @@ -96,27 +85,24 @@ public class ModuleDependencyDataService extends AbstractDependencyDataService> toImport, - @NotNull Module module, - @NotNull PlatformFacade platformFacade) - { - ModuleRootManager moduleRootManager = ModuleRootManager.getInstance(module); - Map, ModuleOrderEntry> toRemove = + private void importData(@NotNull final Collection> toImport, + @NotNull final Module module, + @NotNull final IdeModifiableModelsProvider modelsProvider) { + final Map, ModuleOrderEntry> toRemove = ContainerUtilRt.newHashMap(); - for (OrderEntry entry : moduleRootManager.getOrderEntries()) { + for (OrderEntry entry : modelsProvider.getOrderEntries(module)) { if (entry instanceof ModuleOrderEntry) { ModuleOrderEntry e = (ModuleOrderEntry)entry; toRemove.put(Pair.create(e.getModuleName(), e.getScope()), e); } } - ModifiableRootModel moduleRootModel = platformFacade.getModuleModifiableModel(module); + final ModifiableRootModel modifiableRootModel = modelsProvider.getModifiableRootModel(module); for (DataNode dependencyNode : toImport) { - ModuleDependencyData dependencyData = dependencyNode.getData(); + final ModuleDependencyData dependencyData = dependencyNode.getData(); toRemove.remove(Pair.create(dependencyData.getInternalName(), dependencyData.getScope())); - String moduleName = dependencyData.getInternalName(); - Module ideDependencyModule = platformFacade.findIdeModule(moduleName, module.getProject()); + final String moduleName = dependencyData.getInternalName(); + Module ideDependencyModule = modelsProvider.findIdeModule(moduleName); ModuleOrderEntry orderEntry; if (module.equals(ideDependencyModule)) { @@ -125,14 +111,16 @@ public class ModuleDependencyDataService extends AbstractDependencyDataService, List>>> myServices; - private final PlatformFacade myPlatformFacade; public static ProjectDataManager getInstance() { return ServiceManager.getService(ProjectDataManager.class); } - public ProjectDataManager(@NotNull PlatformFacade platformFacade) { + public ProjectDataManager() { myServices = new NotNullLazyValue, List>>>() { @NotNull @Override @@ -83,7 +84,6 @@ public class ProjectDataManager { return result; } }; - myPlatformFacade = platformFacade; } @Nullable @@ -95,8 +95,8 @@ public class ProjectDataManager { @SuppressWarnings("unchecked") public void importData(@NotNull Collection> nodes, - @NotNull final Project project, - @NotNull PlatformFacade platformFacade, + @NotNull Project project, + @NotNull IdeModifiableModelsProvider modelsProvider, boolean synchronous) { if (project.isDisposed()) return; @@ -129,8 +129,6 @@ public class ProjectDataManager { ExternalSystemUtil.scheduleExternalViewStructureUpdate(project, projectSystemId); } - final BatchUpdateListener publisher = project.getMessageBus().syncPublisher(BatchUpdateListener.TOPIC); - publisher.onBatchUpdateStarted(); try { final Set, Collection>>> entries = grouped.entrySet(); final ProgressIndicator indicator = ProgressManager.getInstance().getProgressIndicator(); @@ -139,27 +137,30 @@ public class ProjectDataManager { } final int size = entries.size(); int count = 0; + List postImportTasks = ContainerUtil.newSmartList(); for (Map.Entry, Collection>> entry : entries) { if (indicator != null) { String message = ExternalSystemBundle.message( "progress.update.text", projectSystemId != null ? projectSystemId.getReadableName() : "", - "Importing " + getReadableText(entry.getKey())); + "Refresh " + getReadableText(entry.getKey())); indicator.setText(message); indicator.setFraction((double)count++ / size); } - doImportData(entry.getKey(), entry.getValue(), projectData, project, platformFacade, synchronous); + doImportData(entry.getKey(), entry.getValue(), projectData, project, modelsProvider, postImportTasks); } + + for (Runnable postImportTask : ContainerUtil.reverse(postImportTasks)) { + postImportTask.run(); + } + + commit(modelsProvider, project, synchronous, "Imported data"); if (indicator != null) { indicator.setIndeterminate(true); } } - finally { - ExternalSystemApiUtil.executeOnEdt(synchronous, new Runnable() { - @Override - public void run() { - publisher.onBatchUpdateFinished(); - } - }); + catch (Throwable t) { + dispose(modelsProvider, project, synchronous); + ExceptionUtil.rethrowAllAsUnchecked(t); } } @@ -187,33 +188,33 @@ public class ProjectDataManager { for (DataNode node : nodes) { dummy.add(node); } - importData(dummy, project, myPlatformFacade, synchronous); + importData(dummy, project, new IdeModifiableModelsProviderImpl(project), synchronous); } public void importData(@NotNull DataNode node, @NotNull Project project, - @NotNull PlatformFacade platformFacade, + @NotNull IdeModifiableModelsProvider modelsProvider, boolean synchronous) { Collection> dummy = ContainerUtil.newSmartList(); dummy.add(node); - importData(dummy, project, platformFacade, synchronous); + importData(dummy, project, modelsProvider, synchronous); } public void importData(@NotNull DataNode node, @NotNull Project project, boolean synchronous) { - importData(node, project, myPlatformFacade, synchronous); + importData(node, project, new IdeModifiableModelsProviderImpl(project), synchronous); } @SuppressWarnings("unchecked") private void doImportData(@NotNull Key key, @NotNull Collection> nodes, - @Nullable ProjectData projectData, - @NotNull Project project, - @NotNull PlatformFacade platformFacade, - boolean synchronous) { + @Nullable final ProjectData projectData, + @NotNull final Project project, + @NotNull final IdeModifiableModelsProvider modelsProvider, + @NotNull List postImportTasks) { if (project.isDisposed()) return; - if(project instanceof ProjectImpl) { + if (project instanceof ProjectImpl) { assert ((ProjectImpl)project).isComponentsCreated(); } @@ -233,7 +234,7 @@ public class ProjectDataManager { ensureTheDataIsReadyToUse((Collection)toImport); - List> services = myServices.getValue().get(key); + final List> services = myServices.getValue().get(key); if (services == null) { LOG.warn(String.format( "Can't import data nodes '%s'. Reason: no service is registered for key %s. Available services for %s", @@ -243,32 +244,28 @@ public class ProjectDataManager { else { for (ProjectDataService service : services) { final long importStartTime = System.currentTimeMillis(); - if (service instanceof ProjectDataServiceEx) { - ((ProjectDataServiceEx)service).importData(toImport, projectData, project, platformFacade, synchronous); - } - else { - ((ProjectDataService)service).importData(toImport, project, synchronous); - } - final long importTimeInSeconds = (System.currentTimeMillis() - importStartTime) / 1000; - LOG.debug(String.format("Service %s imported data in %d seconds", service.getClass().getSimpleName(), importTimeInSeconds)); + ((ProjectDataService)service).importData(toImport, projectData, project, modelsProvider); + final long importTimeInMs = (System.currentTimeMillis() - importStartTime); + LOG.debug(String.format("Service %s imported data in %d ms", service.getClass().getSimpleName(), importTimeInMs)); } } ensureTheDataIsReadyToUse((Collection)toIgnore); if (services != null && projectData != null) { - for (ProjectDataService service : services) { - if (service instanceof ProjectDataServiceEx) { - final long removeStartTime = System.currentTimeMillis(); - final ProjectDataServiceEx dataServiceEx = (ProjectDataServiceEx)service; - final Computable> orphanIdeDataComputable = - dataServiceEx.computeOrphanData(toImport, projectData, project, platformFacade); - dataServiceEx.removeData(orphanIdeDataComputable, toIgnore, projectData, project, platformFacade, synchronous); - final long removeTimeInSeconds = (System.currentTimeMillis() - removeStartTime) / 1000; - LOG.debug(String.format("Service %s computed and removed data in %d seconds", - service.getClass().getSimpleName(), removeTimeInSeconds)); + postImportTasks.add(new Runnable() { + @Override + public void run() { + for (ProjectDataService service : services) { + final long removeStartTime = System.currentTimeMillis(); + final Computable> orphanIdeDataComputable = + ((ProjectDataService)service).computeOrphanData(toImport, projectData, project, modelsProvider); + ((ProjectDataService)service).removeData(orphanIdeDataComputable, toIgnore, projectData, project, modelsProvider); + final long removeTimeInMs = (System.currentTimeMillis() - removeStartTime); + LOG.debug(String.format("Service %s computed and removed data in %d ms", service.getClass().getSimpleName(), removeTimeInMs)); + } } - } + }); } } @@ -285,35 +282,28 @@ public class ProjectDataManager { }); } - @SuppressWarnings("unchecked") - @Deprecated - public void removeData(@NotNull Key key, @NotNull Collection toRemove, @NotNull Project project, boolean synchronous) { - List> services = myServices.getValue().get(key); - for (ProjectDataService service : services) { - service.removeData(toRemove, project, synchronous); - } - } - @SuppressWarnings("unchecked") public void removeData(@NotNull Key key, @NotNull Collection toRemove, @NotNull final Collection> toIgnore, @NotNull final ProjectData projectData, @NotNull Project project, - @NotNull PlatformFacade platformFacade, + @NotNull final IdeModifiableModelsProvider modelsProvider, boolean synchronous) { - List> services = myServices.getValue().get(key); - for (ProjectDataService service : services) { - final long removeStartTime = System.currentTimeMillis(); - if (service instanceof ProjectDataServiceEx) { - ((ProjectDataServiceEx)service).removeData(new Computable.PredefinedValueComputable(toRemove), - toIgnore, projectData, project, platformFacade, synchronous); + try { + List> services = myServices.getValue().get(key); + for (ProjectDataService service : services) { + final long removeStartTime = System.currentTimeMillis(); + service.removeData(new Computable.PredefinedValueComputable(toRemove), toIgnore, projectData, project, modelsProvider); + final long removeTimeInMs = System.currentTimeMillis() - removeStartTime; + LOG.debug(String.format("Service %s removed data in %d ms", service.getClass().getSimpleName(), removeTimeInMs)); } - else { - service.removeData(toRemove, project, synchronous); - } - final long removeTimeInSeconds = (System.currentTimeMillis() - removeStartTime) / 1000; - LOG.debug(String.format("Service %s removed data in %d seconds", service.getClass().getSimpleName(), removeTimeInSeconds)); + + commit(modelsProvider, project, synchronous, "Removed data"); + } + catch (Throwable t) { + dispose(modelsProvider, project, synchronous); + ExceptionUtil.rethrowAllAsUnchecked(t); } } @@ -323,7 +313,7 @@ public class ProjectDataManager { @NotNull final ProjectData projectData, @NotNull Project project, boolean synchronous) { - removeData(key, toRemove, toIgnore, projectData, project, myPlatformFacade, synchronous); + removeData(key, toRemove, toIgnore, projectData, project, new IdeModifiableModelsProviderImpl(project), synchronous); } public void updateExternalProjectData(@NotNull Project project, @NotNull ExternalProjectInfo externalProjectInfo) { @@ -373,4 +363,30 @@ public class ProjectDataManager { } } } + + private static void commit(@NotNull final IdeModifiableModelsProvider modelsProvider, + @NotNull Project project, + boolean synchronous, + @NotNull final String commitDesc) { + ExternalSystemApiUtil.executeProjectChangeAction(synchronous, new DisposeAwareProjectChange(project) { + @Override + public void execute() { + final long startTime = System.currentTimeMillis(); + modelsProvider.commit(); + final long timeInMs = System.currentTimeMillis() - startTime; + LOG.debug(String.format("%s committed in %d ms", commitDesc, timeInMs)); + } + }); + } + + private static void dispose(@NotNull final IdeModifiableModelsProvider modelsProvider, + @NotNull Project project, + boolean synchronous) { + ExternalSystemApiUtil.executeProjectChangeAction(synchronous, new DisposeAwareProjectChange(project) { + @Override + public void execute() { + modelsProvider.dispose(); + } + }); + } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceImpl.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceImpl.java index 3d6bdab30020..c2771de88ec3 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceImpl.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ProjectDataServiceImpl.java @@ -20,6 +20,7 @@ import com.intellij.openapi.externalSystem.model.Key; import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.ProjectSystemId; import com.intellij.openapi.externalSystem.model.project.ProjectData; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.DisposeAwareProjectChange; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; @@ -27,6 +28,7 @@ import com.intellij.openapi.externalSystem.util.Order; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ex.ProjectEx; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -35,7 +37,7 @@ import java.util.Collection; * @since 2/21/13 2:40 PM */ @Order(ExternalSystemConstants.BUILTIN_PROJECT_DATA_SERVICE_ORDER) -public class ProjectDataServiceImpl implements ProjectDataService { +public class ProjectDataServiceImpl extends AbstractProjectDataService { @NotNull @Override @@ -44,7 +46,10 @@ public class ProjectDataServiceImpl implements ProjectDataService> toImport, @NotNull Project project, boolean synchronous) { + public void importData(@NotNull Collection> toImport, + @Nullable ProjectData projectData, + @NotNull final Project project, + @NotNull IdeModifiableModelsProvider modelsProvider) { // root project can be marked as ignored if(toImport.isEmpty()) return; @@ -52,31 +57,25 @@ public class ProjectDataServiceImpl implements ProjectDataService node = toImport.iterator().next(); - ProjectData projectData = node.getData(); + assert projectData == node.getData(); if (!ExternalSystemApiUtil.isOneToOneMapping(project, node)) { return; } if (!project.getName().equals(projectData.getInternalName())) { - renameProject(projectData.getInternalName(), projectData.getOwner(), project, synchronous); + renameProject(projectData.getInternalName(), projectData.getOwner(), project); } } - @Override - public void removeData(@NotNull Collection toRemove, @NotNull Project project, boolean synchronous) { - } - - @SuppressWarnings("MethodMayBeStatic") - public void renameProject(@NotNull final String newName, - @NotNull final ProjectSystemId externalSystemId, - @NotNull final Project project, - boolean synchronous) + private static void renameProject(@NotNull final String newName, + @NotNull final ProjectSystemId externalSystemId, + @NotNull final Project project) { if (!(project instanceof ProjectEx) || newName.equals(project.getName())) { return; } - ExternalSystemApiUtil.executeProjectChangeAction(synchronous, new DisposeAwareProjectChange(project) { + ExternalSystemApiUtil.executeProjectChangeAction(true, new DisposeAwareProjectChange(project) { @Override public void execute() { String oldName = project.getName(); diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java index 88ef1809cf03..de9e5c65e33b 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java @@ -4,7 +4,6 @@ import com.intellij.ide.util.projectWizard.WizardContext; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.PathManager; import com.intellij.openapi.components.PersistentStateComponent; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.ExternalSystemDataKeys; @@ -13,8 +12,9 @@ import com.intellij.openapi.externalSystem.model.internal.InternalExternalProjec import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.service.execution.ProgressExecutionMode; import com.intellij.openapi.externalSystem.service.project.ExternalProjectRefreshCallback; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; -import com.intellij.openapi.externalSystem.service.project.PlatformFacadeImpl; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; +import com.intellij.openapi.externalSystem.service.project.IdeUIModifiableModelsProvider; import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManager; import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager; import com.intellij.openapi.externalSystem.service.settings.AbstractImportFromExternalSystemControl; @@ -30,6 +30,7 @@ import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectManager; +import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator; import com.intellij.openapi.roots.ui.configuration.ModulesProvider; import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.io.FileUtil; @@ -125,22 +126,17 @@ public abstract class AbstractExternalProjectImportBuilder modules = ContainerUtil.newSmartList(); - final PlatformFacade platformFacade = isFromUI ? new PlatformFacadeImpl() { + final IdeModifiableModelsProvider modelsProvider = isFromUI ? new IdeUIModifiableModelsProvider( + project, model, (ModulesConfigurator)modulesProvider, artifactModel) { @NotNull @Override - public Collection getModules(@NotNull Project project) { - return ContainerUtil.list(modulesProvider.getModules()); - } - - @Override - public Module newModule(Project project, @NotNull @NonNls String filePath, String moduleTypeId) { - final Module module = model.newModule(filePath, moduleTypeId); - // set module type id explicitly otherwise it can not be set if there is an existing module (with the same filePath) and w/o 'type' attribute - module.setOption(Module.ELEMENT_TYPE, moduleTypeId); + public Module newModule(@NotNull @NonNls String filePath, + String moduleTypeId) { + final Module module = super.newModule(filePath, moduleTypeId); modules.add(module); return module; } - } : ServiceManager.getService(PlatformFacade.class); + } : new IdeModifiableModelsProviderImpl(project); AbstractExternalSystemSettings systemSettings = ExternalSystemApiUtil.getSettings(project, myExternalSystemId); final ExternalProjectSettings projectSettings = getCurrentExternalProjectSettings(); @@ -164,7 +160,7 @@ public abstract class AbstractExternalProjectImportBuilder implements ProjectDataService { - +public abstract class AbstractToolWindowService extends AbstractProjectDataService { + @Override - public void importData(@NotNull final Collection> toImport, @NotNull final Project project, boolean synchronous) { + public void importData(@NotNull final Collection> toImport, + @Nullable ProjectData projectData, + @NotNull final Project project, + @NotNull IdeModifiableModelsProvider modelsProvider) { if (toImport.isEmpty()) { return; } - ExternalSystemApiUtil.executeOnEdt(false, new Runnable() { - @Override - public void run() { - processData(toImport, project); - } - }); + processData(toImport, project); } - protected abstract void processData(@NotNull Collection> nodes, - @NotNull Project project); - - @Override - public void removeData(@NotNull Collection toRemove, @NotNull Project project, boolean synchronous) { - } + protected abstract void processData(@NotNull Collection> nodes, @NotNull Project project); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java index 8d2392b8a2c3..915bdca243f0 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/ui/ExternalProjectDataSelectorDialog.java @@ -18,6 +18,7 @@ package com.intellij.openapi.externalSystem.service.ui; import com.intellij.icons.AllIcons; import com.intellij.openapi.actionSystem.ActionToolbarPosition; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.externalSystem.ExternalSystemUiAware; import com.intellij.openapi.externalSystem.importing.ExternalProjectStructureCustomizer; @@ -31,9 +32,12 @@ import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData; import com.intellij.openapi.externalSystem.model.project.ProjectData; import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; +import com.intellij.openapi.externalSystem.util.ExternalSystemBundle; import com.intellij.openapi.externalSystem.util.ExternalSystemUiUtil; -import com.intellij.openapi.project.DumbModePermission; -import com.intellij.openapi.project.DumbService; +import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; +import com.intellij.openapi.progress.PerformInBackgroundOption; +import com.intellij.openapi.progress.ProgressIndicator; +import com.intellij.openapi.progress.Task; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.Messages; @@ -223,9 +227,19 @@ public class ExternalProjectDataSelectorDialog extends DialogWrapper { }); projectStructure.setIgnored(notIgnoredNode == null); - DumbService.allowStartingDumbModeInside(DumbModePermission.MAY_START_BACKGROUND, new Runnable() { + // execute when current dialog is closed + ExternalSystemUtil.invokeLater(myProject, ModalityState.NON_MODAL, new Runnable() { + @Override public void run() { - ServiceManager.getService(ProjectDataManager.class).importData(projectStructure, myProject, true); + final ProjectData projectData = projectStructure.getData(); + String title = ExternalSystemBundle.message( + "progress.refresh.text", projectData.getExternalName(), projectData.getOwner().getReadableName()); + new Task.Backgroundable(myProject, title, true, PerformInBackgroundOption.DEAF) { + @Override + public void run(@NotNull ProgressIndicator indicator) { + ServiceManager.getService(ProjectDataManager.class).importData(projectStructure, myProject, false); + } + }.queue(); } }); } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java index 08d001d96667..94db4476365c 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/util/ExternalSystemUtil.java @@ -51,8 +51,6 @@ import com.intellij.openapi.externalSystem.service.internal.ExternalSystemResolv import com.intellij.openapi.externalSystem.service.notification.ExternalSystemNotificationManager; import com.intellij.openapi.externalSystem.service.notification.NotificationSource; import com.intellij.openapi.externalSystem.service.project.ExternalProjectRefreshCallback; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; -import com.intellij.openapi.externalSystem.service.project.ProjectStructureHelper; import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManager; import com.intellij.openapi.externalSystem.service.project.manage.ExternalSystemTaskActivator; import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataManager; @@ -67,8 +65,6 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.progress.Task; import com.intellij.openapi.progress.util.AbstractProgressIndicatorExBase; import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.roots.libraries.LibraryTable; import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.Disposer; import com.intellij.openapi.util.Pair; @@ -97,7 +93,6 @@ import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.IOException; import java.util.Collection; -import java.util.List; import java.util.Map; import java.util.Set; @@ -301,149 +296,6 @@ public class ExternalSystemUtil { return timeStamp; } - //public static void processOrphanModules(@NotNull final Project project, - // @NotNull final ProjectSystemId projectSystemId, - // @NotNull final String externalProjectPath) { - // final ExternalProjectInfo externalProjectInfo = getExternalProjectInfo(project, projectSystemId, externalProjectPath); - // if (externalProjectInfo != null) { - // Collection> moduleNodes = ExternalSystemApiUtil.findAllRecursively( - // externalProjectInfo.getExternalProjectStructure(), ProjectKeys.MODULE); - // - // processOrphanModules(project, moduleNodes); - // } - //} - // - //public static void processOrphanModules(@NotNull Project project, @NotNull Collection> toImport) { - // if (project.isDisposed()) return; - // if (ExternalSystemDebugEnvironment.DEBUG_ORPHAN_MODULES_PROCESSING) { - // //LOG.info(String.format( - // // "Checking for orphan modules. External paths returned by external system: '%s'", myExternalModulePaths - // //)); - // } - // PlatformFacade platformFacade = ServiceManager.getService(PlatformFacade.class); - // MultiMap orphanIdeModules = MultiMap.create(); - // - // final MultiMap, DataNode> grouped = ExternalSystemApiUtil.groupBy(toImport, ProjectKeys.PROJECT); - // - // for (DataNode node : grouped.keySet()) { - // for (Module module : platformFacade.getModules(project)) { - // final ProjectData projectData = node.getData(); - // if (!ExternalSystemApiUtil.isExternalSystemAwareModule(projectData.getOwner(), module)) continue; - // - // final String rootProjectPath = ExternalSystemApiUtil.getExternalRootProjectPath(module); - // if (projectData.getLinkedExternalProjectPath().equals(rootProjectPath)) { - // final String projectPath = ExternalSystemApiUtil.getExternalProjectPath(module); - // final String projectId = ExternalSystemApiUtil.getExternalProjectId(module); - // final DataNode found = ContainerUtil.find(grouped.get(node), new Condition>() { - // @Override - // public boolean value(DataNode node) { - // final ModuleData moduleData = node.getData(); - // return moduleData.getId().equals(projectId) && - // moduleData.getLinkedExternalProjectPath().equals(projectPath); - // } - // }); - // - // if (found == null || found.isIgnored()) { - // orphanIdeModules.putValue(projectData.getOwner(), module); - // } - // } - // } - // } - // - // if (!orphanIdeModules.isEmpty()) { - // for (Map.Entry> entry : orphanIdeModules.entrySet()) { - // ruleOrphanModules(new SmartList(entry.getValue()), project, entry.getKey()); - // } - // } - //} - // - //public static void ruleOrphanModules(@NotNull final List orphanModules, - // @NotNull final Project project, - // @NotNull final ProjectSystemId externalSystemId) { - // //noinspection unchecked - // ruleOrphanModules(orphanModules, project, externalSystemId, Consumer.EMPTY_CONSUMER); - //} - - ///** - // * There is a possible case that an external module has been un-linked from ide project. There are two ways to process - // * ide modules which correspond to that external project: - // *
-  // * 
    - // *
  1. Remove them from ide project as well;
  2. - // *
  3. Keep them at ide project as well;
  4. - // *
- // *
- // * This method handles that situation, i.e. it asks a user what should be done and acts accordingly. - // * - // * @param orphanModules modules which correspond to the un-linked external project - // * @param project current ide project - // * @param externalSystemId id of the external system which project has been un-linked from ide project - // */ - //public static void ruleOrphanModules(@NotNull final List orphanModules, - // @NotNull final Project project, - // @NotNull final ProjectSystemId externalSystemId, - // @NotNull final Consumer result) - //{ - // UIUtil.invokeLaterIfNeeded(new Runnable() { - // @Override - // public void run() { - // - // final JPanel content = new JPanel(new GridBagLayout()); - // content.add(new JLabel(ExternalSystemBundle.message("orphan.modules.text", externalSystemId.getReadableName())), - // ExternalSystemUiUtil.getFillLineConstraints(0)); - // - // final CheckBoxList orphanModulesList = new CheckBoxList(); - // orphanModulesList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); - // orphanModulesList.setItems(orphanModules, new Function() { - // @Override - // public String fun(Module module) { - // return module.getName(); - // } - // }); - // for (Module module : orphanModules) { - // orphanModulesList.setItemSelected(module, true); - // } - // orphanModulesList.setBorder(IdeBorderFactory.createEmptyBorder(8)); - // content.add(orphanModulesList, ExternalSystemUiUtil.getFillLineConstraints(0)); - // content.setBorder(IdeBorderFactory.createEmptyBorder(0, 0, 8, 0)); - // - // DialogWrapper dialog = new DialogWrapper(project) { - // - // { - // setTitle(ExternalSystemBundle.message("import.title", externalSystemId.getReadableName())); - // init(); - // } - // - // @Nullable - // @Override - // protected JComponent createCenterPanel() { - // return new JBScrollPane(content); - // } - // }; - // boolean ok = dialog.showAndGet(); - // result.consume(ok); - // if (!ok) { - // return; - // } - // - // List toRemove = ContainerUtilRt.newArrayList(); - // for (int i = 0; i < orphanModules.size(); i++) { - // Module module = orphanModules.get(i); - // if (orphanModulesList.isItemSelected(i)) { - // toRemove.add(module); - // } - // else { - // ModuleDataService.unlinkModuleFromExternalSystem(module); - // } - // } - // - // if (!toRemove.isEmpty()) { - // ServiceManager.getService(ProjectDataManager.class).removeData(ProjectKeys.MODULE, toRemove, project, true); - // } - // } - // }); - //} - @SuppressWarnings("ThrowableResultOfMethodCallIgnored") @Nullable private static String extractDetails(@NotNull Throwable e) { @@ -459,16 +311,6 @@ public class ExternalSystemUtil { @NotNull final String externalProjectPath, final boolean isPreviewMode, @NotNull final ProgressExecutionMode progressExecutionMode) { - final PlatformFacade platformFacade = ServiceManager.getService(PlatformFacade.class); - refreshProject(project, platformFacade, externalSystemId, externalProjectPath, isPreviewMode, progressExecutionMode); - } - - public static void refreshProject(@NotNull final Project project, - @NotNull final PlatformFacade platformFacade, - @NotNull final ProjectSystemId externalSystemId, - @NotNull final String externalProjectPath, - final boolean isPreviewMode, - @NotNull final ProgressExecutionMode progressExecutionMode) { refreshProject(project, externalSystemId, externalProjectPath, new ExternalProjectRefreshCallback() { @Override public void onSuccess(@Nullable final DataNode externalProject) { @@ -476,7 +318,7 @@ public class ExternalSystemUtil { return; } final boolean synchronous = progressExecutionMode == ProgressExecutionMode.MODAL_SYNC; - ServiceManager.getService(ProjectDataManager.class).importData(externalProject, project, platformFacade, synchronous); + ServiceManager.getService(ProjectDataManager.class).importData(externalProject, project, synchronous); } @Override @@ -1014,31 +856,10 @@ public class ExternalSystemUtil { } myProjectDataManager.importData(externalProject, myProject, true); - processOrphanProjectLibraries(); } @Override public void onFailure(@NotNull String errorMessage, @Nullable String errorDetails) { } - - private void processOrphanProjectLibraries() { - final PlatformFacade platformFacade = ServiceManager.getService(PlatformFacade.class); - final List orphanIdeLibraries = ContainerUtilRt.newArrayList(); - - platformFacade.updateLibraryTable(myProject, new Consumer() { - @Override - public void consume(LibraryTable.ModifiableModel modifiableModel) { - for (Library library : modifiableModel.getLibraries()) { - if (!ExternalSystemApiUtil.isExternalSystemLibrary(library, myExternalSystemId)) continue; - if (ProjectStructureHelper.isOrphanProjectLibrary(library, platformFacade.getModules(myProject))) { - orphanIdeLibraries.add(library); - } - } - for (Library orphanIdeLibrary : orphanIdeLibraries) { - modifiableModel.removeLibrary(orphanIdeLibrary); - } - } - }); - } } } diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalSystemViewDefaultContributor.java b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalSystemViewDefaultContributor.java index 2632078e9972..02d569af32fc 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalSystemViewDefaultContributor.java +++ b/platform/external-system-impl/src/com/intellij/openapi/externalSystem/view/ExternalSystemViewDefaultContributor.java @@ -17,14 +17,13 @@ package com.intellij.openapi.externalSystem.view; import com.intellij.icons.AllIcons; import com.intellij.ide.projectView.PresentationData; -import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.Key; import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.LibraryDependencyData; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ModuleDependencyData; -import com.intellij.openapi.externalSystem.service.project.ProjectStructureHelper; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; @@ -41,7 +40,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Arrays; import java.util.Collection; -import java.util.Collections; import java.util.List; /** @@ -245,7 +243,7 @@ public class ExternalSystemViewDefaultContributor extends ExternalSystemViewCont if (data == null) return null; final Project project = getProject(); if (project == null) return null; - return ServiceManager.getService(ProjectStructureHelper.class).findIdeModuleOrderEntry(data, project); + return new IdeModifiableModelsProviderImpl(project).findIdeModuleOrderEntry(data); } } } diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/project/ExternalProjectServiceTest.groovy b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/project/ExternalProjectServiceTest.groovy index 3dbd9a933666..8695e77ce573 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/project/ExternalProjectServiceTest.groovy +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/service/project/ExternalProjectServiceTest.groovy @@ -15,17 +15,12 @@ */ package com.intellij.openapi.externalSystem.service.project -import com.intellij.openapi.components.ServiceManager import com.intellij.openapi.externalSystem.model.DataNode import com.intellij.openapi.externalSystem.model.project.ProjectData import com.intellij.openapi.externalSystem.test.AbstractExternalSystemTest import com.intellij.openapi.externalSystem.test.ExternalSystemTestUtil import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil -import com.intellij.openapi.roots.JavadocOrderRootType -import com.intellij.openapi.roots.LibraryOrderEntry -import com.intellij.openapi.roots.ModuleSourceOrderEntry -import com.intellij.openapi.roots.OrderEntry -import com.intellij.openapi.roots.OrderRootType +import com.intellij.openapi.roots.* import com.intellij.openapi.util.io.FileUtil import static com.intellij.openapi.externalSystem.model.project.ExternalSystemSourceType.* @@ -44,12 +39,11 @@ public class ExternalProjectServiceTest extends AbstractExternalSystemTest { applyProjectState([projectNode, projectNode]) - def helper = ServiceManager.getService(ProjectStructureHelper.class) - def module = helper.findIdeModule('module', project) + def modelsProvider = new IdeModifiableModelsProviderImpl(project); + def module = modelsProvider.findIdeModule('module') assertNotNull(module) - - def facade = ServiceManager.getService(PlatformFacade.class) - def entries = facade.getOrderEntries(module) + + def entries = modelsProvider.getOrderEntries(module) def dependencies = [:].withDefault { 0 } for (OrderEntry entry : entries) { if (entry instanceof LibraryOrderEntry) { @@ -86,12 +80,10 @@ public class ExternalProjectServiceTest extends AbstractExternalSystemTest { applyProjectState([projectNodeInitial, projectNodeRefreshed]) - def helper = ServiceManager.getService(ProjectStructureHelper.class) - def module = helper.findIdeModule('module', project) + def modelsProvider = new IdeModifiableModelsProviderImpl(project); + def module = modelsProvider.findIdeModule('module') assertNotNull(module) - - def facade = ServiceManager.getService(PlatformFacade.class) - def entries = facade.getOrderEntries(module) + def entries = modelsProvider.getOrderEntries(module) def folders = [:].withDefault { 0 } for (OrderEntry entry : entries) { if (entry instanceof ModuleSourceOrderEntry) { @@ -128,12 +120,11 @@ public class ExternalProjectServiceTest extends AbstractExternalSystemTest { lib('lib1', level: 'module', bin: [libBinPath.absolutePath], src: [libSrcPath.absolutePath], doc: [libDocPath.absolutePath]) } } } ]) - def helper = ServiceManager.getService(ProjectStructureHelper.class) - def module = helper.findIdeModule('module', project) + def modelsProvider = new IdeModifiableModelsProviderImpl(project); + def module = modelsProvider.findIdeModule('module') assertNotNull(module) - def facade = ServiceManager.getService(PlatformFacade.class) - def entries = facade.getOrderEntries(module) + def entries = modelsProvider.getOrderEntries(module) def dependencies = [:].withDefault { 0 } entries.each { OrderEntry entry -> if (entry instanceof LibraryOrderEntry) { diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalProjectBuilder.groovy b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalProjectBuilder.groovy index 4ed0e3f37ff8..b13c46eb867c 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalProjectBuilder.groovy +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/ExternalProjectBuilder.groovy @@ -116,7 +116,9 @@ class ExternalProjectBuilder extends BuilderSupport { ['bin': LibraryPathType.BINARY, 'src': LibraryPathType.SOURCE, 'doc': LibraryPathType.DOC].each { key, type -> attributes[key]?.each { result.addPath(type, it as String) } } - projectNode.createChild(ProjectKeys.LIBRARY, result) + if (attributes.level != 'module') { + projectNode.createChild(ProjectKeys.LIBRARY, result) + } result } diff --git a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/TestExternalSystemLocalSettings.groovy b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/TestExternalSystemLocalSettings.groovy index 5a5cbb6ce763..7eae9349c707 100644 --- a/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/TestExternalSystemLocalSettings.groovy +++ b/platform/external-system-impl/testSrc/com/intellij/openapi/externalSystem/test/TestExternalSystemLocalSettings.groovy @@ -15,11 +15,10 @@ */ package com.intellij.openapi.externalSystem.test -import com.intellij.openapi.components.ServiceManager -import com.intellij.openapi.externalSystem.service.project.PlatformFacade import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings import com.intellij.openapi.project.Project import org.jetbrains.annotations.NotNull + /** * @author Denis Zhdanov * @since 8/8/13 5:21 PM @@ -27,6 +26,6 @@ import org.jetbrains.annotations.NotNull class TestExternalSystemLocalSettings extends AbstractExternalSystemLocalSettings { TestExternalSystemLocalSettings(@NotNull Project project) { - super(ExternalSystemTestUtil.TEST_EXTERNAL_SYSTEM_ID, project, ServiceManager.getService(project, PlatformFacade.class)) + super(ExternalSystemTestUtil.TEST_EXTERNAL_SYSTEM_ID, project) } } diff --git a/platform/platform-resources/src/META-INF/ExternalSystemExtensions.xml b/platform/platform-resources/src/META-INF/ExternalSystemExtensions.xml index d1f2ba06610e..d94df8f803e0 100644 --- a/platform/platform-resources/src/META-INF/ExternalSystemExtensions.xml +++ b/platform/platform-resources/src/META-INF/ExternalSystemExtensions.xml @@ -12,11 +12,8 @@ - - diff --git a/plugins/google-app-engine/source/com/intellij/appengine/maven/AppEngineFacetImporter.java b/plugins/google-app-engine/source/com/intellij/appengine/maven/AppEngineFacetImporter.java index 36ad582fe080..03236394624c 100644 --- a/plugins/google-app-engine/source/com/intellij/appengine/maven/AppEngineFacetImporter.java +++ b/plugins/google-app-engine/source/com/intellij/appengine/maven/AppEngineFacetImporter.java @@ -28,7 +28,7 @@ import com.intellij.packaging.artifacts.Artifact; import com.intellij.util.io.ZipUtil; import org.jetbrains.annotations.Nullable; import org.jetbrains.idea.maven.importing.FacetImporter; -import org.jetbrains.idea.maven.importing.MavenModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.idea.maven.model.MavenArtifact; import org.jetbrains.idea.maven.model.MavenArtifactInfo; @@ -93,7 +93,7 @@ public class AppEngineFacetImporter extends FacetImporter myCachedGradleHomeFromPath; - public GradleInstallationManager(@NotNull PlatformFacade facade) { - myPlatformFacade = facade; - } - /** * Allows to get file handles for the gradle binaries to use. * @@ -461,7 +456,7 @@ public class GradleInstallationManager { if (project == null) return null; if(rootProjectPath == null) { - for (Module module : myPlatformFacade.getModules(project)) { + for (Module module : ModuleManager.getInstance(project).getModules()) { rootProjectPath = module.getOptionValue(ExternalSystemConstants.ROOT_PROJECT_PATH_KEY); List result = findGradleSdkClasspath(project, rootProjectPath); if(!result.isEmpty()) return result; diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java index 0d6d53e47ae7..21bffe80b967 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/BuildClasspathModuleGradleDataService.java @@ -25,7 +25,8 @@ import com.intellij.openapi.externalSystem.model.project.ExternalModuleBuildClas import com.intellij.openapi.externalSystem.model.project.ExternalProjectBuildClasspathPojo; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ProjectData; -import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; @@ -52,7 +53,7 @@ import java.util.*; * @since 8/27/13 */ @Order(ExternalSystemConstants.UNORDERED) -public class BuildClasspathModuleGradleDataService implements ProjectDataService { +public class BuildClasspathModuleGradleDataService extends AbstractProjectDataService { private static final Logger LOG = Logger.getInstance(BuildClasspathModuleGradleDataService.class); @@ -64,8 +65,9 @@ public class BuildClasspathModuleGradleDataService implements ProjectDataService @Override public void importData(@NotNull final Collection> toImport, + @Nullable ProjectData projectData, @NotNull final Project project, - boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { if (toImport.isEmpty()) { return; } @@ -156,8 +158,4 @@ public class BuildClasspathModuleGradleDataService implements ProjectDataService GradleBuildClasspathManager.getInstance(project).reload(); } - - @Override - public void removeData(@NotNull Collection toRemove, @NotNull Project project, boolean synchronous) { - } } diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/ExternalProjectDataService.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/ExternalProjectDataService.java index 57117db67897..f072265db44f 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/ExternalProjectDataService.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/service/project/data/ExternalProjectDataService.java @@ -16,8 +16,13 @@ package org.jetbrains.plugins.gradle.service.project.data; import com.intellij.openapi.diagnostic.Logger; -import com.intellij.openapi.externalSystem.model.*; -import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService; +import com.intellij.openapi.externalSystem.model.DataNode; +import com.intellij.openapi.externalSystem.model.Key; +import com.intellij.openapi.externalSystem.model.ProjectKeys; +import com.intellij.openapi.externalSystem.model.ProjectSystemId; +import com.intellij.openapi.externalSystem.model.project.ProjectData; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.manage.AbstractProjectDataService; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; @@ -42,7 +47,7 @@ import java.util.Map; * @since 7/17/2014 */ @Order(ExternalSystemConstants.BUILTIN_SERVICE_ORDER) -public class ExternalProjectDataService implements ProjectDataService { +public class ExternalProjectDataService extends AbstractProjectDataService { private static final Logger LOG = Logger.getInstance(ExternalProjectDataService.class); @NotNull public static final Key KEY = Key.create(ExternalProject.class, ProjectKeys.TASK.getProcessingWeight() + 1); @@ -78,8 +83,9 @@ public class ExternalProjectDataService implements ProjectDataService> toImport, + @Nullable ProjectData projectData, @NotNull final Project project, - final boolean synchronous) { + @NotNull IdeModifiableModelsProvider modelsProvider) { if(toImport.isEmpty()) return; if (toImport.size() != 1) { throw new IllegalArgumentException( @@ -88,10 +94,6 @@ public class ExternalProjectDataService implements ProjectDataService modules, @NotNull Project project, boolean synchronous) { - } - @Nullable public ExternalProject getRootExternalProject(@NotNull ProjectSystemId systemId, @NotNull File projectRootDir) { ExternalProject externalProject = myExternalRootProjects.get(Pair.create(systemId, projectRootDir)); diff --git a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java index c5e1025099a2..3da23b6c2c46 100644 --- a/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java +++ b/plugins/gradle/src/org/jetbrains/plugins/gradle/settings/GradleLocalSettings.java @@ -1,7 +1,6 @@ package org.jetbrains.plugins.gradle.settings; import com.intellij.openapi.components.*; -import com.intellij.openapi.externalSystem.service.project.PlatformFacade; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemLocalSettings; import com.intellij.openapi.project.Project; import org.jetbrains.annotations.NotNull; @@ -17,8 +16,8 @@ public class GradleLocalSettings extends AbstractExternalSystemLocalSettings implements PersistentStateComponent { - public GradleLocalSettings(@NotNull Project project, @NotNull PlatformFacade facade) { - super(GradleConstants.SYSTEM_ID, project, facade); + public GradleLocalSettings(@NotNull Project project) { + super(GradleConstants.SYSTEM_ID, project); } @NotNull diff --git a/plugins/maven/maven.iml b/plugins/maven/maven.iml index fe06bee51b51..840f96dee6d9 100644 --- a/plugins/maven/maven.iml +++ b/plugins/maven/maven.iml @@ -73,8 +73,8 @@ - - + + diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java index 38f9db77d711..95124eb25c71 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java @@ -19,6 +19,7 @@ import com.intellij.facet.*; import com.intellij.framework.FrameworkType; import com.intellij.framework.detection.DetectionExcludesConfiguration; import com.intellij.framework.detection.impl.FrameworkDetectionUtil; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.io.FileUtil; @@ -66,7 +67,7 @@ public abstract class FacetImporter mavenProjectToModuleName, List postTasks) { - FACET_TYPE f = findFacet(modifiableModelsProvider.getFacetModel(module)); + FACET_TYPE f = findFacet(modifiableModelsProvider.getModifiableFacetModel(module)); if (f == null) return; // facet may has been removed between preProcess and process calls if (!isFacetDetectionDisabled(module.getProject())) { @@ -128,7 +129,7 @@ public abstract class FacetImporter myRootModels = new THashMap(); - protected Map myFacetModels = new THashMap(); - protected Map myLibraryModels = new IdentityHashMap(); - protected ModifiableArtifactModel myArtifactModel; - protected final Project myProject; - private MavenBaseModifiableModelsProvider.MyPackagingElementResolvingContext myPackagingElementResolvingContext; - private final ArtifactExternalDependenciesImporter myArtifactExternalDependenciesImporter; - - public MavenBaseModifiableModelsProvider(Project project) { - myProject = project; - myArtifactExternalDependenciesImporter = new ArtifactExternalDependenciesImporter(); - } - - public ModifiableModuleModel getModuleModel() { - if (myModuleModel == null) { - myModuleModel = doGetModuleModel(); - } - return myModuleModel; - } - - public ModifiableRootModel getRootModel(@NotNull Module module) { - ModifiableRootModel result = myRootModels.get(module); - if (result == null) { - result = doGetRootModel(module); - myRootModels.put(module, result); - } - return result; - } - - public ModifiableFacetModel getFacetModel(Module module) { - ModifiableFacetModel result = myFacetModels.get(module); - if (result == null) { - result = doGetFacetModel(module); - myFacetModels.put(module, result); - } - return result; - } - - public ModifiableArtifactModel getArtifactModel() { - if (myArtifactModel == null) { - myArtifactModel = doGetArtifactModel(); - } - return myArtifactModel; - } - - public PackagingElementResolvingContext getPackagingElementResolvingContext() { - if (myPackagingElementResolvingContext == null) { - myPackagingElementResolvingContext = new MyPackagingElementResolvingContext(); - } - return myPackagingElementResolvingContext; - } - - public ArtifactExternalDependenciesImporter getArtifactExternalDependenciesImporter() { - return myArtifactExternalDependenciesImporter; - } - - public Library.ModifiableModel getLibraryModel(Library library) { - Library.ModifiableModel result = myLibraryModels.get(library); - if (result == null) { - result = doGetLibraryModel(library); - myLibraryModels.put(library, result); - } - return result; - } - - @NotNull - @Override - public String[] getLibraryUrls(@NotNull Library library, @NotNull OrderRootType type) { - final Library.ModifiableModel model = myLibraryModels.get(library); - if (model != null) { - return model.getUrls(type); - } - return library.getUrls(type); - } - - protected abstract ModifiableArtifactModel doGetArtifactModel(); - - protected abstract ModifiableModuleModel doGetModuleModel(); - - protected abstract ModifiableRootModel doGetRootModel(Module module); - - protected abstract ModifiableFacetModel doGetFacetModel(Module module); - - protected abstract Library.ModifiableModel doGetLibraryModel(Library library); - - public Module[] getModules() { - return getModuleModel().getModules(); - } - - protected void processExternalArtifactDependencies() { - myArtifactExternalDependenciesImporter.applyChanges(getArtifactModel(), getPackagingElementResolvingContext()); - } - - public VirtualFile[] getContentRoots(Module module) { - return getRootModel(module).getContentRoots(); - } - - private class MyPackagingElementResolvingContext implements PackagingElementResolvingContext { - private final ModulesProvider myModulesProvider = new MavenModulesProvider(); - private final MavenFacetsProvider myFacetsProvider = new MavenFacetsProvider(); - private final DefaultManifestFileProvider myManifestFileProvider = new DefaultManifestFileProvider(this); - - @NotNull - public Project getProject() { - return myProject; - } - - @NotNull - public ArtifactModel getArtifactModel() { - return MavenBaseModifiableModelsProvider.this.getArtifactModel(); - } - - @NotNull - public ModulesProvider getModulesProvider() { - return myModulesProvider; - } - - @NotNull - public FacetsProvider getFacetsProvider() { - return myFacetsProvider; - } - - public Library findLibrary(@NotNull String level, @NotNull String libraryName) { - if (level.equals(LibraryTablesRegistrar.PROJECT_LEVEL)) { - return getLibraryByName(libraryName); - } - final LibraryTable table = LibraryTablesRegistrar.getInstance().getLibraryTableByLevel(level, myProject); - return table != null ? table.getLibraryByName(libraryName) : null; - } - - @NotNull - @Override - public ManifestFileProvider getManifestFileProvider() { - return myManifestFileProvider; - } - } - - private class MavenModulesProvider implements ModulesProvider { - @NotNull - public Module[] getModules() { - return getModuleModel().getModules(); - } - - public Module getModule(String name) { - return getModuleModel().findModuleByName(name); - } - - public ModuleRootModel getRootModel(@NotNull Module module) { - return MavenBaseModifiableModelsProvider.this.getRootModel(module); - } - - public FacetModel getFacetModel(@NotNull Module module) { - return MavenBaseModifiableModelsProvider.this.getFacetModel(module); - } - } - - private class MavenFacetsProvider implements FacetsProvider { - @NotNull - public Facet[] getAllFacets(Module module) { - return getFacetModel(module).getAllFacets(); - } - - @NotNull - public Collection getFacetsByType(Module module, FacetTypeId type) { - return getFacetModel(module).getFacetsByType(type); - } - - public F findFacet(Module module, FacetTypeId type, String name) { - return getFacetModel(module).findFacet(type, name); - } - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java deleted file mode 100644 index 8b289fa81f05..000000000000 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenDefaultModifiableModelsProvider.java +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright 2000-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.jetbrains.idea.maven.importing; - -import com.intellij.facet.FacetManager; -import com.intellij.facet.ModifiableFacetModel; -import com.intellij.openapi.application.*; -import com.intellij.openapi.module.ModifiableModuleModel; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.project.Project; -import com.intellij.openapi.roots.ModifiableRootModel; -import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.ProjectRootManager; -import com.intellij.openapi.roots.ex.ProjectRootManagerEx; -import com.intellij.openapi.roots.impl.ModifiableModelCommitter; -import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable; -import com.intellij.openapi.roots.libraries.Library; -import com.intellij.openapi.roots.libraries.LibraryTable; -import com.intellij.packaging.artifacts.ArtifactManager; -import com.intellij.packaging.artifacts.ModifiableArtifactModel; -import org.jetbrains.annotations.NotNull; - -import java.util.Collection; - -public class MavenDefaultModifiableModelsProvider extends MavenBaseModifiableModelsProvider { - private final LibraryTable.ModifiableModel myLibrariesModel; - - public MavenDefaultModifiableModelsProvider(Project project) { - super(project); - myLibrariesModel = ProjectLibraryTable.getInstance(myProject).getModifiableModel(); - } - - @Override - protected ModifiableArtifactModel doGetArtifactModel() { - return new ReadAction() { - protected void run(@NotNull final Result result) { - result.setResult(ArtifactManager.getInstance(myProject).createModifiableModel()); - } - }.execute().getResultObject(); - } - - @Override - protected ModifiableModuleModel doGetModuleModel() { - AccessToken accessToken = ApplicationManager.getApplication().acquireReadActionLock(); - try { - return ModuleManager.getInstance(myProject).getModifiableModel(); - } - finally { - accessToken.finish(); - } - } - - @Override - protected ModifiableRootModel doGetRootModel(@NotNull final Module module) { - return new ReadAction() { - protected void run(@NotNull Result result) throws Throwable { - result.setResult(ModuleRootManager.getInstance(module).getModifiableModel()); - } - }.execute().getResultObject(); - } - - @Override - protected ModifiableFacetModel doGetFacetModel(Module module) { - return FacetManager.getInstance(module).createModifiableModel(); - } - - @Override - public LibraryTable.ModifiableModel getProjectLibrariesModel() { - return myLibrariesModel; - } - - public Library[] getAllLibraries() { - return myLibrariesModel.getLibraries(); - } - - public Library getLibraryByName(String name) { - return myLibrariesModel.getLibraryByName(name); - } - - public Library createLibrary(String name) { - return myLibrariesModel.createLibrary(name); - } - - public void removeLibrary(Library library) { - myLibrariesModel.removeLibrary(library); - } - - @Override - protected Library.ModifiableModel doGetLibraryModel(Library library) { - return library.getModifiableModel(); - } - - public void commit() { - ((ProjectRootManagerEx)ProjectRootManager.getInstance(myProject)).mergeRootsChangesDuring(new Runnable() { - public void run() { - processExternalArtifactDependencies(); - for (Library.ModifiableModel each : myLibraryModels.values()) { - each.commit(); - } - myLibrariesModel.commit(); - Collection rootModels = myRootModels.values(); - - ModifiableRootModel[] rootModels1 = rootModels.toArray(new ModifiableRootModel[rootModels.size()]); - for (ModifiableRootModel model : rootModels1) { - assert !model.isDisposed() : "Already disposed: " + model; - } - - if (myModuleModel != null) { - ModifiableModelCommitter.multiCommit(rootModels1, myModuleModel); - } - - for (ModifiableFacetModel each : myFacetModels.values()) { - each.commit(); - } - if (myArtifactModel != null) { - myArtifactModel.commit(); - } - } - }); - } - - public void dispose() { - for (ModifiableRootModel each : myRootModels.values()) { - each.dispose(); - } - myModuleModel.dispose(); - if (myArtifactModel != null) { - myArtifactModel.dispose(); - } - } - - public ModalityState getModalityStateForQuestionDialogs() { - return ModalityState.NON_MODAL; - } -} diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java index 1b40dfadccee..21cb8690c1a6 100755 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenFoldersImporter.java @@ -19,6 +19,7 @@ import com.intellij.ide.util.projectWizard.importSources.JavaModuleSourceRoot; import com.intellij.ide.util.projectWizard.importSources.JavaSourceRootDetectionUtil; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.WriteAction; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.project.Project; @@ -64,7 +65,7 @@ public class MavenFoldersImporter { MavenProject mavenProject = manager.findProject(each); if (mavenProject == null) continue; - MavenRootModelAdapter a = new MavenRootModelAdapter(mavenProject, each, new MavenDefaultModifiableModelsProvider(project)); + MavenRootModelAdapter a = new MavenRootModelAdapter(mavenProject, each, new IdeModifiableModelsProviderImpl(project)); new MavenFoldersImporter(mavenProject, settings, a).config(updateTargetFoldersOnly); ModifiableRootModel model = a.getRootModel(); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java index 7732bd15d3a7..6657cfc692b2 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenImporter.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.extensions.ExtensionPointName; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.module.StdModuleTypes; @@ -138,9 +139,9 @@ public abstract class MavenImporter { public abstract void preProcess(Module module, MavenProject mavenProject, MavenProjectChanges changes, - MavenModifiableModelsProvider modifiableModelsProvider); + IdeModifiableModelsProvider modifiableModelsProvider); - public abstract void process(MavenModifiableModelsProvider modifiableModelsProvider, + public abstract void process(IdeModifiableModelsProvider modifiableModelsProvider, Module module, MavenRootModelAdapter rootModel, MavenProjectsTree mavenModel, @@ -152,7 +153,7 @@ public abstract class MavenImporter { public void postProcess(Module module, MavenProject mavenProject, MavenProjectChanges changes, - MavenModifiableModelsProvider modifiableModelsProvider) { + IdeModifiableModelsProvider modifiableModelsProvider) { } public boolean processChangedModulesOnly() { diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java index 954706999ba3..34cf8b44530c 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenModuleImporter.java @@ -21,6 +21,7 @@ import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; import com.intellij.openapi.roots.*; @@ -65,7 +66,7 @@ public class MavenModuleImporter { private final MavenProjectChanges myMavenProjectChanges; private final Map myMavenProjectToModuleName; private final MavenImportingSettings mySettings; - private final MavenModifiableModelsProvider myModifiableModelsProvider; + private final IdeModifiableModelsProvider myModifiableModelsProvider; private MavenRootModelAdapter myRootModelAdapter; public MavenModuleImporter(Module module, @@ -74,7 +75,7 @@ public class MavenModuleImporter { @Nullable MavenProjectChanges changes, Map mavenProjectToModuleName, MavenImportingSettings settings, - MavenModifiableModelsProvider modifiableModelsProvider) { + IdeModifiableModelsProvider modifiableModelsProvider) { myModule = module; myMavenTree = mavenTree; myMavenProject = mavenProject; @@ -332,7 +333,7 @@ public class MavenModuleImporter { if (library == null) { library = myModifiableModelsProvider.createLibrary(libraryName); } - libraryModel = myModifiableModelsProvider.getLibraryModel(library); + libraryModel = myModifiableModelsProvider.getModifiableLibraryModel(library); LibraryOrderEntry entry = myRootModelAdapter.getRootModel().addLibraryEntry(library); entry.setScope(scope); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java index a7b5a600516d..0e86ade4d880 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenProjectImporter.java @@ -18,6 +18,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.compiler.impl.javaCompiler.javac.JavacConfiguration; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleType; @@ -61,7 +62,7 @@ public class MavenProjectImporter { private volatile Map myProjectsToImportWithChanges; private volatile Set myAllProjects; private final boolean myImportModuleGroupsRequired; - private final MavenModifiableModelsProvider myModelsProvider; + private final IdeModifiableModelsProvider myModelsProvider; private final MavenImportingSettings myImportingSettings; private final ModifiableModuleModel myModuleModel; @@ -77,7 +78,7 @@ public class MavenProjectImporter { Map fileToModuleMapping, Map projectsToImportWithChanges, boolean importModuleGroupsRequired, - MavenModifiableModelsProvider modelsProvider, + IdeModifiableModelsProvider modelsProvider, MavenImportingSettings importingSettings) { myProject = p; myProjectsTree = projectsTree; @@ -87,7 +88,7 @@ public class MavenProjectImporter { myModelsProvider = modelsProvider; myImportingSettings = importingSettings; - myModuleModel = modelsProvider.getModuleModel(); + myModuleModel = modelsProvider.getModifiableModuleModel(); } @Nullable @@ -605,12 +606,12 @@ public class MavenProjectImporter { Map rootModels = new THashMap(); for (MavenProject each : myProjectsToImportWithChanges.keySet()) { Module module = myMavenProjectToModule.get(each); - ModifiableRootModel rootModel = myModelsProvider.getRootModel(module); + ModifiableRootModel rootModel = myModelsProvider.getModifiableRootModel(module); rootModels.put(module, rootModel); } for (Module each : myModuleModel.getModules()) { if (rootModels.containsKey(each)) continue; - rootModels.put(each, myModelsProvider.getRootModel(each)); + rootModels.put(each, myModelsProvider.getModifiableRootModel(each)); } return rootModels.values(); } diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java index e2a313ef30a9..ed4f931af2db 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/MavenRootModelAdapter.java @@ -17,6 +17,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.application.AccessToken; import com.intellij.openapi.application.ReadAction; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -61,10 +62,10 @@ public class MavenRootModelAdapter { private final Set myOrderEntriesBeforeJdk = new THashSet(); - public MavenRootModelAdapter(@NotNull MavenProject p, @NotNull Module module, final MavenModifiableModelsProvider rootModelsProvider) { + public MavenRootModelAdapter(@NotNull MavenProject p, @NotNull Module module, final IdeModifiableModelsProvider rootModelsProvider) { myMavenProject = p; - myModuleModel = rootModelsProvider.getModuleModel(); - myRootModel = rootModelsProvider.getRootModel(module); + myModuleModel = rootModelsProvider.getModifiableModuleModel(); + myRootModel = rootModelsProvider.getModifiableRootModel(module); myRootModelModuleExtension = myRootModel.getModuleExtension(MavenSourceFoldersModuleExtension.class); myRootModelModuleExtension.init(module, myRootModel); @@ -329,7 +330,7 @@ public class MavenRootModelAdapter { public void addLibraryDependency(MavenArtifact artifact, DependencyScope scope, - MavenModifiableModelsProvider provider, + IdeModifiableModelsProvider provider, MavenProject project) { assert !MavenConstants.SCOPE_SYSTEM.equals(artifact.getScope()); // System dependencies must be added ad module library, not as project wide library. @@ -339,7 +340,7 @@ public class MavenRootModelAdapter { if (library == null) { library = provider.createLibrary(libraryName); } - Library.ModifiableModel libraryModel = provider.getLibraryModel(library); + Library.ModifiableModel libraryModel = provider.getModifiableLibraryModel(library); updateUrl(libraryModel, OrderRootType.CLASSES, artifact, null, null, true); updateUrl(libraryModel, OrderRootType.SOURCES, artifact, MavenExtraArtifactType.SOURCES, project, false); diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java index 44165b6e7ad2..4f219a262781 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/project/MavenProjectsManager.java @@ -27,6 +27,8 @@ import com.intellij.openapi.compiler.CompileContext; import com.intellij.openapi.compiler.CompileTask; import com.intellij.openapi.compiler.CompilerManager; import com.intellij.openapi.components.*; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.module.Module; @@ -55,9 +57,7 @@ import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.TestOnly; import org.jetbrains.concurrency.AsyncPromise; import org.jetbrains.concurrency.Promise; -import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; import org.jetbrains.idea.maven.importing.MavenFoldersImporter; -import org.jetbrains.idea.maven.importing.MavenModifiableModelsProvider; import org.jetbrains.idea.maven.importing.MavenProjectImporter; import org.jetbrains.idea.maven.model.*; import org.jetbrains.idea.maven.server.MavenEmbedderWrapper; @@ -1130,10 +1130,10 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent } public List importProjects() { - return importProjects(new MavenDefaultModifiableModelsProvider(myProject)); + return importProjects(new IdeModifiableModelsProviderImpl(myProject)); } - public List importProjects(final MavenModifiableModelsProvider modelsProvider) { + public List importProjects(final IdeModifiableModelsProvider modelsProvider) { final Map projectsToImportWithChanges; final boolean importModuleGroupsRequired; synchronized (myImportingDataLock) { @@ -1150,7 +1150,17 @@ public class MavenProjectsManager extends MavenSimpleProjectComponent public void run() { MavenProjectImporter projectImporter = new MavenProjectImporter(myProject, myProjectsTree, - getFileToModuleMapping(modelsProvider), + getFileToModuleMapping(new MavenModelsProvider() { + @Override + public Module[] getModules() { + return modelsProvider.getModules(); + } + + @Override + public VirtualFile[] getContentRoots(Module module) { + return modelsProvider.getContentRoots(module); + } + }), projectsToImportWithChanges, importModuleGroupsRequired, modelsProvider, diff --git a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java index 730284863e32..0a2b4cc3f370 100644 --- a/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java +++ b/plugins/maven/src/main/java/org/jetbrains/idea/maven/wizards/MavenProjectBuilder.java @@ -34,8 +34,8 @@ import com.intellij.projectImport.ProjectImportBuilder; import icons.MavenIcons; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; -import org.jetbrains.idea.maven.importing.MavenUIModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; +import com.intellij.openapi.externalSystem.service.project.IdeUIModifiableModelsProvider; import org.jetbrains.idea.maven.model.MavenExplicitProfiles; import org.jetbrains.idea.maven.model.MavenId; import org.jetbrains.idea.maven.project.*; @@ -130,8 +130,8 @@ public class MavenProjectBuilder extends ProjectImportBuilder { boolean isFromUI = model != null; return manager.importProjects(isFromUI - ? new MavenUIModifiableModelsProvider(project, model, (ModulesConfigurator)modulesProvider, artifactModel) - : new MavenDefaultModifiableModelsProvider(project)); + ? new IdeUIModifiableModelsProvider(project, model, (ModulesConfigurator)modulesProvider, artifactModel) + : new IdeModifiableModelsProviderImpl(project)); } private void appendProfilesFromString(Collection selectedProfiles, String profilesList) { diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java index be14a088389a..2666bd9a0b51 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/FoldersImportingTest.java @@ -16,9 +16,8 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.vfs.VirtualFile; -import junit.framework.Test; -import junit.framework.TestSuite; import org.jetbrains.idea.maven.MavenCustomRepositoryHelper; import org.jetbrains.idea.maven.MavenImportingTestCase; import org.jetbrains.idea.maven.project.MavenImportingSettings; @@ -101,7 +100,7 @@ public class FoldersImportingTest extends MavenImportingTestCase { public void run() { MavenRootModelAdapter adapter = new MavenRootModelAdapter(myProjectsTree.findProject(myProjectPom), getModule("project"), - new MavenDefaultModifiableModelsProvider(myProject)); + new IdeModifiableModelsProviderImpl(myProject)); adapter.addSourceFolder(dir1.getPath(), JavaSourceRootType.SOURCE); adapter.addExcludedFolder(dir2.getPath()); adapter.getRootModel().commit(); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java index 4f7c7f957aff..6aae8144fb2d 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/GroovyImporterTest.java @@ -5,6 +5,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.openapi.application.ApplicationManager; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.roots.OrderRootType; import com.intellij.openapi.roots.libraries.Library; import org.jetbrains.idea.maven.MavenImportingTestCase; @@ -487,7 +488,7 @@ public class GroovyImporterTest extends MavenImportingTestCase { public void run() { MavenRootModelAdapter a = new MavenRootModelAdapter(myProjectsTree.findProject(myProjectPom), getModule("project"), - new MavenDefaultModifiableModelsProvider(myProject)); + new IdeModifiableModelsProviderImpl(myProject)); a.unregisterAll(getProjectPath() + "/target", true, true); a.getRootModel().commit(); } diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java index 3b190ce5cc2a..6553107505d9 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/importing/MiscImportingTest.java @@ -16,6 +16,7 @@ package org.jetbrains.idea.maven.importing; import com.intellij.ProjectTopics; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; import com.intellij.openapi.module.ModuleManager; @@ -367,7 +368,7 @@ public class MiscImportingTest extends MavenImportingTestCase { assertModules("project", "m1", "m2"); myProjectsManager.scheduleImportInTests(myProjectsManager.getProjectsFiles()); - myProjectsManager.importProjects(new MavenDefaultModifiableModelsProvider(myProject) { + myProjectsManager.importProjects(new IdeModifiableModelsProviderImpl(myProject) { @Override public void commit() { ModifiableModuleModel model = ModuleManager.getInstance(myProject).getModifiableModel(); diff --git a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenFoldersImporterTest.java b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenFoldersImporterTest.java index cea4ea2232e9..8ad2fb98fb1b 100644 --- a/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenFoldersImporterTest.java +++ b/plugins/maven/src/test/java/org/jetbrains/idea/maven/project/MavenFoldersImporterTest.java @@ -23,7 +23,7 @@ import com.intellij.openapi.vcs.changes.ChangeListManager; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.util.Consumer; import org.jetbrains.idea.maven.MavenImportingTestCase; -import org.jetbrains.idea.maven.importing.MavenDefaultModifiableModelsProvider; +import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProviderImpl; import org.jetbrains.idea.maven.importing.MavenFoldersImporter; import org.jetbrains.idea.maven.importing.MavenRootModelAdapter; import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes; @@ -140,7 +140,7 @@ public class MavenFoldersImporterTest extends MavenImportingTestCase { public void run() { MavenRootModelAdapter adapter = new MavenRootModelAdapter(myProjectsTree.findProject(myProjectPom), getModule("project"), - new MavenDefaultModifiableModelsProvider(myProject)); + new IdeModifiableModelsProviderImpl(myProject)); adapter.addSourceFolder(sourceDir.getPath(), JavaSourceRootType.SOURCE); adapter.getRootModel().commit(); } @@ -171,7 +171,7 @@ public class MavenFoldersImporterTest extends MavenImportingTestCase { public void run() { MavenRootModelAdapter adapter = new MavenRootModelAdapter(myProjectsTree.findProject(myProjectPom), getModule("project"), - new MavenDefaultModifiableModelsProvider(myProject)); + new IdeModifiableModelsProviderImpl(myProject)); adapter.useModuleOutput(new File(myProjectRoot.getPath(), "target/my-classes").getPath(), new File(myProjectRoot.getPath(), "target/my-test-classes").getPath()); adapter.getRootModel().commit();