[Solr]Implicit RequestHander はどのように定義されているか
リファレンスによると、Implicit RequestHander は solrconfig.xml に設定を書かなくても使用できるリクエストハンドラである、と書かれています。
これらの Implicit RequestHander がどこでどのように定義されているのかを調べてみました。
Solr のソースでそれらしいものを探してみると solr/core/src/resources/ImplicitPlugins.json というファイルが見つかりました。
{ "requestHandler": { "/update": { "useParams":"_UPDATE", "class": "solr.UpdateRequestHandler" }, "/update/json": { "useParams":"_UPDATE_JSON", "class": "solr.UpdateRequestHandler", "invariants": { "update.contentType": "application/json" } }, "/update/csv": { "useParams":"_UPDATE_CSV", "class": "solr.UpdateRequestHandler", "invariants": { "update.contentType": "application/csv" } }, "/update/json/docs": { "useParams":"_UPDATE_JSON_DOCS", "class": "solr.UpdateRequestHandler", "invariants": { "update.contentType": "application/json", "json.command": "false" } }, (略)
これを読み込んでいるのが
solr/core/src/java/org/apache/solr/core/SolrCore.java
です。該当箇所は以下の通り。読み込んだ定義情報は getImplicitHandlers() で取得できます。
private static final class ImplicitHolder { private ImplicitHolder() { } private static final ListINSTANCE; static { @SuppressWarnings("unchecked") Map implicitPluginsInfo = (Map ) Utils.fromJSONResource("ImplicitPlugins.json"); @SuppressWarnings("unchecked") Map > requestHandlers = (Map >) implicitPluginsInfo.get(SolrRequestHandler.TYPE); List implicits = new ArrayList<>(requestHandlers.size()); for (Map.Entry > entry : requestHandlers.entrySet()) { Map info = entry.getValue(); info.put(CommonParams.NAME, entry.getKey()); implicits.add(new PluginInfo(SolrRequestHandler.TYPE, info)); } INSTANCE = Collections.unmodifiableList(implicits); } } public List getImplicitHandlers() { return ImplicitHolder.INSTANCE; }
RequestHanders クラスの初期化処理の中で、solrconfig.xml で定義されて RequestHander と implicit として定義されている RequestHander (SolrCore.getImplicitHanders()で取得)の両方が読み込まれて初期化されています。
void initHandlersFromConfig(SolrConfig config) { Listimplicits = core.getImplicitHandlers(); // use link map so we iterate in the same order Map infoMap= new LinkedHashMap<>(); //deduping implicit and explicit requesthandlers for (PluginInfo info : implicits) infoMap.put(info.name,info); for (PluginInfo info : config.getPluginInfos(SolrRequestHandler.class.getName())) infoMap.put(info.name, info); ArrayList infos = new ArrayList<>(infoMap.values()); List modifiedInfos = new ArrayList<>(); for (PluginInfo info : infos) { modifiedInfos.add(applyInitParams(config, info)); } handlers.init(Collections.emptyMap(),core, modifiedInfos); handlers.alias(handlers.getDefault(), ""); if (log.isDebugEnabled()) { log.debug("Registered paths: {}", StrUtils.join(new ArrayList<>(handlers.keySet()), ',')); } if (handlers.get("") == null && !handlers.alias("/select", "")) { if (handlers.get("") == null && !handlers.alias("standard", "")) { log.warn("no default request handler is registered (either '/select' or 'standard')"); } } }
この時点で Implicit RequestHandler は solrconfig.xml で定義されているものと同等の扱いになっている訳です。