platform: serialization tuned phpstorm/140.1514
authorRoman Shevchenko <roman.shevchenko@jetbrains.com>
Mon, 5 Jan 2015 10:32:07 +0000 (11:32 +0100)
committerRoman Shevchenko <roman.shevchenko@jetbrains.com>
Mon, 5 Jan 2015 10:32:07 +0000 (11:32 +0100)
- correct loading of Element-parameterized persistent state components
- state component parameter type detection method reused

platform/core-impl/src/com/intellij/openapi/components/ComponentSerializationUtil.java
platform/platform-impl/src/com/intellij/openapi/components/impl/stores/ComponentStoreImpl.java

index 0093d0016881e4bb9dc4482b15f1dd754bed817f..75bb037f375a4f9ffdcc6877c4b8097c1d2c37ef 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -21,21 +21,26 @@ import org.jdom.Element;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
+import java.lang.reflect.Type;
 import java.lang.reflect.TypeVariable;
 
 /**
  * @author nik
  */
 public class ComponentSerializationUtil {
-  public static Class getStateClass(final Class<? extends PersistentStateComponent> aClass) {
+  @NotNull
+  public static <S> Class<S> getStateClass(@NotNull Class<? extends PersistentStateComponent> aClass) {
     TypeVariable<Class<PersistentStateComponent>> variable = PersistentStateComponent.class.getTypeParameters()[0];
-    return ReflectionUtil.getRawType(ReflectionUtil.resolveVariableInHierarchy(variable, aClass));
+    Type type = ReflectionUtil.resolveVariableInHierarchy(variable, aClass);
+    assert type != null : aClass;
+    @SuppressWarnings("unchecked") Class<S> result = (Class<S>)ReflectionUtil.getRawType(type);
+    return result;
   }
 
   public static <S> void loadComponentState(@NotNull PersistentStateComponent<S> configuration, @Nullable Element element) {
     if (element != null) {
       Class<S> stateClass = getStateClass(configuration.getClass());
-      S state = XmlSerializer.deserialize(element, stateClass);
+      @SuppressWarnings("unchecked") S state = stateClass.equals(Element.class) ? (S)element : XmlSerializer.deserialize(element, stateClass);
       if (state != null) {
         configuration.loadState(state);
       }
index 72e4cea994d46d8e2d33490d888c10641fd70466..f5b5b4b8412659e27a5a926393f3d1eadde3fef7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2014 JetBrains s.r.o.
+ * Copyright 2000-2015 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -47,7 +47,6 @@ import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
 import java.io.IOException;
-import java.lang.reflect.Type;
 import java.net.URL;
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -229,7 +228,7 @@ public abstract class ComponentStoreImpl implements IComponentStore.Reloadable {
       return name;
     }
 
-    Class<T> stateClass = getComponentStateClass(component);
+    Class<T> stateClass = ComponentSerializationUtil.getStateClass(component.getClass());
     T state = getDefaultState(component, name, stateClass);
 
     Storage[] storageSpecs = getComponentStorageSpecs(component, stateSpec, StateStorageOperation.READ);
@@ -279,29 +278,6 @@ public abstract class ComponentStoreImpl implements IComponentStore.Reloadable {
     }
   }
 
-  @NotNull
-  private static <T> Class<T> getComponentStateClass(@NotNull final PersistentStateComponent<T> persistentStateComponent) {
-    final Class persistentStateComponentClass = PersistentStateComponent.class;
-
-    Class componentClass = persistentStateComponent.getClass();
-
-    nextSuperClass:
-    while (true) {
-      for (Class anInterface : componentClass.getInterfaces()) {
-        if (anInterface.equals(persistentStateComponentClass)) {
-          break nextSuperClass;
-        }
-      }
-
-      componentClass = componentClass.getSuperclass();
-    }
-
-    final Type type = ReflectionUtil.resolveVariable(persistentStateComponentClass.getTypeParameters()[0], componentClass);
-    assert type != null;
-    //noinspection unchecked
-    return (Class<T>)ReflectionUtil.getRawType(type);
-  }
-
   @NotNull
   public static String getComponentName(@NotNull PersistentStateComponent<?> persistentStateComponent) {
     return StoreUtil.getStateSpec(persistentStateComponent).name();