This is an automated email from the ASF dual-hosted git repository.
noble pushed a commit to branch jira/solr16547
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/jira/solr16547 by this push:
new 5b441d9ec3a refactor QueryResponseWriters
5b441d9ec3a is described below
commit 5b441d9ec3a7769921a6c7db734070419797c0be
Author: Noble Paul <[email protected]>
AuthorDate: Wed Nov 16 14:38:28 2022 +1100
refactor QueryResponseWriters
---
.../src/java/org/apache/solr/api/V2HttpCall.java | 5 +-
.../java/org/apache/solr/core/CoreContainer.java | 5 +-
.../src/java/org/apache/solr/core/PluginBag.java | 13 +-
.../org/apache/solr/core/RequestHandlerBag.java | 192 +++++++++++----------
.../java/org/apache/solr/core/RequestHandlers.java | 2 +-
.../java/org/apache/solr/core/ResponseWriters.java | 171 +++++++++---------
.../src/java/org/apache/solr/core/SolrCore.java | 32 ++--
.../java/org/apache/solr/handler/BlobHandler.java | 5 +-
.../java/org/apache/solr/handler/ClusterAPI.java | 5 +-
.../apache/solr/handler/ReplicationHandler.java | 8 +-
.../apache/solr/handler/export/ExportWriter.java | 1 -
.../org/apache/solr/jersey/JerseyApplications.java | 4 +-
.../org/apache/solr/jersey/MetricBeanFactory.java | 4 +-
.../apache/solr/jersey/RequestMetricHandling.java | 1 -
.../apache/solr/response/QueryResponseWriter.java | 10 +-
.../java/org/apache/solr/servlet/HttpSolrCall.java | 3 +-
.../test/org/apache/solr/core/PluginBagTest.java | 17 +-
.../solr/handler/admin/TestApiFramework.java | 14 +-
18 files changed, 242 insertions(+), 250 deletions(-)
diff --git a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
index 18b3c68a271..78567bdb934 100644
--- a/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
+++ b/solr/core/src/java/org/apache/solr/api/V2HttpCall.java
@@ -51,13 +51,12 @@ import org.apache.solr.common.util.PathTrie;
import org.apache.solr.common.util.SuppressForbidden;
import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.PluginBag;
+import org.apache.solr.core.RequestHandlerBag;
import org.apache.solr.core.SolrCore;
import org.apache.solr.handler.RequestHandlerUtils;
import org.apache.solr.jersey.RequestContextKeys;
import org.apache.solr.jersey.container.ContainerRequestUtils;
import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.QueryResponseWriter;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.security.AuthorizationContext;
@@ -263,7 +262,7 @@ public class V2HttpCall extends HttpSolrCall {
}
public static Api getApiInfo(
- PluginBag<SolrRequestHandler> requestHandlers,
+ RequestHandlerBag requestHandlers,
String path,
String method,
String fullPath,
diff --git a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
index e47475103b0..9ae4e77618f 100644
--- a/solr/core/src/java/org/apache/solr/core/CoreContainer.java
+++ b/solr/core/src/java/org/apache/solr/core/CoreContainer.java
@@ -187,8 +187,7 @@ public class CoreContainer {
}
}
- private volatile RequestHandlerBag containerHandlers =
- new RequestHandlerBag( null);
+ private volatile RequestHandlerBag containerHandlers = new
RequestHandlerBag(null);
private volatile ApplicationHandler jerseyAppHandler;
@@ -338,7 +337,7 @@ public class CoreContainer {
return RequestHandlerBase.getRequestHandler(path, containerHandlers);
}
- public PluginBag<SolrRequestHandler> getRequestHandlers() {
+ public RequestHandlerBag getRequestHandlers() {
return this.containerHandlers;
}
diff --git a/solr/core/src/java/org/apache/solr/core/PluginBag.java
b/solr/core/src/java/org/apache/solr/core/PluginBag.java
index 2cbc1a13a3f..693558edd28 100644
--- a/solr/core/src/java/org/apache/solr/core/PluginBag.java
+++ b/solr/core/src/java/org/apache/solr/core/PluginBag.java
@@ -29,7 +29,6 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Supplier;
import java.util.stream.Collectors;
-
import org.apache.lucene.util.ResourceLoader;
import org.apache.lucene.util.ResourceLoaderAware;
import org.apache.solr.common.SolrException;
@@ -72,8 +71,12 @@ public class PluginBag<T> implements AutoCloseable {
}
}
- public PluginBag(Class<T> klass, SolrCore core, boolean needThreadSafety,
Map<String,
- PluginHolder<T>> defaults,SolrConfig.SolrPluginInfo pluginMetaData) {
+ public PluginBag(
+ Class<T> klass,
+ SolrCore core,
+ boolean needThreadSafety,
+ Map<String, PluginHolder<T>> defaults,
+ SolrConfig.SolrPluginInfo pluginMetaData) {
this.core = core;
this.klass = klass;
this.registry = needThreadSafety ? new ConcurrentHashMap<>(0) : new
HashMap<>(0);
@@ -157,7 +160,7 @@ public class PluginBag<T> implements AutoCloseable {
/** Get a plugin by name. If the plugin is not already instantiated, it is
done here */
public T get(String name) {
PluginHolder<T> result = registry.get(name);
- if(result == null && defaults != null) result = defaults.get(name);
+ if (result == null && defaults != null) result = defaults.get(name);
return result == null ? null : result.get();
}
@@ -255,7 +258,7 @@ public class PluginBag<T> implements AutoCloseable {
infos.stream().map(i -> i.name).collect(Collectors.toList()));
}
}
- if(defaults != null) {
+ if (defaults != null) {
for (Map.Entry<String, T> e : defaults.entrySet()) {
if (!contains(e.getKey())) {
put(e.getKey(), new PluginHolder<>(null, e.getValue()));
diff --git a/solr/core/src/java/org/apache/solr/core/RequestHandlerBag.java
b/solr/core/src/java/org/apache/solr/core/RequestHandlerBag.java
index cfddb08e4a7..2085354e04a 100644
--- a/solr/core/src/java/org/apache/solr/core/RequestHandlerBag.java
+++ b/solr/core/src/java/org/apache/solr/core/RequestHandlerBag.java
@@ -1,6 +1,13 @@
package org.apache.solr.core;
+import static java.util.Collections.singletonMap;
+import static org.apache.solr.api.ApiBag.HANDLER_NAME;
+import java.lang.invoke.MethodHandles;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.solr.api.Api;
import org.apache.solr.api.ApiBag;
@@ -9,117 +16,112 @@ import org.apache.solr.api.JerseyResource;
import org.apache.solr.common.SolrException;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.handler.RequestHandlerBase;
+import org.apache.solr.jersey.JerseyApplications;
import org.apache.solr.request.SolrRequestHandler;
import org.glassfish.jersey.server.ResourceConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import java.lang.invoke.MethodHandles;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static java.util.Collections.singletonMap;
-import static org.apache.solr.api.ApiBag.HANDLER_NAME;
-
public class RequestHandlerBag extends PluginBag<SolrRequestHandler> {
- private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
-
- private ApiBag apiBag;
- private ResourceConfig jerseyResources;
- private JerseyMetricsLookupRegistry infoBeanByResource;
-
- public RequestHandlerBag(SolrCore core) {
- super(SolrRequestHandler.class, core, true);
- this.apiBag = new ApiBag(core != null);
+ private static final Logger log =
LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
+
+ private ApiBag apiBag;
+ private ResourceConfig jerseyResources;
+ private JerseyMetricsLookupRegistry infoBeanByResource;
+
+ public RequestHandlerBag(SolrCore core) {
+ super(SolrRequestHandler.class, core, true);
+ this.apiBag = new ApiBag(core != null);
+ this.infoBeanByResource = new JerseyMetricsLookupRegistry();
+ this.jerseyResources =
+ (core == null)
+ ? new JerseyApplications.CoreContainerApp(infoBeanByResource)
+ : new JerseyApplications.SolrCoreApp(core, infoBeanByResource);
+ }
+
+ @Override
+ public PluginHolder<SolrRequestHandler> put(
+ String name, PluginHolder<SolrRequestHandler> plugin) {
+ Boolean registerApi = null;
+ Boolean disableHandler = null;
+ if (plugin.pluginInfo != null) {
+ String registerAt = plugin.pluginInfo.attributes.get("registerPath");
+ if (registerAt != null) {
+ List<String> strs = StrUtils.splitSmart(registerAt, ',');
+ disableHandler = !strs.contains("/solr");
+ registerApi = strs.contains("/v2");
+ }
}
- @Override
- public PluginHolder<SolrRequestHandler> put(String name,
PluginHolder<SolrRequestHandler> plugin) {
- Boolean registerApi = null;
- Boolean disableHandler = null;
- if (plugin.pluginInfo != null) {
- String registerAt =
plugin.pluginInfo.attributes.get("registerPath");
- if (registerAt != null) {
- List<String> strs = StrUtils.splitSmart(registerAt, ',');
- disableHandler = !strs.contains("/solr");
- registerApi = strs.contains("/v2");
+ if (apiBag != null) {
+ if (plugin.isLoaded()) {
+ SolrRequestHandler inst = plugin.get();
+ if (inst instanceof ApiSupport) {
+ ApiSupport apiSupport = (ApiSupport) inst;
+ if (registerApi == null) registerApi = apiSupport.registerV2();
+ if (disableHandler == null) disableHandler =
!apiSupport.registerV1();
+
+ if (registerApi) {
+ Collection<Api> apis = apiSupport.getApis();
+ if (apis != null) {
+ Map<String, String> nameSubstitutes = singletonMap(HANDLER_NAME,
name);
+ for (Api api : apis) {
+ apiBag.register(api, nameSubstitutes);
+ }
}
- }
- if (apiBag != null) {
- if (plugin.isLoaded()) {
- SolrRequestHandler inst = plugin.get();
- if (inst instanceof ApiSupport) {
- ApiSupport apiSupport = (ApiSupport) inst;
- if (registerApi == null) registerApi =
apiSupport.registerV2();
- if (disableHandler == null) disableHandler =
!apiSupport.registerV1();
-
- if (registerApi) {
- Collection<Api> apis = apiSupport.getApis();
- if (apis != null) {
- Map<String, String> nameSubstitutes =
singletonMap(HANDLER_NAME, name);
- for (Api api : apis) {
- apiBag.register(api, nameSubstitutes);
- }
- }
-
- // TODO Should we use <requestHandler name="/blah"> to
override the path that each
- // resource registers under?
- Collection<Class<? extends JerseyResource>> jerseyApis
=
- apiSupport.getJerseyResources();
- if (!CollectionUtils.isEmpty(jerseyApis)) {
- for (Class<? extends JerseyResource> jerseyClazz :
jerseyApis) {
- if (log.isDebugEnabled()) {
- log.debug("Registering jersey resource
class: {}", jerseyClazz.getName());
- }
- jerseyResources.register(jerseyClazz);
- // See MetricsBeanFactory javadocs for a
better understanding of this resource->RH
- // mapping
- if (inst instanceof RequestHandlerBase) {
- infoBeanByResource.put(jerseyClazz,
(RequestHandlerBase) inst);
- }
- }
- }
- }
+ // TODO Should we use <requestHandler name="/blah"> to override
the path that each
+ // resource registers under?
+ Collection<Class<? extends JerseyResource>> jerseyApis =
+ apiSupport.getJerseyResources();
+ if (!CollectionUtils.isEmpty(jerseyApis)) {
+ for (Class<? extends JerseyResource> jerseyClazz : jerseyApis) {
+ if (log.isDebugEnabled()) {
+ log.debug("Registering jersey resource class: {}",
jerseyClazz.getName());
}
- } else {
- if (registerApi != null && registerApi)
- apiBag.registerLazy((PluginHolder<SolrRequestHandler>)
plugin, plugin.pluginInfo);
+ jerseyResources.register(jerseyClazz);
+ // See MetricsBeanFactory javadocs for a better understanding
of this resource->RH
+ // mapping
+ if (inst instanceof RequestHandlerBase) {
+ infoBeanByResource.put(jerseyClazz, (RequestHandlerBase)
inst);
+ }
+ }
}
+ }
}
- PluginHolder<SolrRequestHandler> old = null;
- if (disableHandler == null) disableHandler = Boolean.FALSE;
- if (!disableHandler) old = registry.put(name, plugin);
- if (plugin.pluginInfo != null && plugin.pluginInfo.isDefault())
setDefault(name);
- if (plugin.isLoaded()) registerMBean(plugin.get(), core, name);
- // old instance has been replaced - close it to prevent mem leaks
- if (old != null && old != plugin) {
- closeQuietly(old);
- }
- return old;
+ } else {
+ if (registerApi != null && registerApi) apiBag.registerLazy(plugin,
plugin.pluginInfo);
+ }
}
-
- public Api v2lookup(String path, String method, Map<String, String> parts)
{
- if (apiBag == null) {
- throw new SolrException(
- SolrException.ErrorCode.SERVER_ERROR,
- "this should not happen, looking up for v2 API at the
wrong place");
- }
- return apiBag.lookup(path, method, parts);
+ PluginHolder<SolrRequestHandler> old = null;
+ if (disableHandler == null) disableHandler = Boolean.FALSE;
+ if (!disableHandler) old = registry.put(name, plugin);
+ if (plugin.pluginInfo != null && plugin.pluginInfo.isDefault())
setDefault(name);
+ if (plugin.isLoaded()) registerMBean(plugin.get(), core, name);
+ // old instance has been replaced - close it to prevent mem leaks
+ if (old != null && old != plugin) {
+ closeQuietly(old);
}
-
-
-
- public ApiBag getApiBag() {
- return apiBag;
+ return old;
+ }
+
+ public Api v2lookup(String path, String method, Map<String, String> parts) {
+ if (apiBag == null) {
+ throw new SolrException(
+ SolrException.ErrorCode.SERVER_ERROR,
+ "this should not happen, looking up for v2 API at the wrong place");
}
+ return apiBag.lookup(path, method, parts);
+ }
- public ResourceConfig getJerseyEndpoints() {
- return jerseyResources;
- }
+ public ApiBag getApiBag() {
+ return apiBag;
+ }
+
+ public ResourceConfig getJerseyEndpoints() {
+ return jerseyResources;
+ }
- public static class JerseyMetricsLookupRegistry
- extends HashMap<Class<? extends JerseyResource>, RequestHandlerBase> {}
+ public static class JerseyMetricsLookupRegistry
+ extends HashMap<Class<? extends JerseyResource>, RequestHandlerBase> {}
}
diff --git a/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
b/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
index 4c2e7d15041..4e905ad8d68 100644
--- a/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
+++ b/solr/core/src/java/org/apache/solr/core/RequestHandlers.java
@@ -51,7 +51,7 @@ public final class RequestHandlers {
this.core = core;
// we need a thread safe registry since methods like register are
currently documented to be
// thread safe.
- handlers = new RequestHandlerBag( core);
+ handlers = new RequestHandlerBag(core);
}
/**
diff --git a/solr/core/src/java/org/apache/solr/core/ResponseWriters.java
b/solr/core/src/java/org/apache/solr/core/ResponseWriters.java
index 8a11bb3390f..48fdfd7558b 100644
--- a/solr/core/src/java/org/apache/solr/core/ResponseWriters.java
+++ b/solr/core/src/java/org/apache/solr/core/ResponseWriters.java
@@ -17,101 +17,114 @@
package org.apache.solr.core;
import com.google.common.collect.ImmutableMap;
-import org.apache.solr.client.solrj.impl.BinaryResponseParser;
-import org.apache.solr.common.params.CommonParams;
-import org.apache.solr.handler.ReplicationHandler;
-import org.apache.solr.request.SolrQueryRequest;
-import org.apache.solr.response.*;
-
import java.io.Closeable;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
+import org.apache.solr.client.solrj.impl.BinaryResponseParser;
+import org.apache.solr.common.params.CommonParams;
+import org.apache.solr.handler.ReplicationHandler;
+import org.apache.solr.request.SolrQueryRequest;
+import org.apache.solr.response.BinaryResponseWriter;
+import org.apache.solr.response.CSVResponseWriter;
+import org.apache.solr.response.GeoJSONResponseWriter;
+import org.apache.solr.response.GraphMLResponseWriter;
+import org.apache.solr.response.JSONResponseWriter;
+import org.apache.solr.response.PHPResponseWriter;
+import org.apache.solr.response.PHPSerializedResponseWriter;
+import org.apache.solr.response.PythonResponseWriter;
+import org.apache.solr.response.QueryResponseWriter;
+import org.apache.solr.response.RawResponseWriter;
+import org.apache.solr.response.RubyResponseWriter;
+import org.apache.solr.response.SchemaXmlResponseWriter;
+import org.apache.solr.response.SmileResponseWriter;
+import org.apache.solr.response.SolrQueryResponse;
+import org.apache.solr.response.XMLResponseWriter;
public class ResponseWriters {
- public static final SolrConfig.SolrPluginInfo info =
SolrConfig.classVsSolrPluginInfo.get(QueryResponseWriter.class.getName());
- private static QueryResponseWriter standard;
+ public static final SolrConfig.SolrPluginInfo info =
+
SolrConfig.classVsSolrPluginInfo.get(QueryResponseWriter.class.getName());
+ private static QueryResponseWriter standard;
- public static QueryResponseWriter get(String name) {
- return DEFAULT_RESPONSE_WRITERS.get(name);
- }
- public static QueryResponseWriter getOrDefault(String name){
- QueryResponseWriter result = DEFAULT_RESPONSE_WRITERS.get(name);
- return result==null? standard: result;
+ public static QueryResponseWriter get(String name) {
+ return DEFAULT_RESPONSE_WRITERS.get(name);
+ }
- }
-
- public static final Map<String, QueryResponseWriter>
DEFAULT_RESPONSE_WRITERS;
- public static final Map<String,
PluginBag.PluginHolder<QueryResponseWriter>> DEFAULT_RESPONSE_WRITER_HOLDERS ;
+ public static QueryResponseWriter getOrDefault(String name) {
+ QueryResponseWriter result = DEFAULT_RESPONSE_WRITERS.get(name);
+ return result == null ? standard : result;
+ }
+ public static final Map<String, QueryResponseWriter>
DEFAULT_RESPONSE_WRITERS;
+ public static final Map<String, PluginBag.PluginHolder<QueryResponseWriter>>
+ DEFAULT_RESPONSE_WRITER_HOLDERS;
- static {
- HashMap<String, QueryResponseWriter> m = new HashMap<>(15, 1);
- m.put("xml", new XMLResponseWriter());
- m.put(CommonParams.JSON, new JSONResponseWriter());
- m.put("standard", m.get(CommonParams.JSON));
- m.put("geojson", new GeoJSONResponseWriter());
- m.put("graphml", new GraphMLResponseWriter());
- m.put("python", new PythonResponseWriter());
- m.put("php", new PHPResponseWriter());
- m.put("phps", new PHPSerializedResponseWriter());
- m.put("ruby", new RubyResponseWriter());
- m.put("raw", new RawResponseWriter());
- m.put(CommonParams.JAVABIN, new BinaryResponseWriter());
- m.put("csv", new CSVResponseWriter());
- m.put("schema.xml", new SchemaXmlResponseWriter());
- m.put("smile", new SmileResponseWriter());
- standard = m.get("standard");
- m.put(ReplicationHandler.FILE_STREAM, getFileStreamWriter());
- DEFAULT_RESPONSE_WRITERS = Collections.unmodifiableMap(m);
- try {
- m.put(
- "xlsx",
- (QueryResponseWriter)
-
Class.forName("org.apache.solr.handler.extraction.XLSXResponseWriter")
- .getConstructor()
- .newInstance());
- } catch (Exception e) {
- // don't worry; extraction module not in class path
- }
- ImmutableMap.Builder<String,
PluginBag.PluginHolder<QueryResponseWriter>> b = ImmutableMap.builder();
- DEFAULT_RESPONSE_WRITERS.forEach((k, v) -> b.put(k, new
PluginBag.PluginHolder<>(v, info)));
- DEFAULT_RESPONSE_WRITER_HOLDERS = b.build();
+ static {
+ HashMap<String, QueryResponseWriter> m = new HashMap<>(15, 1);
+ m.put("xml", new XMLResponseWriter());
+ m.put(CommonParams.JSON, new JSONResponseWriter());
+ m.put("standard", m.get(CommonParams.JSON));
+ m.put("geojson", new GeoJSONResponseWriter());
+ m.put("graphml", new GraphMLResponseWriter());
+ m.put("python", new PythonResponseWriter());
+ m.put("php", new PHPResponseWriter());
+ m.put("phps", new PHPSerializedResponseWriter());
+ m.put("ruby", new RubyResponseWriter());
+ m.put("raw", new RawResponseWriter());
+ m.put(CommonParams.JAVABIN, new BinaryResponseWriter());
+ m.put("csv", new CSVResponseWriter());
+ m.put("schema.xml", new SchemaXmlResponseWriter());
+ m.put("smile", new SmileResponseWriter());
+ standard = m.get("standard");
+ m.put(ReplicationHandler.FILE_STREAM, getFileStreamWriter());
+ DEFAULT_RESPONSE_WRITERS = Collections.unmodifiableMap(m);
+ try {
+ m.put(
+ "xlsx",
+ (QueryResponseWriter)
+
Class.forName("org.apache.solr.handler.extraction.XLSXResponseWriter")
+ .getConstructor()
+ .newInstance());
+ } catch (Exception e) {
+ // don't worry; extraction module not in class path
}
+ ImmutableMap.Builder<String, PluginBag.PluginHolder<QueryResponseWriter>>
b =
+ ImmutableMap.builder();
+ DEFAULT_RESPONSE_WRITERS.forEach((k, v) -> b.put(k, new
PluginBag.PluginHolder<>(v, info)));
+ DEFAULT_RESPONSE_WRITER_HOLDERS = b.build();
+ }
- private static BinaryResponseWriter getFileStreamWriter() {
- return new BinaryResponseWriter() {
- @Override
- public void write(OutputStream out, SolrQueryRequest req,
SolrQueryResponse response)
- throws IOException {
- RawWriter rawWriter = (RawWriter)
response.getValues().get(ReplicationHandler.FILE_STREAM);
- if (rawWriter != null) {
- rawWriter.write(out);
- if (rawWriter instanceof Closeable) ((Closeable)
rawWriter).close();
- }
- }
-
- @Override
- public String getContentType(SolrQueryRequest request,
SolrQueryResponse response) {
- RawWriter rawWriter = (RawWriter)
response.getValues().get(ReplicationHandler.FILE_STREAM);
- if (rawWriter != null) {
- return rawWriter.getContentType();
- } else {
- return BinaryResponseParser.BINARY_CONTENT_TYPE;
- }
- }
- };
- }
-
-
+ private static BinaryResponseWriter getFileStreamWriter() {
+ return new BinaryResponseWriter() {
+ @Override
+ public void write(OutputStream out, SolrQueryRequest req,
SolrQueryResponse response)
+ throws IOException {
+ RawWriter rawWriter = (RawWriter)
response.getValues().get(ReplicationHandler.FILE_STREAM);
+ if (rawWriter != null) {
+ rawWriter.write(out);
+ if (rawWriter instanceof Closeable) ((Closeable) rawWriter).close();
+ }
+ }
- public interface RawWriter {
- default String getContentType() {
- return BinaryResponseParser.BINARY_CONTENT_TYPE;
+ @Override
+ public String getContentType(SolrQueryRequest request, SolrQueryResponse
response) {
+ RawWriter rawWriter = (RawWriter)
response.getValues().get(ReplicationHandler.FILE_STREAM);
+ if (rawWriter != null) {
+ return rawWriter.getContentType();
+ } else {
+ return BinaryResponseParser.BINARY_CONTENT_TYPE;
}
+ }
+ };
+ }
- void write(OutputStream os) throws IOException;
+ public interface RawWriter {
+ default String getContentType() {
+ return BinaryResponseParser.BINARY_CONTENT_TYPE;
}
+
+ void write(OutputStream os) throws IOException;
+ }
}
diff --git a/solr/core/src/java/org/apache/solr/core/SolrCore.java
b/solr/core/src/java/org/apache/solr/core/SolrCore.java
index 8ff9255d221..fa98ffca100 100644
--- a/solr/core/src/java/org/apache/solr/core/SolrCore.java
+++ b/solr/core/src/java/org/apache/solr/core/SolrCore.java
@@ -17,7 +17,6 @@
package org.apache.solr.core;
import static org.apache.solr.common.params.CommonParams.PATH;
-import static org.apache.solr.core.ResponseWriters.DEFAULT_RESPONSE_WRITERS;
import com.codahale.metrics.Counter;
import com.codahale.metrics.Timer;
@@ -29,7 +28,6 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
-import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.lang.invoke.MethodHandles;
@@ -78,7 +76,6 @@ import org.apache.lucene.store.IndexInput;
import org.apache.lucene.store.IndexOutput;
import org.apache.lucene.store.LockObtainFailedException;
import org.apache.lucene.util.ResourceLoader;
-import org.apache.solr.client.solrj.impl.BinaryResponseParser;
import org.apache.solr.cloud.CloudDescriptor;
import org.apache.solr.cloud.RecoveryStrategy;
import org.apache.solr.cloud.ZkSolrResourceLoader;
@@ -105,7 +102,6 @@ import org.apache.solr.core.snapshots.SolrSnapshotManager;
import org.apache.solr.core.snapshots.SolrSnapshotMetaDataManager;
import
org.apache.solr.core.snapshots.SolrSnapshotMetaDataManager.SnapshotMetaData;
import org.apache.solr.handler.IndexFetcher;
-import org.apache.solr.handler.ReplicationHandler;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.handler.SolrConfigHandler;
import org.apache.solr.handler.component.HighlightComponent;
@@ -120,21 +116,8 @@ import org.apache.solr.pkg.SolrPackageLoader;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.request.SolrRequestInfo;
-import org.apache.solr.response.BinaryResponseWriter;
-import org.apache.solr.response.CSVResponseWriter;
-import org.apache.solr.response.GeoJSONResponseWriter;
-import org.apache.solr.response.GraphMLResponseWriter;
-import org.apache.solr.response.JSONResponseWriter;
-import org.apache.solr.response.PHPResponseWriter;
-import org.apache.solr.response.PHPSerializedResponseWriter;
-import org.apache.solr.response.PythonResponseWriter;
import org.apache.solr.response.QueryResponseWriter;
-import org.apache.solr.response.RawResponseWriter;
-import org.apache.solr.response.RubyResponseWriter;
-import org.apache.solr.response.SchemaXmlResponseWriter;
-import org.apache.solr.response.SmileResponseWriter;
import org.apache.solr.response.SolrQueryResponse;
-import org.apache.solr.response.XMLResponseWriter;
import org.apache.solr.response.transform.TransformerFactory;
import org.apache.solr.rest.ManagedResourceStorage;
import org.apache.solr.rest.ManagedResourceStorage.StorageIO;
@@ -1954,7 +1937,7 @@ public class SolrCore implements SolrInfoBean, Closeable {
}
/** Returns an unmodifiable Map containing the registered handlers */
- public PluginBag<SolrRequestHandler> getRequestHandlers() {
+ public RequestHandlerBag getRequestHandlers() {
return reqHandlers.handlers;
}
@@ -1997,8 +1980,7 @@ public class SolrCore implements SolrInfoBean, Closeable {
if (searchComponents.isLoaded(name)
&& searchComponents.get(name) instanceof HighlightComponent) {
if (!HighlightComponent.COMPONENT_NAME.equals(name)) {
- searchComponents.put(
- HighlightComponent.COMPONENT_NAME,
searchComponents.getHolder(name));
+ searchComponents.put(HighlightComponent.COMPONENT_NAME,
searchComponents.getHolder(name));
}
break;
}
@@ -2992,9 +2974,15 @@ public class SolrCore implements SolrInfoBean, Closeable
{
public PluginBag<QueryResponseWriter> getResponseWriters() {
return responseWriters;
}
+
private final PluginBag<QueryResponseWriter> responseWriters =
- new PluginBag<>(QueryResponseWriter.class, this, false,
- ResponseWriters.DEFAULT_RESPONSE_WRITER_HOLDERS,
ResponseWriters.info);
+ new PluginBag<>(
+ QueryResponseWriter.class,
+ this,
+ false,
+ ResponseWriters.DEFAULT_RESPONSE_WRITER_HOLDERS,
+ ResponseWriters.info);
+
public void fetchLatestSchema() {
IndexSchema schema = configSet.getIndexSchema(true);
setLatestSchema(schema);
diff --git a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
index 789be7117be..b77eaa1ad4d 100644
--- a/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/BlobHandler.java
@@ -25,7 +25,6 @@ import static
org.apache.solr.common.params.CommonParams.VERSION;
import com.google.common.collect.Lists;
import java.io.IOException;
import java.io.InputStream;
-import java.io.OutputStream;
import java.lang.invoke.MethodHandles;
import java.nio.ByteBuffer;
import java.security.MessageDigest;
@@ -54,7 +53,6 @@ import org.apache.solr.common.util.NamedList;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.core.PluginInfo;
import org.apache.solr.core.ResponseWriters;
-import org.apache.solr.core.SolrCore;
import org.apache.solr.handler.admin.api.GetBlobInfoAPI;
import org.apache.solr.handler.admin.api.UploadBlobAPI;
import org.apache.solr.request.LocalSolrQueryRequest;
@@ -211,7 +209,8 @@ public class BlobHandler extends RequestHandlerBase
if (docs.totalHits.value > 0) {
rsp.add(
ReplicationHandler.FILE_STREAM,
- (ResponseWriters.RawWriter) os -> {
+ (ResponseWriters.RawWriter)
+ os -> {
Document doc =
req.getSearcher().doc(docs.scoreDocs[0].doc);
IndexableField sf = doc.getField("blob");
FieldType fieldType =
req.getSchema().getField("blob").getType();
diff --git a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
index 236159bbe0a..164e6c25bd7 100644
--- a/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
+++ b/solr/core/src/java/org/apache/solr/handler/ClusterAPI.java
@@ -80,13 +80,12 @@ public class ClusterAPI {
@EndPoint(method = GET, path = "/node/heap", permission = COLL_READ_PERM)
public void heap(SolrQueryRequest req, SolrQueryResponse rsp) throws
Exception {
Runtime rt = Runtime.getRuntime();
- if(req.getParams().getBool("gc", false)) {
+ if (req.getParams().getBool("gc", false)) {
rt.gc();
}
- rsp.add("heap", rt.totalMemory() - rt.freeMemory());
+ rsp.add("heap", rt.totalMemory() - rt.freeMemory());
}
-
@EndPoint(method = GET, path = "/cluster/node-roles", permission =
COLL_READ_PERM)
public void roles(SolrQueryRequest req, SolrQueryResponse rsp) throws
Exception {
rsp.add(
diff --git a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
index 29b0e47aaa7..b28b3918f4d 100644
--- a/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
+++ b/solr/core/src/java/org/apache/solr/handler/ReplicationHandler.java
@@ -83,8 +83,14 @@ import org.apache.solr.common.util.SimpleOrderedMap;
import org.apache.solr.common.util.SolrNamedThreadFactory;
import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.SuppressForbidden;
-import org.apache.solr.core.*;
+import org.apache.solr.core.CloseHook;
+import org.apache.solr.core.CoreContainer;
import org.apache.solr.core.DirectoryFactory.DirContext;
+import org.apache.solr.core.IndexDeletionPolicyWrapper;
+import org.apache.solr.core.ResponseWriters;
+import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrDeletionPolicy;
+import org.apache.solr.core.SolrEventListener;
import org.apache.solr.core.backup.repository.BackupRepository;
import org.apache.solr.core.backup.repository.LocalFileSystemRepository;
import org.apache.solr.handler.IndexFetcher.IndexFetchResult;
diff --git
a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
index d3764c1088b..5edb3b03e9c 100644
--- a/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
+++ b/solr/core/src/java/org/apache/solr/handler/export/ExportWriter.java
@@ -56,7 +56,6 @@ import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.params.StreamParams;
import org.apache.solr.common.util.JavaBinCodec;
import org.apache.solr.core.ResponseWriters;
-import org.apache.solr.core.SolrCore;
import org.apache.solr.metrics.SolrMetricsContext;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrRequestInfo;
diff --git a/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
b/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
index dc613dbe958..0b964df5fa2 100644
--- a/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
+++ b/solr/core/src/java/org/apache/solr/jersey/JerseyApplications.java
@@ -21,7 +21,6 @@ import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.info.License;
import javax.inject.Singleton;
-
import org.apache.solr.core.RequestHandlerBag;
import org.apache.solr.core.SolrCore;
import org.apache.solr.request.SolrQueryRequest;
@@ -103,7 +102,8 @@ public class JerseyApplications {
public static class SolrCoreApp extends CoreContainerApp {
- public SolrCoreApp(SolrCore solrCore,
RequestHandlerBag.JerseyMetricsLookupRegistry beanRegistry) {
+ public SolrCoreApp(
+ SolrCore solrCore, RequestHandlerBag.JerseyMetricsLookupRegistry
beanRegistry) {
super(beanRegistry);
// Dependency Injection for Jersey resources
diff --git a/solr/core/src/java/org/apache/solr/jersey/MetricBeanFactory.java
b/solr/core/src/java/org/apache/solr/jersey/MetricBeanFactory.java
index 9821cd51f87..b9dbab54f73 100644
--- a/solr/core/src/java/org/apache/solr/jersey/MetricBeanFactory.java
+++ b/solr/core/src/java/org/apache/solr/jersey/MetricBeanFactory.java
@@ -26,8 +26,8 @@ import org.glassfish.hk2.api.Factory;
* <p>Currently, Jersey resources that have a corresponding v1 API produce the
same metrics as their
* v1 equivalent and rely on the v1 requestHandler instance to do so. Solr
facilitates this by
* building a map of the Jersey resource to requestHandler mapping (a {@link
- * RequestHandlerBag.JerseyMetricsLookupRegistry}), and injecting it into the
pre- and
- * post- Jersey filters that handle metrics.
+ * RequestHandlerBag.JerseyMetricsLookupRegistry}), and injecting it into the
pre- and post- Jersey
+ * filters that handle metrics.
*
* <p>This isn't ideal, as requestHandler's don't really "fit" conceptually
here. But it's
* unavoidable while we want our v2 APIs to exactly match the metrics produced
by v1 calls.
diff --git
a/solr/core/src/java/org/apache/solr/jersey/RequestMetricHandling.java
b/solr/core/src/java/org/apache/solr/jersey/RequestMetricHandling.java
index b4543a2084b..44f2cbee3ea 100644
--- a/solr/core/src/java/org/apache/solr/jersey/RequestMetricHandling.java
+++ b/solr/core/src/java/org/apache/solr/jersey/RequestMetricHandling.java
@@ -31,7 +31,6 @@ import javax.ws.rs.container.ContainerResponseContext;
import javax.ws.rs.container.ContainerResponseFilter;
import javax.ws.rs.container.ResourceInfo;
import javax.ws.rs.core.Context;
-
import org.apache.solr.core.RequestHandlerBag;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.SolrQueryRequest;
diff --git
a/solr/core/src/java/org/apache/solr/response/QueryResponseWriter.java
b/solr/core/src/java/org/apache/solr/response/QueryResponseWriter.java
index 932df711bd2..bbcd7a50b68 100644
--- a/solr/core/src/java/org/apache/solr/response/QueryResponseWriter.java
+++ b/solr/core/src/java/org/apache/solr/response/QueryResponseWriter.java
@@ -40,9 +40,9 @@ import org.apache.solr.util.plugin.NamedListInitializedPlugin;
* and is reused for all relevant queries.
*/
public interface QueryResponseWriter extends NamedListInitializedPlugin {
- public static String CONTENT_TYPE_XML_UTF8 = "application/xml;
charset=UTF-8";
- public static String CONTENT_TYPE_TEXT_UTF8 = "text/plain; charset=UTF-8";
- public static String CONTENT_TYPE_TEXT_ASCII = "text/plain;
charset=US-ASCII";
+ String CONTENT_TYPE_XML_UTF8 = "application/xml; charset=UTF-8";
+ String CONTENT_TYPE_TEXT_UTF8 = "text/plain; charset=UTF-8";
+ String CONTENT_TYPE_TEXT_ASCII = "text/plain; charset=US-ASCII";
/**
* Write a SolrQueryResponse, this method must be thread save.
@@ -53,7 +53,7 @@ public interface QueryResponseWriter extends
NamedListInitializedPlugin {
* <p>There are no mandatory actions that write must perform. An empty write
implementation would
* fulfill all interface obligations.
*/
- public void write(Writer writer, SolrQueryRequest request, SolrQueryResponse
response)
+ void write(Writer writer, SolrQueryRequest request, SolrQueryResponse
response)
throws IOException;
/**
@@ -64,5 +64,5 @@ public interface QueryResponseWriter extends
NamedListInitializedPlugin {
*
* @return a Content-Type string, which may not be null.
*/
- public String getContentType(SolrQueryRequest request, SolrQueryResponse
response);
+ String getContentType(SolrQueryRequest request, SolrQueryResponse response);
}
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index 692dde2f8d6..1e18cbd0c78 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -876,8 +876,7 @@ public class HttpSolrCall {
solrResp.getToLogAsString("[admin]"));
}
}
- QueryResponseWriter respWriter =
- ResponseWriters.get(solrReq.getParams().get(CommonParams.WT));
+ QueryResponseWriter respWriter =
ResponseWriters.get(solrReq.getParams().get(CommonParams.WT));
if (respWriter == null) respWriter = getResponseWriter();
writeResponse(solrResp, respWriter, Method.getMethod(req.getMethod()));
if (shouldAudit()) {
diff --git a/solr/core/src/test/org/apache/solr/core/PluginBagTest.java
b/solr/core/src/test/org/apache/solr/core/PluginBagTest.java
index c0a011bc67d..42f22ae240c 100644
--- a/solr/core/src/test/org/apache/solr/core/PluginBagTest.java
+++ b/solr/core/src/test/org/apache/solr/core/PluginBagTest.java
@@ -21,10 +21,8 @@ import static org.mockito.Mockito.mock;
import org.apache.solr.SolrTestCaseJ4;
import org.apache.solr.handler.admin.ConfigSetsHandler;
-import org.apache.solr.handler.component.SearchComponent;
import org.apache.solr.handler.configsets.ListConfigSetsAPI;
import org.apache.solr.jersey.JerseyApplications;
-import org.apache.solr.request.SolrRequestHandler;
import org.glassfish.jersey.server.ResourceConfig;
import org.junit.Before;
import org.junit.BeforeClass;
@@ -49,14 +47,12 @@ public class PluginBagTest extends SolrTestCaseJ4 {
@Test
public void testOnlyInitsJerseyIfHoldingRequestHandlers() {
- final RequestHandlerBag nonRequestHandlerBag =
- new RequestHandlerBag(null);
+ final RequestHandlerBag nonRequestHandlerBag = new RequestHandlerBag(null);
assertNull(
"Jersey app should not be created for plugin bags that aren't managing
RequestHandler's",
nonRequestHandlerBag.getJerseyEndpoints());
- final RequestHandlerBag handlerPluginBag =
- new RequestHandlerBag(null);
+ final RequestHandlerBag handlerPluginBag = new RequestHandlerBag(null);
assertNotNull(
"Jersey app should be created for plugin bags that manage
RequestHandlers",
handlerPluginBag.getJerseyEndpoints());
@@ -64,16 +60,14 @@ public class PluginBagTest extends SolrTestCaseJ4 {
@Test
public void testCreatesCoreSpecificJerseyAppIfCoreProvided() {
- final RequestHandlerBag handlerPluginBag =
- new RequestHandlerBag(solrCore);
+ final RequestHandlerBag handlerPluginBag = new RequestHandlerBag(solrCore);
assertEquals(
JerseyApplications.SolrCoreApp.class,
handlerPluginBag.getJerseyEndpoints().getClass());
}
@Test
public void testCreatesContainerSpecificJerseyAppIfNoCoreProvided() {
- final RequestHandlerBag handlerPluginBag =
- new RequestHandlerBag(null);
+ final RequestHandlerBag handlerPluginBag = new RequestHandlerBag(null);
assertEquals(
JerseyApplications.CoreContainerApp.class,
handlerPluginBag.getJerseyEndpoints().getClass());
@@ -81,8 +75,7 @@ public class PluginBagTest extends SolrTestCaseJ4 {
@Test
public void testRegistersJerseyResourcesAssociatedWithRequestHandlers() {
- final RequestHandlerBag handlerPluginBag =
- new RequestHandlerBag(null);
+ final RequestHandlerBag handlerPluginBag = new RequestHandlerBag(null);
assertFalse(handlerPluginBag.getJerseyEndpoints().isRegistered(ListConfigSetsAPI.class));
handlerPluginBag.put("/foo", new ConfigSetsHandler(coreContainer));
diff --git
a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
index 999e9142f73..87650273921 100644
--- a/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
+++ b/solr/core/src/test/org/apache/solr/handler/admin/TestApiFramework.java
@@ -56,7 +56,7 @@ import org.apache.solr.common.util.StrUtils;
import org.apache.solr.common.util.Utils;
import org.apache.solr.common.util.ValidatingJsonMap;
import org.apache.solr.core.CoreContainer;
-import org.apache.solr.core.PluginBag;
+import org.apache.solr.core.RequestHandlerBag;
import org.apache.solr.handler.CollectionsAPI;
import org.apache.solr.handler.PingRequestHandler;
import org.apache.solr.handler.SchemaHandler;
@@ -64,7 +64,6 @@ import org.apache.solr.handler.SolrConfigHandler;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrQueryRequestBase;
-import org.apache.solr.request.SolrRequestHandler;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.security.PermissionNameProvider;
@@ -74,8 +73,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
Map<String, Object[]> calls = new HashMap<>();
Map<String, Object> out = new HashMap<>();
CoreContainer mockCC = TestCoreAdminApis.getCoreContainerMock(calls, out);
- PluginBag<SolrRequestHandler> containerHandlers =
- new PluginBag<>(SolrRequestHandler.class, null, false);
+ RequestHandlerBag containerHandlers = new RequestHandlerBag(null);
TestCollectionAPIs.MockCollectionsHandler collectionsHandler =
new TestCollectionAPIs.MockCollectionsHandler();
containerHandlers.put(COLLECTIONS_HANDLER_PATH, collectionsHandler);
@@ -87,8 +85,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
containerHandlers.put(CONFIGSETS_HANDLER_PATH, new
ConfigSetsHandler(mockCC));
out.put("getRequestHandlers", containerHandlers);
- PluginBag<SolrRequestHandler> coreHandlers =
- new PluginBag<>(SolrRequestHandler.class, null, false);
+ RequestHandlerBag coreHandlers = new RequestHandlerBag(null);
coreHandlers.put("/schema", new SchemaHandler());
coreHandlers.put("/config", new SolrConfigHandler());
coreHandlers.put("/admin/ping", new PingRequestHandler());
@@ -338,10 +335,7 @@ public class TestApiFramework extends SolrTestCaseJ4 {
}
private SolrQueryResponse invoke(
- PluginBag<SolrRequestHandler> reqHandlers,
- String path,
- String fullPath,
- CoreContainer mockCC) {
+ RequestHandlerBag reqHandlers, String path, String fullPath,
CoreContainer mockCC) {
HashMap<String, String> parts = new HashMap<>();
boolean containerHandlerLookup = mockCC.getRequestHandlers() ==
reqHandlers;
path = path == null ? fullPath : path;