From 9c5ffd4573e4f8fddf3cefc19ddf18687527ee5e Mon Sep 17 00:00:00 2001 From: "Vladislav.Soroka" Date: Wed, 5 Jun 2019 13:03:14 +0300 Subject: [PATCH] ES: extract packaging modifiable models to java plugin IDEA-187832 GitOrigin-RevId: 67f8209b711806a587d041fd1adc9529ea002916 --- .../project/settings/ArtifactsImporter.kt | 6 +- .../openapi/intellij.java.compiler.iml | 1 + ...der.java => PackagingModifiableModel.java} | 3 +- .../resources/META-INF/JavaIdePlugin.xml | 5 + java/idea-ui/intellij.java.ui.iml | 2 + .../action/AttachExternalProjectAction.java | 0 ...ifactExternalDependenciesImporterImpl.java | 0 .../ExternalModuleStructureExtension.java | 20 +- .../IdeUIModifiableModelsProvider.java | 20 +- .../project/PackagingModifiableModelImpl.java | 276 ++++++++++++++++++ .../PackagingModifiableModelProvider.java | 19 ++ .../AbstractExternalProjectImportBuilder.java | 0 ...AbstractExternalProjectImportProvider.java | 0 ...actImportFromExternalSystemWizardStep.java | 0 .../wizard/SelectExternalProjectStep.java | 0 ...stractImportFromExternalSystemControl.java | 0 java/java-impl/src/META-INF/JavaPlugin.xml | 3 + .../project/IdeModifiableModelsProvider.java | 8 + .../service/project/ModifiableModel.java | 12 + .../ModifiableModelsProviderExtension.java | 13 + .../intellij.platform.externalSystem.impl.iml | 1 - .../AbstractIdeModifiableModelsProvider.java | 171 ++--------- .../IdeModifiableModelsProviderImpl.java | 106 ------- .../project/manage/LibraryDataService.java | 3 +- .../ExternalSystemExtensionPoints.xml | 2 + .../src/META-INF/ExternalSystemExtensions.xml | 3 - .../src/idea/ExternalSystemActions.xml | 4 +- .../maven/AppEngineFacetImporter.java | 4 +- .../settings/ImportFromGradleControl.java | 0 .../GradleProjectSettingsControl.java | 1 - .../idea/maven/importing/FacetImporter.java | 14 - 31 files changed, 386 insertions(+), 311 deletions(-) rename java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/{ModifiableArtifactsProvider.java => PackagingModifiableModel.java} (81%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java (100%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java (100%) rename {platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage => java/idea-ui/src/com/intellij/openapi/externalSystem/service/project}/ExternalModuleStructureExtension.java (91%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java (79%) create mode 100644 java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java create mode 100644 java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelProvider.java rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java (100%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportProvider.java (100%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractImportFromExternalSystemWizardStep.java (100%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/project/wizard/SelectExternalProjectStep.java (100%) rename {platform/external-system-impl => java/idea-ui}/src/com/intellij/openapi/externalSystem/service/settings/AbstractImportFromExternalSystemControl.java (100%) create mode 100644 platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModel.java create mode 100644 platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModelsProviderExtension.java rename plugins/gradle/{src/org/jetbrains/plugins/gradle => java/src}/service/settings/ImportFromGradleControl.java (100%) diff --git a/java/compiler/impl/src/com/intellij/openapi/externalSystem/service/project/settings/ArtifactsImporter.kt b/java/compiler/impl/src/com/intellij/openapi/externalSystem/service/project/settings/ArtifactsImporter.kt index 9a744391d4d8..4db787bebe2b 100644 --- a/java/compiler/impl/src/com/intellij/openapi/externalSystem/service/project/settings/ArtifactsImporter.kt +++ b/java/compiler/impl/src/com/intellij/openapi/externalSystem/service/project/settings/ArtifactsImporter.kt @@ -5,7 +5,7 @@ import com.intellij.execution.BeforeRunTask import com.intellij.execution.BeforeRunTaskProvider import com.intellij.execution.configurations.RunConfiguration import com.intellij.openapi.externalSystem.model.project.settings.ConfigurationData -import com.intellij.openapi.externalSystem.project.ModifiableArtifactsProvider +import com.intellij.openapi.externalSystem.project.PackagingModifiableModel import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager @@ -25,14 +25,14 @@ import com.intellij.util.ObjectUtils.consumeIfCast class ArtifactsImporter: ConfigurationHandler { override fun apply(project: Project, modelsProvider: IdeModifiableModelsProvider, configuration: ConfigurationData) { - if (modelsProvider !is ModifiableArtifactsProvider) return val artifacts = configuration.find("ideArtifacts") as? List<*> ?: return if (artifacts.isEmpty()) { return } - val modifiableModel = modelsProvider.modifiableArtifactModel + val packagingModifiableModel = modelsProvider.getModifiableModel(PackagingModifiableModel::class.java) + val modifiableModel = packagingModifiableModel.modifiableArtifactModel val postponedOps: MutableList<(ModifiableArtifactModel) -> Unit> = mutableListOf() artifacts.forEach { value -> diff --git a/java/compiler/openapi/intellij.java.compiler.iml b/java/compiler/openapi/intellij.java.compiler.iml index 539164484755..b336de000db0 100644 --- a/java/compiler/openapi/intellij.java.compiler.iml +++ b/java/compiler/openapi/intellij.java.compiler.iml @@ -11,6 +11,7 @@ + diff --git a/java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/ModifiableArtifactsProvider.java b/java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/PackagingModifiableModel.java similarity index 81% rename from java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/ModifiableArtifactsProvider.java rename to java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/PackagingModifiableModel.java index 49f402eac2eb..2575865db554 100644 --- a/java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/ModifiableArtifactsProvider.java +++ b/java/compiler/openapi/src/com/intellij/openapi/externalSystem/project/PackagingModifiableModel.java @@ -1,11 +1,12 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.externalSystem.project; +import com.intellij.openapi.externalSystem.service.project.ModifiableModel; import com.intellij.packaging.artifacts.ModifiableArtifactModel; import com.intellij.packaging.elements.PackagingElementResolvingContext; import org.jetbrains.annotations.NotNull; -public interface ModifiableArtifactsProvider { +public interface PackagingModifiableModel extends ModifiableModel { @NotNull ModifiableArtifactModel getModifiableArtifactModel(); diff --git a/java/ide-resources/resources/META-INF/JavaIdePlugin.xml b/java/ide-resources/resources/META-INF/JavaIdePlugin.xml index 352138b621cc..3fc4bb82c3aa 100644 --- a/java/ide-resources/resources/META-INF/JavaIdePlugin.xml +++ b/java/ide-resources/resources/META-INF/JavaIdePlugin.xml @@ -161,5 +161,10 @@ + + + + diff --git a/java/idea-ui/intellij.java.ui.iml b/java/idea-ui/intellij.java.ui.iml index 4cfaa00f7ba4..df394e523bfb 100644 --- a/java/idea-ui/intellij.java.ui.iml +++ b/java/idea-ui/intellij.java.ui.iml @@ -16,5 +16,7 @@ + + \ No newline at end of file diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/action/AttachExternalProjectAction.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/ArtifactExternalDependenciesImporterImpl.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalModuleStructureExtension.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/ExternalModuleStructureExtension.java similarity index 91% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalModuleStructureExtension.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/ExternalModuleStructureExtension.java index ca3a10c38c5f..75f832ea618d 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/manage/ExternalModuleStructureExtension.java +++ b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/ExternalModuleStructureExtension.java @@ -1,25 +1,12 @@ -/* - * Copyright 2000-2017 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; +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.openapi.externalSystem.service.project; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.externalSystem.ExternalSystemManager; import com.intellij.openapi.externalSystem.ExternalSystemModulePropertyManager; import com.intellij.openapi.externalSystem.model.ProjectSystemId; +import com.intellij.openapi.externalSystem.service.project.manage.ExternalProjectsManagerImpl; import com.intellij.openapi.externalSystem.settings.AbstractExternalSystemSettings; import com.intellij.openapi.externalSystem.settings.ExternalProjectSettings; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; @@ -46,7 +33,6 @@ import java.util.Map; public class ExternalModuleStructureExtension extends ModuleStructureExtension { private static final Logger LOG = Logger.getInstance(ExternalModuleStructureExtension.class); - @SuppressWarnings("StatefulEp") @Nullable private Project myProject; private boolean isExternalSystemsInvolved; diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java similarity index 79% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java index b416e2e5a190..227dffd407b8 100644 --- a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java +++ b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/IdeUIModifiableModelsProvider.java @@ -1,18 +1,4 @@ -/* - * 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. - */ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.openapi.externalSystem.service.project; import com.intellij.facet.ModifiableFacetModel; @@ -54,8 +40,7 @@ public class IdeUIModifiableModelsProvider extends AbstractIdeModifiableModelsPr return myLibrariesModel; } - @Override - protected ModifiableArtifactModel doGetModifiableArtifactModel() { + public ModifiableArtifactModel getModifiableArtifactModel() { return myModifiableArtifactModel; } @@ -81,7 +66,6 @@ public class IdeUIModifiableModelsProvider extends AbstractIdeModifiableModelsPr @Override public void commit() { - processExternalArtifactDependencies(); } @Override diff --git a/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java new file mode 100644 index 000000000000..345d3a867768 --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelImpl.java @@ -0,0 +1,276 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +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.openapi.application.ReadAction; +import com.intellij.openapi.externalSystem.project.ArtifactExternalDependenciesImporter; +import com.intellij.openapi.externalSystem.project.PackagingModifiableModel; +import com.intellij.openapi.module.Module; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ModuleRootModel; +import com.intellij.openapi.roots.ProjectModelExternalSource; +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.packaging.artifacts.*; +import com.intellij.packaging.elements.CompositePackagingElement; +import com.intellij.packaging.elements.ManifestFileProvider; +import com.intellij.packaging.elements.PackagingElementResolvingContext; +import com.intellij.packaging.impl.artifacts.DefaultManifestFileProvider; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Collection; +import java.util.List; + +public class PackagingModifiableModelImpl implements PackagingModifiableModel { + + private final Project myProject; + private final IdeModifiableModelsProvider myModelsProvider; + private ModifiableArtifactModel myModifiableArtifactModel; + private MyPackagingElementResolvingContext myPackagingElementResolvingContext; + private final ArtifactExternalDependenciesImporter myArtifactExternalDependenciesImporter; + + public PackagingModifiableModelImpl(@NotNull Project project, @NotNull IdeModifiableModelsProvider modifiableModelsProvider) { + myProject = project; + myModelsProvider = modifiableModelsProvider; + myArtifactExternalDependenciesImporter = new ArtifactExternalDependenciesImporterImpl(); + } + + @Override + @NotNull + public ModifiableArtifactModel getModifiableArtifactModel() { + if (myModifiableArtifactModel == null) { + myModifiableArtifactModel = myModelsProvider instanceof IdeUIModifiableModelsProvider + ? + ((IdeUIModifiableModelsProvider)myModelsProvider).getModifiableArtifactModel() + : doGetModifiableArtifactModel(); + } + return myModifiableArtifactModel; + } + + private ModifiableArtifactModel doGetModifiableArtifactModel() { + return ReadAction.compute(() -> { + ArtifactManager artifactManager = ArtifactManager.getInstance(myProject); + return artifactManager != null ? artifactManager.createModifiableModel() : new DummyArtifactModel(); + }); + } + + @NotNull + @Override + public PackagingElementResolvingContext getPackagingElementResolvingContext() { + if (myPackagingElementResolvingContext == null) { + myPackagingElementResolvingContext = new MyPackagingElementResolvingContext(); + } + return myPackagingElementResolvingContext; + } + + @Override + public ArtifactExternalDependenciesImporter getArtifactExternalDependenciesImporter() { + return myArtifactExternalDependenciesImporter; + } + + @Override + public void commit() { + myArtifactExternalDependenciesImporter.applyChanges(getModifiableArtifactModel(), getPackagingElementResolvingContext()); + if (myModifiableArtifactModel != null) { + myModifiableArtifactModel.commit(); + } + } + + @Override + public void dispose() { + if (myModifiableArtifactModel != null) { + myModifiableArtifactModel.commit(); + } + } + + private class MyPackagingElementResolvingContext implements PackagingElementResolvingContext { + private final ModulesProvider myModulesProvider = new MyModulesProvider(); + private final MyFacetsProvider myFacetsProvider = new MyFacetsProvider(); + private final ManifestFileProvider myManifestFileProvider = new DefaultManifestFileProvider(this); + + @Override + @NotNull + public Project getProject() { + return myProject; + } + + @Override + @NotNull + public ArtifactModel getArtifactModel() { + return PackagingModifiableModelImpl.this.getModifiableArtifactModel(); + } + + @Override + @NotNull + public ModulesProvider getModulesProvider() { + return myModulesProvider; + } + + @Override + @NotNull + public FacetsProvider getFacetsProvider() { + return myFacetsProvider; + } + + @Override + public Library findLibrary(@NotNull String level, @NotNull String libraryName) { + if (level.equals(LibraryTablesRegistrar.PROJECT_LEVEL)) { + return myModelsProvider.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 { + @Override + @NotNull + public Module[] getModules() { + return myModelsProvider.getModules(); + } + + @Override + public Module getModule(@NotNull String name) { + return myModelsProvider.findIdeModule(name); + } + + @Override + public ModuleRootModel getRootModel(@NotNull Module module) { + return myModelsProvider.getModifiableRootModel(module); + } + + @NotNull + @Override + public FacetModel getFacetModel(@NotNull Module module) { + return myModelsProvider.getModifiableFacetModel(module); + } + } + + private class MyFacetsProvider implements FacetsProvider { + @Override + @NotNull + public Facet[] getAllFacets(Module module) { + return myModelsProvider.getModifiableFacetModel(module).getAllFacets(); + } + + @Override + @NotNull + public Collection getFacetsByType(Module module, FacetTypeId type) { + return myModelsProvider.getModifiableFacetModel(module).getFacetsByType(type); + } + + @Override + public F findFacet(Module module, FacetTypeId type, String name) { + return myModelsProvider.getModifiableFacetModel(module).findFacet(type, name); + } + } + + private static class DummyArtifactModel implements ModifiableArtifactModel { + @NotNull + @Override + public ModifiableArtifact addArtifact(@NotNull String name, @NotNull ArtifactType artifactType) { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public ModifiableArtifact addArtifact(@NotNull String name, + @NotNull ArtifactType artifactType, + CompositePackagingElement rootElement) { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public ModifiableArtifact addArtifact(@NotNull String name, + @NotNull ArtifactType artifactType, + CompositePackagingElement rootElement, + @Nullable ProjectModelExternalSource externalSource) { + throw new UnsupportedOperationException(); + } + + @Override + public void removeArtifact(@NotNull Artifact artifact) { + } + + @NotNull + @Override + public ModifiableArtifact getOrCreateModifiableArtifact(@NotNull Artifact artifact) { + throw new UnsupportedOperationException(); + } + + @Nullable + @Override + public Artifact getModifiableCopy(Artifact artifact) { + return null; + } + + @Override + public void addListener(@NotNull ArtifactListener listener) { + } + + @Override + public void removeListener(@NotNull ArtifactListener listener) { + } + + @Override + public boolean isModified() { + return false; + } + + @Override + public void commit() { + } + + @Override + public void dispose() { + } + + @NotNull + @Override + public Artifact[] getArtifacts() { + return new Artifact[0]; + } + + @Nullable + @Override + public Artifact findArtifact(@NotNull String name) { + return null; + } + + @NotNull + @Override + public Artifact getArtifactByOriginal(@NotNull Artifact artifact) { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public Artifact getOriginalArtifact(@NotNull Artifact artifact) { + throw new UnsupportedOperationException(); + } + + @NotNull + @Override + public Collection getArtifactsByType(@NotNull ArtifactType type) { + throw new UnsupportedOperationException(); + } + + @Override + public List getAllArtifactsIncludingInvalid() { + throw new UnsupportedOperationException(); + } + } +} diff --git a/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelProvider.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelProvider.java new file mode 100644 index 000000000000..90433c6a58ef --- /dev/null +++ b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/PackagingModifiableModelProvider.java @@ -0,0 +1,19 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.openapi.externalSystem.service.project; + +import com.intellij.openapi.externalSystem.project.PackagingModifiableModel; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +@ApiStatus.Experimental +public class PackagingModifiableModelProvider implements ModifiableModelsProviderExtension { + + @NotNull + @Override + public Pair, PackagingModifiableModel> create(@NotNull Project project, + @NotNull IdeModifiableModelsProvider modelsProvider) { + return Pair.create(PackagingModifiableModel.class, new PackagingModifiableModelImpl(project, modelsProvider)); + } +} diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportBuilder.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportProvider.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportProvider.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportProvider.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractExternalProjectImportProvider.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractImportFromExternalSystemWizardStep.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractImportFromExternalSystemWizardStep.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractImportFromExternalSystemWizardStep.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/AbstractImportFromExternalSystemWizardStep.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/SelectExternalProjectStep.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/SelectExternalProjectStep.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/project/wizard/SelectExternalProjectStep.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/project/wizard/SelectExternalProjectStep.java diff --git a/platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/settings/AbstractImportFromExternalSystemControl.java b/java/idea-ui/src/com/intellij/openapi/externalSystem/service/settings/AbstractImportFromExternalSystemControl.java similarity index 100% rename from platform/external-system-impl/src/com/intellij/openapi/externalSystem/service/settings/AbstractImportFromExternalSystemControl.java rename to java/idea-ui/src/com/intellij/openapi/externalSystem/service/settings/AbstractImportFromExternalSystemControl.java diff --git a/java/java-impl/src/META-INF/JavaPlugin.xml b/java/java-impl/src/META-INF/JavaPlugin.xml index a03ef92de58d..3e59b77f086a 100644 --- a/java/java-impl/src/META-INF/JavaPlugin.xml +++ b/java/java-impl/src/META-INF/JavaPlugin.xml @@ -658,6 +658,9 @@ + + T findModifiableModel(@NotNull Class instanceOf); + + @NotNull + @ApiStatus.Experimental + T getModifiableModel(@NotNull Class instanceOf); + @NotNull LibraryTable.ModifiableModel getModifiableProjectLibrariesModel(); diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModel.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModel.java new file mode 100644 index 000000000000..5222fce31f2e --- /dev/null +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModel.java @@ -0,0 +1,12 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.openapi.externalSystem.service.project; + +import org.jetbrains.annotations.ApiStatus; + +@ApiStatus.Experimental +public +interface ModifiableModel { + void commit(); + + void dispose(); +} diff --git a/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModelsProviderExtension.java b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModelsProviderExtension.java new file mode 100644 index 000000000000..e1fafd9873e1 --- /dev/null +++ b/platform/external-system-api/src/com/intellij/openapi/externalSystem/service/project/ModifiableModelsProviderExtension.java @@ -0,0 +1,13 @@ +// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +package com.intellij.openapi.externalSystem.service.project; + +import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Pair; +import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.NotNull; + +@ApiStatus.Experimental +public interface ModifiableModelsProviderExtension { + @NotNull + Pair, T> create(@NotNull Project project, @NotNull IdeModifiableModelsProvider modelsProvider); +} diff --git a/platform/external-system-impl/intellij.platform.externalSystem.impl.iml b/platform/external-system-impl/intellij.platform.externalSystem.impl.iml index 8329e5f33cd6..5d65de10f719 100644 --- a/platform/external-system-impl/intellij.platform.externalSystem.impl.iml +++ b/platform/external-system-impl/intellij.platform.externalSystem.impl.iml @@ -11,7 +11,6 @@ - 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 index 42ca3b78cc34..84507a8ff89c 100644 --- 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 @@ -1,9 +1,6 @@ // Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. 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.ide.highlighter.ModuleFileType; import com.intellij.openapi.application.ApplicationManager; @@ -11,6 +8,7 @@ import com.intellij.openapi.application.ModalityState; import com.intellij.openapi.application.ReadAction; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.externalSystem.ExternalSystemManager; import com.intellij.openapi.externalSystem.model.DataNode; import com.intellij.openapi.externalSystem.model.ExternalProjectInfo; @@ -18,8 +16,6 @@ import com.intellij.openapi.externalSystem.model.ProjectKeys; import com.intellij.openapi.externalSystem.model.project.LibraryData; import com.intellij.openapi.externalSystem.model.project.ModuleData; import com.intellij.openapi.externalSystem.model.project.ProjectCoordinate; -import com.intellij.openapi.externalSystem.project.ArtifactExternalDependenciesImporter; -import com.intellij.openapi.externalSystem.project.ModifiableArtifactsProvider; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.module.ModifiableModuleModel; import com.intellij.openapi.module.Module; @@ -32,19 +28,14 @@ import com.intellij.openapi.roots.impl.ModifiableModelCommitter; import com.intellij.openapi.roots.impl.libraries.LibraryEx; 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.Disposer; import com.intellij.openapi.util.Key; +import com.intellij.openapi.util.Pair; import com.intellij.openapi.util.UserDataHolderBase; import com.intellij.openapi.util.io.FileUtilRt; 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.ObjectUtils; +import com.intellij.util.containers.ClassMap; import com.intellij.util.containers.ContainerUtil; import com.intellij.util.graph.CachingSemiGraph; import com.intellij.util.graph.Graph; @@ -61,18 +52,18 @@ import java.util.*; import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.isRelated; import static com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil.toCanonicalPath; -public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProviderImpl implements IdeModifiableModelsProvider, - ModifiableArtifactsProvider { +public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProviderImpl implements IdeModifiableModelsProvider { private static final Logger LOG = Logger.getInstance(AbstractIdeModifiableModelsProvider.class); + private final static ExtensionPointName> EP_NAME = + ExtensionPointName.create("com.intellij.externalSystem.modifiableModelsProvider"); + private ModifiableModuleModel myModifiableModuleModel; private final Map myModifiableRootModels = new THashMap<>(); private final Map myModifiableFacetModels = new THashMap<>(); private final Map myProductionModulesForTestModules = new THashMap<>(); private final Map myModifiableLibraryModels = new IdentityHashMap<>(); - private ModifiableArtifactModel myModifiableArtifactModel; - private AbstractIdeModifiableModelsProvider.MyPackagingElementResolvingContext myPackagingElementResolvingContext; - private final ArtifactExternalDependenciesImporter myArtifactExternalDependenciesImporter; + private final ClassMap myModifiableModels = new ClassMap<>(); @Nullable private ModifiableWorkspace myModifiableWorkspace; private final MyUserDataHolderBase myUserData; @@ -81,10 +72,27 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi public AbstractIdeModifiableModelsProvider(@NotNull Project project) { super(project); myUserData = new MyUserDataHolderBase(); - myArtifactExternalDependenciesImporter = new ArtifactExternalDependenciesImporterImpl(); + for (ModifiableModelsProviderExtension extension : EP_NAME.getIterable()) { + Pair, ModifiableModel> pair = extension.create(project, this); + myModifiableModels.put(pair.first, pair.second); + } } - protected abstract ModifiableArtifactModel doGetModifiableArtifactModel(); + @Nullable + @Override + public T findModifiableModel(@NotNull Class instanceOf) { + return ObjectUtils.tryCast(myModifiableModels.get(instanceOf), instanceOf); + } + + @NotNull + @Override + public T getModifiableModel(@NotNull Class instanceOf) { + ModifiableModel model = myModifiableModels.get(instanceOf); + if (instanceOf.isInstance(model)) { + return instanceOf.cast(model); + } + throw new AssertionError(String.format("Unable to get `%s` model", instanceOf.getSimpleName())); + } protected abstract ModifiableModuleModel doGetModifiableModuleModel(); @@ -104,18 +112,6 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi return getModifiableModuleModel().getModules(); } - 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) { @@ -219,15 +215,6 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi return myModifiableFacetModels.computeIfAbsent(module, k -> doGetModifiableFacetModel(module)); } - @Override - @NotNull - public ModifiableArtifactModel getModifiableArtifactModel() { - if (myModifiableArtifactModel == null) { - myModifiableArtifactModel = doGetModifiableArtifactModel(); - } - return myModifiableArtifactModel; - } - @Override @NotNull public Library[] getAllLibraries() { @@ -283,11 +270,6 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi return ModalityState.NON_MODAL; } - @Override - public ArtifactExternalDependenciesImporter getArtifactExternalDependenciesImporter() { - return myArtifactExternalDependenciesImporter; - } - @NotNull @Override public List getAllDependentModules(@NotNull Module module) { @@ -328,101 +310,12 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi } } - private class MyPackagingElementResolvingContext implements PackagingElementResolvingContext { - private final ModulesProvider myModulesProvider = new MyModulesProvider(); - private final MyFacetsProvider myFacetsProvider = new MyFacetsProvider(); - private final ManifestFileProvider myManifestFileProvider = new DefaultManifestFileProvider(this); - - @Override - @NotNull - public Project getProject() { - return myProject; - } - - @Override - @NotNull - public ArtifactModel getArtifactModel() { - return AbstractIdeModifiableModelsProvider.this.getModifiableArtifactModel(); - } - - @Override - @NotNull - public ModulesProvider getModulesProvider() { - return myModulesProvider; - } - - @Override - @NotNull - public FacetsProvider getFacetsProvider() { - return myFacetsProvider; - } - - @Override - 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 { - @Override - @NotNull - public Module[] getModules() { - return AbstractIdeModifiableModelsProvider.this.getModules(); - } - - @Override - public Module getModule(@NotNull String name) { - return AbstractIdeModifiableModelsProvider.this.findIdeModule(name); - } - - @Override - public ModuleRootModel getRootModel(@NotNull Module module) { - return AbstractIdeModifiableModelsProvider.this.getModifiableRootModel(module); - } - - @NotNull - @Override - public FacetModel getFacetModel(@NotNull Module module) { - return AbstractIdeModifiableModelsProvider.this.getModifiableFacetModel(module); - } - } - - private class MyFacetsProvider implements FacetsProvider { - @Override - @NotNull - public Facet[] getAllFacets(Module module) { - return getModifiableFacetModel(module).getAllFacets(); - } - - @Override - @NotNull - public Collection getFacetsByType(Module module, FacetTypeId type) { - return getModifiableFacetModel(module).getFacetsByType(type); - } - - @Override - public F findFacet(Module module, FacetTypeId type, String name) { - return getModifiableFacetModel(module).findFacet(type, name); - } - } - @Override public void commit() { ProjectRootManagerEx.getInstanceEx(myProject).mergeRootsChangesDuring(() -> { if (ExternalProjectsWorkspaceImpl.isDependencySubstitutionEnabled()) { updateSubstitutions(); } - processExternalArtifactDependencies(); for (Map.Entry entry: myModifiableLibraryModels.entrySet()) { Library fromLibrary = entry.getKey(); Library.ModifiableModel modifiableModel = entry.getValue(); @@ -460,9 +353,7 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi each.getValue().commit(); } } - if (myModifiableArtifactModel != null) { - myModifiableArtifactModel.commit(); - } + myModifiableModels.values().forEach(ModifiableModel::commit); }); myUserData.clear(); } @@ -487,10 +378,8 @@ public abstract class AbstractIdeModifiableModelsProvider extends IdeModelsProvi if (myModifiableModuleModel != null && myModifiableModuleModel.isChanged()) { myModifiableModuleModel.dispose(); } - if (myModifiableArtifactModel != null) { - myModifiableArtifactModel.dispose(); - } + myModifiableModels.values().forEach(ModifiableModel::dispose); myModifiableRootModels.clear(); myModifiableFacetModels.clear(); myModifiableLibraryModels.clear(); 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 index 6c06b1e13bb0..a764d604e978 100644 --- 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 @@ -51,15 +51,6 @@ public class IdeModifiableModelsProviderImpl extends AbstractIdeModifiableModels return myLibrariesModel; } - @Override - protected ModifiableArtifactModel doGetModifiableArtifactModel() { - return ReadAction.compute(() -> { - // todo move this to external system java module - ArtifactManager artifactManager = ArtifactManager.getInstance(myProject); - return artifactManager != null ? artifactManager.createModifiableModel() : new DummyArtifactModel(); - }); - } - @Override protected ModifiableModuleModel doGetModifiableModuleModel() { return ReadAction.compute(() -> ModuleManager.getInstance(myProject).getModifiableModel()); @@ -80,101 +71,4 @@ public class IdeModifiableModelsProviderImpl extends AbstractIdeModifiableModels protected Library.ModifiableModel doGetModifiableLibraryModel(Library library) { return library.getModifiableModel(); } - - private static class DummyArtifactModel implements ModifiableArtifactModel { - @NotNull - @Override - public ModifiableArtifact addArtifact(@NotNull String name, @NotNull ArtifactType artifactType) { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public ModifiableArtifact addArtifact(@NotNull String name, - @NotNull ArtifactType artifactType, - CompositePackagingElement rootElement) { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public ModifiableArtifact addArtifact(@NotNull String name, - @NotNull ArtifactType artifactType, - CompositePackagingElement rootElement, - @Nullable ProjectModelExternalSource externalSource) { - throw new UnsupportedOperationException(); - } - - @Override - public void removeArtifact(@NotNull Artifact artifact) { - } - - @NotNull - @Override - public ModifiableArtifact getOrCreateModifiableArtifact(@NotNull Artifact artifact) { - throw new UnsupportedOperationException(); - } - - @Nullable - @Override - public Artifact getModifiableCopy(Artifact artifact) { - return null; - } - - @Override - public void addListener(@NotNull ArtifactListener listener) { - } - - @Override - public void removeListener(@NotNull ArtifactListener listener) { - } - - @Override - public boolean isModified() { - return false; - } - - @Override - public void commit() { - } - - @Override - public void dispose() { - } - - @NotNull - @Override - public Artifact[] getArtifacts() { - return new Artifact[0]; - } - - @Nullable - @Override - public Artifact findArtifact(@NotNull String name) { - return null; - } - - @NotNull - @Override - public Artifact getArtifactByOriginal(@NotNull Artifact artifact) { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public Artifact getOriginalArtifact(@NotNull Artifact artifact) { - throw new UnsupportedOperationException(); - } - - @NotNull - @Override - public Collection getArtifactsByType(@NotNull ArtifactType type) { - throw new UnsupportedOperationException(); - } - - @Override - public List getAllArtifactsIncludingInvalid() { - throw new UnsupportedOperationException(); - } - } } 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 82c7c7c96a2b..a7001214d233 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 @@ -11,7 +11,6 @@ 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.IdeModifiableModelsProvider; -import com.intellij.openapi.externalSystem.service.project.IdeUIModifiableModelsProvider; import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil; import com.intellij.openapi.externalSystem.util.ExternalSystemConstants; import com.intellij.openapi.externalSystem.util.ExternalSystemUtil; @@ -163,7 +162,7 @@ public final class LibraryDataService extends AbstractProjectDataService orphanIdeLibraries = ContainerUtil.newSmartList(); final LibraryTable.ModifiableModel librariesModel = modelsProvider.getModifiableProjectLibrariesModel(); diff --git a/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml b/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml index 81c534b22d56..d7dcbb7bd842 100644 --- a/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml +++ b/platform/platform-resources/src/META-INF/ExternalSystemExtensionPoints.xml @@ -6,6 +6,8 @@ interface="com.intellij.openapi.externalSystem.service.project.ExternalProjectsWorkspaceImpl$Contributor"/> + - - diff --git a/platform/platform-resources/src/idea/ExternalSystemActions.xml b/platform/platform-resources/src/idea/ExternalSystemActions.xml index e61a924ae040..791478b0c367 100644 --- a/platform/platform-resources/src/idea/ExternalSystemActions.xml +++ b/platform/platform-resources/src/idea/ExternalSystemActions.xml @@ -7,8 +7,6 @@ - @@ -129,7 +127,7 @@ - + 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 23a53bd1cfc1..9e29822576fa 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 @@ -21,6 +21,7 @@ import com.intellij.appengine.facet.AppEngineFacetType; import com.intellij.appengine.facet.AppEngineWebIntegration; import com.intellij.appengine.sdk.impl.AppEngineSdkUtil; import com.intellij.facet.FacetType; +import com.intellij.openapi.externalSystem.project.PackagingModifiableModel; import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -108,7 +109,8 @@ public class AppEngineFacetImporter extends FacetImporter