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 extends Artifact> getArtifactsByType(@NotNull ArtifactType type) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public List extends Artifact> 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 extends Artifact> getArtifactsByType(@NotNull ArtifactType type) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public List extends Artifact> 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