98ee7e32af01d741404fc5eb817f8f6c446f19a5
[idea/community.git] / platform / lang-impl / src / com / intellij / facet / impl / FacetUtil.java
1 /*
2  * Copyright 2000-2009 JetBrains s.r.o.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package com.intellij.facet.impl;
18
19 import com.intellij.facet.*;
20 import com.intellij.openapi.application.Result;
21 import com.intellij.openapi.application.WriteAction;
22 import com.intellij.openapi.components.PersistentStateComponent;
23 import com.intellij.openapi.util.InvalidDataException;
24 import com.intellij.openapi.util.WriteExternalException;
25 import com.intellij.util.ReflectionUtil;
26 import com.intellij.util.xmlb.SkipDefaultValuesSerializationFilters;
27 import com.intellij.util.xmlb.XmlSerializer;
28 import org.jdom.Element;
29 import org.jetbrains.annotations.NotNull;
30 import org.jetbrains.annotations.Nullable;
31
32 import java.lang.reflect.TypeVariable;
33 import java.util.Arrays;
34
35 /**
36  * @author nik
37  */
38 public class FacetUtil {
39   private FacetUtil() {
40   }
41
42   public static void deleteFacet(final Facet facet) {
43     new WriteAction() {
44       protected void run(final Result result) {
45         if (!isRegistered(facet)) {
46           return;
47         }
48
49         ModifiableFacetModel model = FacetManager.getInstance(facet.getModule()).createModifiableModel();
50         model.removeFacet(facet);
51         model.commit();
52       }
53     }.execute();
54   }
55
56   public static boolean isRegistered(Facet facet) {
57     return Arrays.asList(FacetManager.getInstance(facet.getModule()).getAllFacets()).contains(facet);
58   }
59
60   public static void loadFacetConfiguration(final @NotNull FacetConfiguration configuration, final @Nullable Element config)
61       throws InvalidDataException {
62     if (config != null) {
63       if (configuration instanceof PersistentStateComponent) {
64         TypeVariable<Class<PersistentStateComponent>> variable = PersistentStateComponent.class.getTypeParameters()[0];
65         Class<?> stateClass = ReflectionUtil.getRawType(ReflectionUtil.resolveVariableInHierarchy(variable, configuration.getClass()));
66         ((PersistentStateComponent)configuration).loadState(XmlSerializer.deserialize(config, stateClass));
67       }
68       else {
69         configuration.readExternal(config);
70       }
71     }
72   }
73
74   public static Element saveFacetConfiguration(final FacetConfiguration configuration) throws WriteExternalException {
75     if (configuration instanceof PersistentStateComponent) {
76       Object state = ((PersistentStateComponent)configuration).getState();
77       if (state instanceof Element) return ((Element)state);
78       return XmlSerializer.serialize(state, new SkipDefaultValuesSerializationFilters());
79     }
80     else {
81       final Element config = new Element(FacetManagerImpl.CONFIGURATION_ELEMENT);
82       configuration.writeExternal(config);
83       return config;
84     }
85   }
86 }