ES: extract packaging modifiable models to java plugin IDEA-187832

GitOrigin-RevId: 67f8209b711806a587d041fd1adc9529ea002916
This commit is contained in:
Vladislav.Soroka
2019-06-11 18:18:28 +03:00
committed by intellij-monorepo-bot
parent 8dbc95f646
commit 9c5ffd4573
31 changed files with 386 additions and 311 deletions
@@ -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 ->
@@ -11,6 +11,7 @@
<orderEntry type="module" module-name="intellij.platform.projectModel.impl" />
<orderEntry type="library" name="JDOM" level="project" />
<orderEntry type="module" module-name="intellij.platform.util.ui" />
<orderEntry type="module" module-name="intellij.platform.externalSystem" />
</component>
<component name="copyright">
<Base>
@@ -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();
@@ -161,5 +161,10 @@
<action id="ConsoleView.FoldLinesLikeThis" class="com.intellij.execution.console.FoldLinesLikeThis" text="Fold Lines Like This">
<add-to-group group-id="ConsoleEditorPopupMenu" anchor="after" relative-to-action="$SearchWeb"/>
</action>
<action id="ExternalSystem.AttachProject"
class="com.intellij.openapi.externalSystem.action.AttachExternalProjectAction">
<add-to-group group-id="ExternalSystemView.ActionsToolbar.LeftPanel" anchor="after" relative-to-action="ExternalSystem.RefreshAllProjects"/>
</action>
</actions>
</idea-plugin>
+2
View File
@@ -16,5 +16,7 @@
<orderEntry type="module" module-name="intellij.platform.vcs.impl" />
<orderEntry type="library" name="Guava" level="project" />
<orderEntry type="library" name="jna" level="project" />
<orderEntry type="module" module-name="intellij.platform.externalSystem" />
<orderEntry type="module" module-name="intellij.platform.externalSystem.impl" />
</component>
</module>
@@ -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;
@@ -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
@@ -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 <F extends Facet> Collection<F> getFacetsByType(Module module, FacetTypeId<F> type) {
return myModelsProvider.getModifiableFacetModel(module).getFacetsByType(type);
}
@Override
public <F extends Facet> F findFacet(Module module, FacetTypeId<F> 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();
}
}
}
@@ -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<PackagingModifiableModel> {
@NotNull
@Override
public Pair<Class<PackagingModifiableModel>, PackagingModifiableModel> create(@NotNull Project project,
@NotNull IdeModifiableModelsProvider modelsProvider) {
return Pair.create(PackagingModifiableModel.class, new PackagingModifiableModelImpl(project, modelsProvider));
}
}
@@ -658,6 +658,9 @@
<externalSystem.runConfigurationImporter implementation="com.intellij.execution.application.JavaApplicationRunConfigurationImporter"/>
<externalSystem.runConfigurationImporter implementation="com.intellij.execution.remote.JavaRemoteDebugRunConfigurationImporter"/>
<externalSystem.modifiableModelsProvider implementation="com.intellij.openapi.externalSystem.service.project.PackagingModifiableModelProvider"/>
<configuration.ModuleStructureExtension
implementation="com.intellij.openapi.externalSystem.service.project.ExternalModuleStructureExtension"/>
<runLineMarkerContributor language="JVM"
order="before applicationRunLineMarkerProvider"
@@ -52,6 +52,14 @@ public interface IdeModifiableModelsProvider extends IdeModelsProvider, UserData
@NotNull
ModifiableFacetModel getModifiableFacetModel(Module module);
@Nullable
@ApiStatus.Experimental
<T extends ModifiableModel> T findModifiableModel(@NotNull Class<T> instanceOf);
@NotNull
@ApiStatus.Experimental
<T extends ModifiableModel> T getModifiableModel(@NotNull Class<T> instanceOf);
@NotNull
LibraryTable.ModifiableModel getModifiableProjectLibrariesModel();
@@ -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();
}
@@ -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<T extends ModifiableModel> {
@NotNull
Pair<Class<T>, T> create(@NotNull Project project, @NotNull IdeModifiableModelsProvider modelsProvider);
}
@@ -11,7 +11,6 @@
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module" module-name="intellij.java.ui" />
<orderEntry type="module" module-name="intellij.platform.externalSystem" />
<orderEntry type="module" module-name="intellij.platform.projectModel.impl" />
<orderEntry type="module" module-name="intellij.java.compiler" />
@@ -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<ModifiableModelsProviderExtension<ModifiableModel>> EP_NAME =
ExtensionPointName.create("com.intellij.externalSystem.modifiableModelsProvider");
private ModifiableModuleModel myModifiableModuleModel;
private final Map<Module, ModifiableRootModel> myModifiableRootModels = new THashMap<>();
private final Map<Module, ModifiableFacetModel> myModifiableFacetModels = new THashMap<>();
private final Map<Module, String> myProductionModulesForTestModules = new THashMap<>();
private final Map<Library, Library.ModifiableModel> myModifiableLibraryModels = new IdentityHashMap<>();
private ModifiableArtifactModel myModifiableArtifactModel;
private AbstractIdeModifiableModelsProvider.MyPackagingElementResolvingContext myPackagingElementResolvingContext;
private final ArtifactExternalDependenciesImporter myArtifactExternalDependenciesImporter;
private final ClassMap<ModifiableModel> 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<ModifiableModel> extension : EP_NAME.getIterable()) {
Pair<Class<ModifiableModel>, ModifiableModel> pair = extension.create(project, this);
myModifiableModels.put(pair.first, pair.second);
}
}
protected abstract ModifiableArtifactModel doGetModifiableArtifactModel();
@Nullable
@Override
public <T extends ModifiableModel> T findModifiableModel(@NotNull Class<T> instanceOf) {
return ObjectUtils.tryCast(myModifiableModels.get(instanceOf), instanceOf);
}
@NotNull
@Override
public <T extends ModifiableModel> T getModifiableModel(@NotNull Class<T> 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<Module> 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 <F extends Facet> Collection<F> getFacetsByType(Module module, FacetTypeId<F> type) {
return getModifiableFacetModel(module).getFacetsByType(type);
}
@Override
public <F extends Facet> F findFacet(Module module, FacetTypeId<F> 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<Library, Library.ModifiableModel> 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();
@@ -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();
}
}
}
@@ -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<Library
// do not cleanup orphan project libraries if import runs from Project Structure Dialog
// since libraries order entries cannot be imported for modules in that case
// and hence orphans will be detected incorrectly
if (modelsProvider instanceof IdeUIModifiableModelsProvider) return;
if (modelsProvider.getClass().getSimpleName().equals("IdeUIModifiableModelsProvider")) return;
final List<Library> orphanIdeLibraries = ContainerUtil.newSmartList();
final LibraryTable.ModifiableModel librariesModel = modelsProvider.getModifiableProjectLibrariesModel();
@@ -6,6 +6,8 @@
interface="com.intellij.openapi.externalSystem.service.project.ExternalProjectsWorkspaceImpl$Contributor"/>
<extensionPoint qualifiedName="com.intellij.externalProjectDataService"
interface="com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService"/>
<extensionPoint qualifiedName="com.intellij.externalSystem.modifiableModelsProvider"
interface="com.intellij.openapi.externalSystem.service.project.ModifiableModelsProviderExtension"/>
<extensionPoint qualifiedName="com.intellij.externalSystemConfigurationHandler"
interface="com.intellij.openapi.externalSystem.service.project.settings.ConfigurationHandler"/>
<extensionPoint qualifiedName="com.intellij.externalSystem.runConfigurationImporter"
@@ -60,9 +60,6 @@
implementation="com.intellij.openapi.externalSystem.service.project.settings.DetectionExcludesConfigImporter"/>
<externalSystem.beforeRunTaskImporter implementation="com.intellij.openapi.externalSystem.service.project.settings.BuildArtifactsTaskImporter"/>
<configuration.ModuleStructureExtension
implementation="com.intellij.openapi.externalSystem.service.project.manage.ExternalModuleStructureExtension"/>
<!--Tool window services-->
<externalSystemViewContributor id="default" order="last"
implementation="com.intellij.openapi.externalSystem.view.ExternalSystemViewDefaultContributor"/>
@@ -7,8 +7,6 @@
<action id="ExternalSystem.RefreshProject"
class="com.intellij.openapi.externalSystem.action.RefreshExternalProjectAction"
icon="AllIcons.Actions.Refresh"/>
<action id="ExternalSystem.AttachProject"
class="com.intellij.openapi.externalSystem.action.AttachExternalProjectAction"/>
<action id="ExternalSystem.DetachProject"
class="com.intellij.openapi.externalSystem.action.DetachExternalProjectAction"
use-shortcut-of="$Delete"/>
@@ -129,7 +127,7 @@
<group id="ExternalSystemView.ActionsToolbar.LeftPanel">
<reference id="ExternalSystem.RefreshAllProjects"/>
<reference id="ExternalSystem.AttachProject"/>
<!-- <reference id="ExternalSystem.AttachProject"/>-->
<reference ref="ExternalSystem.DetachProject"/>
<!--<reference id="ExternalSystem.Run/>-->
</group>
@@ -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<AppEngineFacet, AppEng
facet.getConfiguration().setSdkHomePath(FileUtil.toSystemIndependentName(mavenProject.getLocalRepository().getPath()) + relativePath);
AppEngineWebIntegration.getInstance().setupDevServer(facet.getSdk());
final String artifactName = module.getName() + ":war exploded";
final Artifact webArtifact = getArtifactProvider(modelsProvider).getModifiableArtifactModel().findArtifact(artifactName);
final Artifact webArtifact = modelsProvider.getModifiableModel(PackagingModifiableModel.class)
.getModifiableArtifactModel().findArtifact(artifactName);
AppEngineWebIntegration.getInstance().setupRunConfiguration(facet.getSdk(), webArtifact, module.getProject());
}
}
@@ -3,7 +3,6 @@ package org.jetbrains.plugins.gradle.service.settings;
import com.intellij.ide.util.projectWizard.WizardContext;
import com.intellij.openapi.externalSystem.service.settings.AbstractExternalProjectSettingsControl;
import com.intellij.openapi.externalSystem.service.settings.AbstractImportFromExternalSystemControl;
import com.intellij.openapi.externalSystem.util.PaintAwarePanel;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.project.Project;
@@ -5,7 +5,6 @@ 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.project.ModifiableArtifactsProvider;
import com.intellij.openapi.externalSystem.service.project.IdeModifiableModelsProvider;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.project.Project;
@@ -13,8 +12,6 @@ import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.util.ArrayUtilRt;
import com.intellij.util.PathUtil;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.idea.maven.project.MavenProject;
import org.jetbrains.idea.maven.project.MavenProjectChanges;
import org.jetbrains.idea.maven.project.MavenProjectsProcessorTask;
@@ -186,15 +183,4 @@ public abstract class FacetImporter<FACET_TYPE extends Facet, FACET_CONFIG_TYPE
return excludesConfiguration.isExcludedFromDetection(frameworkType);
}
@NotNull
@ApiStatus.Experimental
protected static ModifiableArtifactsProvider getArtifactProvider(@NotNull IdeModifiableModelsProvider modelsProvider) {
if (modelsProvider instanceof ModifiableArtifactsProvider) {
return (ModifiableArtifactsProvider)modelsProvider;
}
else {
throw new AssertionError("Unable to get artifacts provider");
}
}
}