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

epugh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new b5e8ae18c52 SOLR-16396 | Migrate GET config sections updateHandler, 
directoryFactory, indexConfig, and codecFactory to JAX-RS. (#5023)
b5e8ae18c52 is described below

commit b5e8ae18c5269fe53a0815c0ff10a24887d3369c
Author: Jalaz Kumar <[email protected]>
AuthorDate: Tue Oct 13 14:48:39 2026 +0530

    SOLR-16396 | Migrate GET config sections updateHandler, directoryFactory, 
indexConfig, and codecFactory to JAX-RS. (#5023)
---
 .../SOLR-16396-config-get-components.yml           |  9 ++++++
 .../apache/solr/client/api/endpoint/ConfigApi.java | 12 +++++++
 .../org/apache/solr/handler/SolrConfigHandler.java |  3 ++
 .../apache/solr/handler/admin/api/GetConfig.java   | 37 ++++++++++++++++++----
 .../solr/handler/admin/api/GetConfigAPI.java       |  9 ++----
 .../handler/admin/api/GetConfigSolrCloudTest.java  | 15 +++++++++
 .../solr/handler/admin/api/GetConfigTest.java      | 14 ++++++++
 7 files changed, 87 insertions(+), 12 deletions(-)

diff --git a/changelog/unreleased/SOLR-16396-config-get-components.yml 
b/changelog/unreleased/SOLR-16396-config-get-components.yml
new file mode 100644
index 00000000000..99a86733e03
--- /dev/null
+++ b/changelog/unreleased/SOLR-16396-config-get-components.yml
@@ -0,0 +1,9 @@
+title:
+  Migrate GET config sections updateHandler, directoryFactory, indexConfig, 
and codecFactory to JAX-RS.
+type: changed
+authors:
+  - name: Jalaz Kumar
+    nick: jaykay12
+links:
+  - name: SOLR-16396
+    url: https://issues.apache.org/jira/browse/SOLR-16396
diff --git 
a/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java 
b/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java
index cc9cecc1bb5..baaf4a9f785 100644
--- a/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java
+++ b/solr/api/src/java/org/apache/solr/client/api/endpoint/ConfigApi.java
@@ -23,6 +23,7 @@ import io.swagger.v3.oas.annotations.Parameter;
 import jakarta.ws.rs.DefaultValue;
 import jakarta.ws.rs.GET;
 import jakarta.ws.rs.Path;
+import jakarta.ws.rs.PathParam;
 import jakarta.ws.rs.QueryParam;
 import org.apache.solr.client.api.model.ConfigInfoResponse;
 import org.apache.solr.client.api.model.ConfigOverlayResponse;
@@ -68,5 +69,16 @@ public interface ConfigApi {
             @DefaultValue("-1")
             @Parameter(description = "Expected request-params znode version")
             int expectedParamsVersion);
+
+    // TODO: Keep this regex in sync with GetConfig.MIGRATED_CONFIG_COMPONENTS
+    @GET
+    
@Path("/{component:updateHandler|directoryFactory|indexConfig|codecFactory}")
+    @StoreApiParameters
+    @Operation(
+        summary = "Fetch a config section",
+        tags = {"config"})
+    ConfigInfoResponse getConfigComponent(
+        @PathParam("component") @Parameter(description = "Name of the config 
component")
+            String component);
   }
 }
diff --git a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java 
b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
index d61b7d2bacb..8ea4dd3ca40 100644
--- a/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
@@ -225,6 +225,9 @@ public class SolrConfigHandler extends RequestHandlerBase
                     .getZnodeVersion(
                         req.getParams().getInt(ConfigOverlay.NAME, -1),
                         req.getParams().getInt(RequestParams.NAME, -1)));
