[workspace model] provide implementation of FacetManager which stores data in workspa...
[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 com.intellij.openapi.util.JDOMExternalizable;
13 import com.intellij.openapi.util.WriteExternalException;
14 import org.jdom.Element;
15 import org.jetbrains.annotations.ApiStatus;
16 import org.jetbrains.annotations.NotNull;
17 import org.jetbrains.annotations.Nullable;
18 import org.jetbrains.jps.model.serialization.facet.JpsFacetSerializer;
19
20 import java.util.Arrays;
21
22 /**
23  * @author nik
24  */
25 public class FacetUtil {
26
27   public static <F extends Facet> F addFacet(Module module, FacetType<F, ?> type) {
28     final ModifiableFacetModel model = FacetManager.getInstance(module).createModifiableModel();
29     final F facet = createFacet(module, type);
30     ApplicationManager.getApplication().runWriteAction(() -> {
31       model.addFacet(facet);
32       model.commit();
33     });
34     return facet;
35   }
36
37   private static <F extends Facet, C extends FacetConfiguration> F createFacet(final Module module, final FacetType<F, C> type) {
38     return FacetManager.getInstance(module).createFacet(type, type.getPresentableName(), type.createDefaultConfiguration(), null);
39   }
40
41   public static void deleteFacet(final Facet facet) {
42     WriteAction.runAndWait(() -> {
43       if (!isRegistered(facet)) {
44         return;
45       }
46
47       ModifiableFacetModel model = FacetManager.getInstance(facet.getModule()).createModifiableModel();
48       model.removeFacet(facet);
49       model.commit();
50     });
51   }
52
53   public static boolean isRegistered(Facet facet) {
54     return Arrays.asList(FacetManager.getInstance(facet.getModule()).getAllFacets()).contains(facet);
55   }
56
57   public static void loadFacetConfiguration(final @NotNull FacetConfiguration configuration, final @Nullable Element config)
58       throws InvalidDataException {
59     if (config != null) {
60       if (configuration instanceof PersistentStateComponent) {
61         ComponentSerializationUtil.loadComponentState((PersistentStateComponent)configuration, config);
62       }
63       else {
64         configuration.readExternal(config);
65       }
66     }
67   }
68
69   @NotNull
70   public static Element saveFacetConfiguration(@NotNull FacetConfiguration configuration) {
71     if (configuration instanceof PersistentStateComponent) {
72       Object state = ((PersistentStateComponent)configuration).getState();
73       if (state instanceof Element) {
74         return ((Element)state);
75       }
76       else {
77         Element result = XmlSerializer.serialize(state);
78         return result == null ? new Element(JpsFacetSerializer.CONFIGURATION_TAG) : result;
79       }
80     }
81     else {
82       final Element config = new Element(JpsFacetSerializer.CONFIGURATION_TAG);
83       configuration.writeExternal(config);
84       return config;
85     }
86   }
87
88   @ApiStatus.Internal
89   @Nullable
90   public static Element saveFacetConfiguration(Facet<?> facet) {
91     final Element config;
92     try {
93       FacetConfiguration configuration = facet.getConfiguration();
94       config = saveFacetConfiguration(configuration);
95       if (facet instanceof JDOMExternalizable) {
96         //todo[nik] remove
97         ((JDOMExternalizable)facet).writeExternal(config);
98       }
99     }
100     catch (WriteExternalException e) {
101       return null;
102     }
103     return config;
104   }
105 }