Cleanup (formatting)
[idea/community.git] / platform / projectModel-api / src / com / intellij / configurationStore / ComponentSerializationUtil.java
1 // Copyright 2000-2020 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.configurationStore;
3
4 import com.intellij.openapi.components.PersistentStateComponent;
5 import com.intellij.util.ReflectionUtil;
6 import com.intellij.util.xmlb.XmlSerializer;
7 import org.jdom.Element;
8 import org.jetbrains.annotations.NotNull;
9 import org.jetbrains.annotations.Nullable;
10
11 import java.lang.reflect.Type;
12 import java.lang.reflect.TypeVariable;
13
14 public final class ComponentSerializationUtil {
15   @NotNull
16   public static <S> Class<S> getStateClass(@NotNull Class<? extends PersistentStateComponent> aClass) {
17     TypeVariable<Class<PersistentStateComponent>> variable = PersistentStateComponent.class.getTypeParameters()[0];
18     Type type = ReflectionUtil.resolveVariableInHierarchy(variable, aClass);
19     assert type != null : aClass;
20     @SuppressWarnings("unchecked") Class<S> result = (Class<S>)ReflectionUtil.getRawType(type);
21     if (result == Object.class) {
22       //noinspection unchecked
23       return (Class<S>)aClass;
24     }
25     return result;
26   }
27
28   public static <S> void loadComponentState(@NotNull PersistentStateComponent<S> configuration, @Nullable Element element) {
29     if (element != null) {
30       Class<S> stateClass = getStateClass(configuration.getClass());
31       @SuppressWarnings("unchecked") S state = stateClass.equals(Element.class) ? (S)element : XmlSerializer.deserialize(element, stateClass);
32       configuration.loadState(state);
33     }
34   }
35 }