dsmiley commented on code in PR #962:
URL: https://github.com/apache/solr/pull/962#discussion_r937921926


##########
solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java:
##########
@@ -376,19 +375,19 @@ protected long getConfigVersion(SolrCore core) {
    *
    * @return The loaded {@link ElevationProvider}; not null.
    */
-  private ElevationProvider loadElevationProvider(SolrCore core) throws 
Exception {
-    XmlConfigFile cfg;
-    try {
-      cfg = new XmlConfigFile(core.getResourceLoader(), configFileName);
+  private ElevationProvider loadElevationProvider(SolrCore core) throws 
IOException, SAXException {
+    try (var inputStream = 
core.getResourceLoader().openResource(configFileName)) {
+      return Objects.requireNonNull(
+          loadElevationProvider(SafeXMLParsing.parseUntrustedXML(log, 
inputStream)));
     } catch (SolrResourceNotFoundException e) {
-      String msg = "Missing config file \"" + configFileName + "\"";
+      var msg = "Missing config file \"" + configFileName + "\"";
       if (Files.exists(Path.of(core.getDataDir(), configFileName))) {
         msg += ". Found it in the data dir but this is no longer supported 
since 9.0.";
       }
       throw new InitializationException(msg, 
InitializationExceptionCause.MISSING_CONFIG_FILE);
     } catch (Exception e) {
       // See if it's because the file is empty; wrap it if so.
-      boolean isEmpty = false;

Review Comment:
   In this instance, I gave no such advise to Haythem :-)
   I think these particular switches to var should not be done because you are 
not modifying these lines of code for other reasons.  It's a trivial change 
that shouldn't happen by itself; its noise in a PR and code history.



##########
solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java:
##########
@@ -376,19 +375,19 @@ protected long getConfigVersion(SolrCore core) {
    *
    * @return The loaded {@link ElevationProvider}; not null.
    */
-  private ElevationProvider loadElevationProvider(SolrCore core) throws 
Exception {
-    XmlConfigFile cfg;
-    try {
-      cfg = new XmlConfigFile(core.getResourceLoader(), configFileName);
+  private ElevationProvider loadElevationProvider(SolrCore core) throws 
IOException, SAXException {
+    try (var inputStream = 
core.getResourceLoader().openResource(configFileName)) {

Review Comment:
   I liked the flow previously better -- declare an object holding the parsed 
input.  And later, not in a try-finally, we call loadElevationProvider.  Not 
using XmlConfigFile would only mean saying `Document` instead.  A benefit to 
the previous flow is that the empty file checking would not happen if 
loadElevationProvider fails, since there's no point.



##########
solr/core/src/java/org/apache/solr/handler/component/QueryElevationComponent.java:
##########
@@ -413,35 +409,30 @@ private ElevationProvider loadElevationProvider(SolrCore 
core) throws Exception
    * @throws RuntimeException If the config does not provide an XML content of 
the expected format
    *     (either {@link RuntimeException} or {@link 
org.apache.solr.common.SolrException}).
    */
-  protected ElevationProvider loadElevationProvider(XmlConfigFile config) {
+  protected ElevationProvider loadElevationProvider(Document doc) {
     Map<ElevatingQuery, ElevationBuilder> elevationBuilderMap = new 
LinkedHashMap<>();
-    XPath xpath = XPathFactory.newInstance().newXPath();
-    NodeList nodes = (NodeList) config.evaluate("elevate/query", 
XPathConstants.NODESET);
-    for (int i = 0; i < nodes.getLength(); i++) {
-      Node node = nodes.item(i);
-      String queryString = DOMUtil.getAttr(node, "text", "missing query 
'text'");
-      String matchString = DOMUtil.getAttr(node, "match");
-      ElevatingQuery elevatingQuery =
-          new ElevatingQuery(queryString, isSubsetMatchPolicy(matchString));
-
-      NodeList children;
-      try {
-        children = (NodeList) xpath.evaluate("doc", node, 
XPathConstants.NODESET);
-      } catch (XPathExpressionException e) {
-        throw new SolrException(
-            SolrException.ErrorCode.SERVER_ERROR, "query requires '<doc .../>' 
child");
-      }
-
-      if (children.getLength() == 0) { // weird
+    if (!doc.getDocumentElement().getNodeName().equals("elevate")) {
+      throw new SolrException(
+          SolrException.ErrorCode.BAD_REQUEST, "Root element must be 
<elevate>");
+    }
+    NodeList queryNodes = 
doc.getDocumentElement().getElementsByTagName("query");
+    for (int i = 0; i < queryNodes.getLength(); i++) {
+      var queryNode = (Element) queryNodes.item(i);
+      var queryString = DOMUtil.getAttr(queryNode, "text", "missing query 
'text'");
+      var matchString = DOMUtil.getAttr(queryNode, "match");
+      var elevatingQuery = new ElevatingQuery(queryString, 
isSubsetMatchPolicy(matchString));
+
+      NodeList docNodes = queryNode.getElementsByTagName("doc");
+      if (docNodes.getLength() == 0) { // weird
         continue;
       }
-      ElevationBuilder elevationBuilder = new ElevationBuilder();
-      for (int j = 0; j < children.getLength(); j++) {
-        Node child = children.item(j);
-        String id = DOMUtil.getAttr(child, "id", "missing 'id'");
-        String e = DOMUtil.getAttr(child, EXCLUDE, null);
+      var elevationBuilder = new ElevationBuilder();

Review Comment:
   IMO this is a perfect example where "var" is good.  `ElevationBuilder 
elevationBuilder = new ...` is needless verbosity.  Basically, when the 
variable name already communicates the type.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to