project model: distinguish facets imported from external models
authornik <Nikolay.Chashnikov@jetbrains.com>
Wed, 3 May 2017 12:52:39 +0000 (15:52 +0300)
committernik <Nikolay.Chashnikov@jetbrains.com>
Thu, 4 May 2017 14:49:08 +0000 (17:49 +0300)
This information can be used to show a warning if user tries to manually change configuration of a facet imported from an external model in the Project Structure dialog (IDEA-171948).

platform/lang-api/src/com/intellij/facet/Facet.java
platform/lang-api/src/com/intellij/facet/ModifiableFacetModel.java
platform/lang-impl/src/com/intellij/facet/FacetManagerImpl.java
platform/lang-impl/src/com/intellij/facet/impl/FacetModelImpl.java
plugins/maven/src/main/java/org/jetbrains/idea/maven/importing/FacetImporter.java

index b1a2609cb2cbe0d9b06323ea1510d245f49e2ddc..f0c95764f27af42243ca70be8ab8067d61c79461 100644 (file)
@@ -18,10 +18,13 @@ package com.intellij.facet;
 
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.module.Module;
+import com.intellij.openapi.roots.ProjectModelElement;
+import com.intellij.openapi.roots.ProjectModelExternalSource;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.UserDataHolder;
 import com.intellij.openapi.util.UserDataHolderBase;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Represents a specific instance of facet
@@ -30,7 +33,7 @@ import org.jetbrains.annotations.NotNull;
  *
  * @author nik
  */
-public class Facet<C extends FacetConfiguration> extends UserDataHolderBase implements UserDataHolder, Disposable {
+public class Facet<C extends FacetConfiguration> extends UserDataHolderBase implements UserDataHolder, Disposable, ProjectModelElement {
   public static final Facet[] EMPTY_ARRAY = new Facet[0];
   @NotNull private final FacetType myFacetType;
   @NotNull private final Module myModule;
@@ -38,6 +41,7 @@ public class Facet<C extends FacetConfiguration> extends UserDataHolderBase impl
   private final Facet myUnderlyingFacet;
   private String myName;
   private boolean isDisposed;
+  private ProjectModelExternalSource myExternalSource;
 
   public Facet(@NotNull final FacetType facetType, @NotNull final Module module, @NotNull final String name, @NotNull final C configuration, Facet underlyingFacet) {
     myName = name;
@@ -115,6 +119,16 @@ public class Facet<C extends FacetConfiguration> extends UserDataHolderBase impl
     myName = name;
   }
 
+  @Nullable
+  @Override
+  public ProjectModelExternalSource getExternalSource() {
+    return myExternalSource;
+  }
+
+  void setExternalSource(ProjectModelExternalSource externalSource) {
+    myExternalSource = externalSource;
+  }
+
   @Override
   public String toString() {
     return getName() + " (" + getModule().getName() + ")";
index 9d858b24d56f08380fccb3d12130a66796dfb9c7..550899d47ea0da14db82bda052cf738bf58c8677 100644 (file)
@@ -16,6 +16,7 @@
 
 package com.intellij.facet;
 
+import com.intellij.openapi.roots.ProjectModelExternalSource;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.NotNull;
 import com.intellij.openapi.Disposable;
@@ -26,6 +27,7 @@ import com.intellij.openapi.Disposable;
 public interface ModifiableFacetModel extends FacetModel {
 
   void addFacet(Facet facet);
+  void addFacet(Facet facet, @Nullable ProjectModelExternalSource externalSource);
   void removeFacet(Facet facet);
 
   void rename(Facet facet, String newName);
index c68fbc276ea671501d3d44a8eb28f46fe4c67645..93306a1b2cb3103ff8642bd228257b51eb103793 100644 (file)
@@ -33,6 +33,7 @@ import com.intellij.openapi.module.ModuleComponent;
 import com.intellij.openapi.module.ModuleType;
 import com.intellij.openapi.module.ProjectLoadingErrorsNotifier;
 import com.intellij.openapi.project.ProjectBundle;
+import com.intellij.openapi.roots.ProjectModelExternalSource;
 import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.UnknownFeaturesCollector;
 import com.intellij.openapi.util.*;
 import com.intellij.openapi.util.text.StringUtil;
@@ -418,6 +419,10 @@ public class FacetManagerImpl extends FacetManager implements ModuleComponent, P
     }
   }
 
+  public void setExternalSource(Facet facet, ProjectModelExternalSource externalSource) {
+    facet.setExternalSource(externalSource);
+  }
+
   @Override
   public void moduleAdded() {
     if (myModuleAdded) return;
index d632d31ba88113101504c52128ffc1f5eb18de08..0cd0ae762cdee1ec01344360a7a7572c38b0873d 100644 (file)
@@ -21,6 +21,7 @@ import com.intellij.facet.ModifiableFacetModel;
 import com.intellij.facet.FacetManagerImpl;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.Disposable;
+import com.intellij.openapi.roots.ProjectModelExternalSource;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.containers.ContainerUtil;
@@ -60,6 +61,12 @@ public class FacetModelImpl extends FacetModelBase implements ModifiableFacetMod
   }
 
   @Override
+  public void addFacet(Facet facet, @Nullable ProjectModelExternalSource externalSource) {
+    addFacet(facet);
+    myManager.setExternalSource(facet, externalSource);
+  }
+
+  @Override
   public void removeFacet(Facet facet) {
     if (!myFacets.remove(facet)) {
       LOG.error("Facet " + facet + " [" + facet.getTypeId() + "] not found");
index 42df462cf151fd4dd39c2ef5c786e8b9a30bf878..07be6b83e7628c0cfcaff8d72f0d4718412860b5 100644 (file)
@@ -83,7 +83,7 @@ public abstract class FacetImporter<FACET_TYPE extends Facet, FACET_CONFIG_TYPE
     if (f != null) return;
 
     f = myFacetType.createFacet(module, myDefaultFacetName, myFacetType.createDefaultConfiguration(), null);
-    model.addFacet(f);
+    model.addFacet(f, MavenRootModelAdapter.getMavenExternalSource());
     setupFacet(f, mavenProject);
   }