e625464f1caedd213a17c8a2b910c1e2e572ebb2
[idea/community.git] / platform / lang-impl / src / com / intellij / facet / impl / FacetUtil.java
1 // 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.
2 package com.intellij.facet.impl;
3
4 import com.intellij.configurationStore.ComponentSerializationUtil;
5 import com.intellij.configurationStore.XmlSerializer;
6 import com.intellij.facet.*;
7 import com.intellij.openapi.application.ApplicationManager;
8 import com.intellij.openapi.application.WriteAction;
9 import com.intellij.openapi.components.PersistentStateComponent;
10 import com.intellij.openapi.module.Module;
11 import com.intellij.openapi.util.InvalidDataException;
12 import org.jdom.Element;
13 import org.jetbrains.annotations.NotNull;
14 import org.jetbrains.annotations.Nullable;
15 import org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer;
16
17 import java.util.Arrays;
18
19 /**
20  * @author nik
21  */
22 public class FacetUtil {
23
24   public static <F extends Facet> F addFacet(Module module, FacetType<F, ?> type) {
25     final ModifiableFacetModel model = FacetManager.getInstance(module).createModifiableModel();
26     final F facet = createFacet(module, type);
27     ApplicationManager.getApplication().runWriteAction(() -> {
28       model.addFacet(facet);
29       model.commit();
30     });
31     return facet;
32   }
33
34   private static <F extends Facet, C extends FacetConfiguration> F createFacet(final Module module, final FacetType<F, C> type) {
35     return FacetManager.getInstance(module).createFacet(type, type.getPresentableName(), type.createDefaultConfiguration(), null);
36   }
37
38   public static void deleteFacet(final Facet facet) {
39     WriteAction.runAndWait(() -> {
40       if (!isRegistered(facet)) {
41         return;
42       }
43
44       ModifiableFacetModel model = FacetManager.getInstance(facet.getModule()).createModifiableModel();
45       model.removeFacet(facet);
46       model.commit();
47     });
48   }
49
50   public static boolean isRegistered(Facet facet) {
51     return Arrays.asList(FacetManager.getInstance(facet.getModule()).getAllFacets()).contains(facet);
52   }
53
54   public static void loadFacetConfiguration(final @NotNull FacetConfiguration configuration, final @Nullable Element config)
55       throws InvalidDataException {
56     if (config != null) {
57       if (configuration instanceof PersistentStateComponent) {
58         ComponentSerializationUtil.loadComponentState((PersistentStateComponent)configuration, config);
59       }
60       else {
61         configuration.readExternal(config);
62       }
63     }
64   }
65
66   @NotNull
67   public static Element saveFacetConfiguration(@NotNull FacetConfiguration configuration) {
68     if (configuration instanceof PersistentStateComponent) {
69       Object state = ((PersistentStateComponent)configuration).getState();
70       if (state instanceof Element) {
71         return ((Element)state);
72       }
73       else {
74         Element result = XmlSerializer.serialize(state);
75         return result == null ? new Element(JpsFacetSerializer.CONFIGURATION_TAG) : result;
76       }
77     }
78     else {
79       final Element config = new Element(JpsFacetSerializer.CONFIGURATION_TAG);
80       configuration.writeExternal(config);
81       return config;
82     }
83   }
84 }