+          } else if 
(GetConfig.MIGRATED_CONFIG_COMPONENTS.contains(parts.get(1))) {
+            V2ApiUtils.squashIntoSolrResponseWithoutHeader(
+                resp, new GetConfig(req).getConfigComponent(parts.get(1)));
           } else {
             Map<String, Object> m = getConfigDetails(parts.get(1), req);
             Map<String, Object> val = new LinkedHashMap<>();
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java 
b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java
index 80d46e7bac6..806cd1b3971 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfig.java
@@ -27,6 +27,7 @@ import java.util.ArrayList;
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import org.apache.solr.api.JerseyResource;
 import org.apache.solr.client.api.endpoint.ConfigApi;
 import org.apache.solr.client.api.model.ConfigInfoResponse;
@@ -48,6 +49,11 @@ import org.apache.solr.util.SolrPluginUtils;
 
 public class GetConfig extends JerseyResource implements ConfigApi.Get {
 
+  // TODO: Keep this in sync with @Path regex on 
ConfigApi.Get#getConfigComponent.
+  // TODO: Remove this set when remaining GET /config/{component} sections 
also migrate.
+  public static final Set<String> MIGRATED_CONFIG_COMPONENTS =
+      Set.of("updateHandler", "directoryFactory", "indexConfig", 
"codecFactory");
+
   private final SolrQueryRequest solrQueryRequest;
 
   @Inject
@@ -89,15 +95,36 @@ public class GetConfig extends JerseyResource implements 
ConfigApi.Get {
     return response;
   }
 
+  @Override
+  @PermissionName(CONFIG_READ_PERM)
+  public ConfigInfoResponse getConfigComponent(String componentName) {
+    final var response = instantiateJerseyResponse(ConfigInfoResponse.class);
+    Map<String, Object> section = new LinkedHashMap<>();
+    section.put(componentName, solrConfigAsMap().get(componentName));
+    response.config = jsonSafeCopy(section);
+    return response;
+  }
+
+  private Map<String, Object> solrConfigAsMap() {
+    return Utils.convertToMap(solrQueryRequest.getCore().getSolrConfig(), new 
LinkedHashMap<>());
+  }
+
+  @SuppressWarnings("unchecked")
+  private NullKeyTolerantMap jsonSafeCopy(Map<String, Object> map) {
+    final var jsonSafeCopy = new NullKeyTolerantMap("children");
+    jsonSafeCopy.putAll((Map<String, Object>) Utils.getDeepCopy(map, 20, 
true));
+    return jsonSafeCopy;
+  }
+
   @SuppressWarnings({"unchecked"})
   private Map<String, Object> buildConfigMap(
       SolrQueryRequest solrQueryRequest, boolean expandParams) {
-    Map<String, Object> map =
-        Utils.convertToMap(solrQueryRequest.getCore().getSolrConfig(), new 
LinkedHashMap<>());
+
+    Map<String, Object> configMap = solrConfigAsMap();
 
     Map<String, Object> reqHandlers =
         (Map<String, Object>)
-            map.computeIfAbsent(SolrRequestHandler.TYPE, k -> new 
LinkedHashMap<>());
+            configMap.computeIfAbsent(SolrRequestHandler.TYPE, k -> new 
LinkedHashMap<>());
     List<PluginInfo> plugins = 
solrQueryRequest.getCore().getImplicitHandlers();
     for (PluginInfo plugin : plugins) {
       if (SolrRequestHandler.TYPE.equals(plugin.type) && 
!reqHandlers.containsKey(plugin.name)) {
@@ -111,9 +138,7 @@ public class GetConfig extends JerseyResource implements 
ConfigApi.Get {
       }
     }
 
-    final var jsonSafeCopy = new NullKeyTolerantMap("children");
-    jsonSafeCopy.putAll((Map<String, Object>) Utils.getDeepCopy(map, 20, 
true));
-    return jsonSafeCopy;
+    return jsonSafeCopy(configMap);
   }
 
   @SuppressWarnings({"unchecked", "rawtypes"})
diff --git 
a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java 
b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java
index 6a0567c987c..1e67cb09c50 100644
--- a/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/admin/api/GetConfigAPI.java
@@ -28,8 +28,9 @@ import org.apache.solr.response.SolrQueryResponse;
 /**
  * V2 APIs for retrieving some or all configuration relevant to a particular 
collection (or core).
  *
- * <p>This class covers legacy AnnotatedApi paths under GET /config: /params, 
/params{paramset},
- * /overlay, /znodeVersion, etc.
+ * <p>This class covers legacy AnnotatedApi paths under GET /config: /params, 
/params{paramset}, and
+ * remaining {@code /config/{component}} sections not yet migrated to {@link
+ * org.apache.solr.client.api.endpoint.ConfigApi.Get}
  */
 public class GetConfigAPI {
   private final SolrConfigHandler configHandler;
@@ -63,13 +64,9 @@ public class GetConfigAPI {
         "/config/query",
         "/config/requestHandler",
         "/config/searchComponent",
-        "/config/updateHandler",
         "/config/queryResponseWriter",
         "/config/initParams",
         "/config/listener",
-        "/config/directoryFactory",
-        "/config/indexConfig",
-        "/config/codecFactory",
         "/config/requestDispatcher",
         "/config/jmx",
         "/config/queryParser",
diff --git 
a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java
 
b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java
index 7ce43a5ff3d..7b34a37bbb1 100644
--- 
a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java
+++ 
b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigSolrCloudTest.java
@@ -76,4 +76,19 @@ public class GetConfigSolrCloudTest extends 
SolrCloudTestCase {
     assertTrue(response.znodeVersion.overlay >= -1);
     assertTrue(response.znodeVersion.params >= -1);
   }
+
+  @Test
+  public void testGetConfigComponentFromCollection() throws Exception {
+    for (String component : GetConfig.MIGRATED_CONFIG_COMPONENTS) {
+      var request =
+          new ConfigApi.GetConfigComponent(IndexType.COLLECTION, 
COLLECTION_NAME, component);
+      var response = request.process(cluster.getSolrClient());
+
+      assertNotNull(component, response);
+      assertNull(component, response.error);
+      assertNotNull(component, response.config);
+      assertTrue(component, response.config.containsKey(component));
+      assertEquals(component, 1, response.config.size());
+    }
+  }
 }
diff --git 
a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java 
b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java
index a17d9258a18..b0fbbfa8035 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/api/GetConfigTest.java
@@ -80,4 +80,18 @@ public class GetConfigTest extends SolrTestCase {
     assertTrue(response.znodeVersion.overlay >= -1);
     assertTrue(response.znodeVersion.params >= -1);
   }
+
+  @Test
+  public void testGetConfigComponentFromCore() throws Exception {
+    for (String component : GetConfig.MIGRATED_CONFIG_COMPONENTS) {
+      var request = new ConfigApi.GetConfigComponent(IndexType.CORE, 
CORE_NAME, component);
+      var response = request.process(solrTestRule.getSolrClient(CORE_NAME));
+
+      assertNotNull(component, response);
+      assertNull(component, response.error);
+      assertNotNull(component, response.config);
+      assertTrue(component, response.config.containsKey(component));
+      assertEquals(component, 1, response.config.size());
+    }
+  }
 }

Reply via email to