You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by dw...@apache.org on 2021/03/10 09:53:48 UTC

[lucene] 02/08: support super classes implementing COnfigurablePlugin

This is an automated email from the ASF dual-hosted git repository.

dweiss pushed a commit to branch jira/solr14977
in repository https://gitbox.apache.org/repos/asf/lucene.git

commit df7840dee5894dd819fbd552f1cbe002729e6dd5
Author: noblepaul <no...@gmail.com>
AuthorDate: Mon Nov 9 09:35:41 2020 +1100

    support super classes implementing COnfigurablePlugin<T>
---
 .../apache/solr/api/ContainerPluginsRegistry.java   | 21 ++++++++++++++-------
 .../apache/solr/handler/TestContainerPlugin.java    | 10 ++++++++++
 2 files changed, 24 insertions(+), 7 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
index 690aee8..883767a 100644
--- a/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
+++ b/solr/core/src/java/org/apache/solr/api/ContainerPluginsRegistry.java
@@ -377,7 +377,7 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
         throw new RuntimeException("Must have a no-arg constructor or CoreContainer constructor ");
       }
       if (instance instanceof ConfigurablePlugin) {
-        Class c = getConfigObj(instance);
+        Class c = getConfigClass((ConfigurablePlugin<?>) instance);
         if(c != null) {
           Object initVal =  mapper.readValue(Utils.toJSON(holder.original), c);
           ((ConfigurablePlugin) instance).initConfig(initVal);
@@ -397,19 +397,26 @@ public class ContainerPluginsRegistry implements ClusterPropertiesListener, MapW
       }
     }
 
-    @SuppressWarnings("rawtypes")
-    private Class getConfigObj(Object o) {
-      Type[] interfaces = o.getClass().getGenericInterfaces();
+  }
+
+  /**Get the generic type of a {@link ConfigurablePlugin}
+   */
+  @SuppressWarnings("rawtypes")
+  public static Class getConfigClass(ConfigurablePlugin<?> o) {
+    Class klas = o.getClass();
+    do {
+      Type[] interfaces = klas.getGenericInterfaces();
       for (Type type : interfaces) {
         if (type instanceof ParameterizedType) {
           ParameterizedType parameterizedType = (ParameterizedType) type;
-          if(parameterizedType.getRawType() == ConfigurablePlugin.class) {
+          if (parameterizedType.getRawType() == ConfigurablePlugin.class) {
             return (Class) parameterizedType.getActualTypeArguments()[0];
           }
         }
       }
-      return null;
-    }
+      klas = klas.getSuperclass();
+    } while (klas != null && klas != Object.class);
+    return null;
   }
 
   public ApiInfo createInfo(Map<String,Object> info, List<String> errs) throws IOException {
diff --git a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
index 79e3458..f3dea90 100644
--- a/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
+++ b/solr/core/src/test/org/apache/solr/handler/TestContainerPlugin.java
@@ -29,6 +29,7 @@ import org.apache.lucene.util.ResourceLoader;
 import org.apache.lucene.util.ResourceLoaderAware;
 import org.apache.solr.api.Command;
 import org.apache.solr.api.ConfigurablePlugin;
+import org.apache.solr.api.ContainerPluginsRegistry;
 import org.apache.solr.api.EndPoint;
 import org.apache.solr.client.solrj.SolrClient;
 import org.apache.solr.client.solrj.SolrServerException;
@@ -188,6 +189,9 @@ public class TestContainerPlugin extends SolrCloudTestCase {
       assertTrue("startCalled", C6.startCalled);
       assertFalse("stopCalled", C6.stopCalled);
 
+      assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC()));
+      assertEquals( CConfig.class, ContainerPluginsRegistry.getConfigClass(new CC1()));
+
       CConfig p = new CConfig();
       p.boolVal = Boolean.TRUE;
       p.strVal = "Something";
@@ -336,6 +340,12 @@ public class TestContainerPlugin extends SolrCloudTestCase {
     }
   }
 
+  public static class CC1 extends CC {
+
+  }
+  public static class CC2 extends CC1 {
+
+  }
   public static class CC implements ConfigurablePlugin<CConfig> {
     private CConfig cfg;