You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by el...@apache.org on 2013/05/18 18:16:18 UTC

svn commit: r1484135 - in /lucene/dev/trunk/solr: CHANGES.txt solrj/src/java/org/apache/solr/common/util/NamedList.java solrj/src/test/org/apache/solr/common/util/NamedListTest.java

Author: elyograg
Date: Sat May 18 16:16:18 2013
New Revision: 1484135

URL: http://svn.apache.org/r1484135
Log:
SOLR-4048: add findRecursive method to NamedList

Modified:
    lucene/dev/trunk/solr/CHANGES.txt
    lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
    lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java

Modified: lucene/dev/trunk/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/CHANGES.txt?rev=1484135&r1=1484134&r2=1484135&view=diff
==============================================================================
--- lucene/dev/trunk/solr/CHANGES.txt (original)
+++ lucene/dev/trunk/solr/CHANGES.txt Sat May 18 16:16:18 2013
@@ -82,6 +82,8 @@ New Features
 
 * SOLR-4234: Add support for binary files in ZooKeeper. (Eric Pugh via Mark Miller)
 
+* SOLR-4048: Add findRecursive method to NamedList. (Shawn Heisey)
+
 Bug Fixes
 ----------------------
 

Modified: lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java?rev=1484135&r1=1484134&r2=1484135&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java (original)
+++ lucene/dev/trunk/solr/solrj/src/java/org/apache/solr/common/util/NamedList.java Sat May 18 16:16:18 2013
@@ -17,8 +17,11 @@
 
 package org.apache.solr.common.util;
 
-import java.util.*;
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 
 
 
@@ -252,6 +255,47 @@ public class NamedList<T> implements Clo
     return result;
   }
 
+  /**
+   * Recursively parses the NamedList structure to arrive at a
+   * specific element.  As you descend the NamedList tree, the
+   * last element can be any type, including NamedList, but
+   * the previous elements MUST be NamedList ojects themselves.
+   * This method is particularly useful for parsing the response
+   * from Solr's /admin/mbeans handler. 
+   * 
+   * Explicit casts are recommended.
+   * Usage examples:
+   *
+   * String coreName = (String) response.findRecursive(
+   * "solr-mbeans", "CORE", "core", "stats", "coreName");
+   * long numDoc = (long) response.findRecursive(
+   * "solr-mbeans", "CORE", "searcher", "stats", "numDocs");
+   *
+   * @param args One or more strings specifying the tree to navigate.
+   * @return the last entry in the tree, null if not found.
+   */
+  public T findRecursive(String... args) {
+    NamedList<T> list = null;
+    T value = null;
+    for (String key : args) {
+      /* First pass: this list.  Later passes: previous value. */
+      if (list == null) {
+        list = this;
+      }
+      else
+      {
+        if (NamedList.class.isInstance(value)) {
+          list = (NamedList<T>) value;
+        } else {
+          value = null;
+          break;
+        }
+      }
+      value = list.get(key);
+    }
+    return value;
+  }
+
   @Override
   public String toString() {
     StringBuilder sb = new StringBuilder();

Modified: lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java?rev=1484135&r1=1484134&r2=1484135&view=diff
==============================================================================
--- lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java (original)
+++ lucene/dev/trunk/solr/solrj/src/test/org/apache/solr/common/util/NamedListTest.java Sat May 18 16:16:18 2013
@@ -29,4 +29,65 @@ public class NamedListTest extends Lucen
     assertEquals("value1", value);
     assertEquals(1, nl.size());
   }
+  public void testRecursive() {
+    // key1
+    // key2
+    // - key2a
+    // - key2b
+    // --- key2b1
+    // --- key2b2
+    // - key2c
+    // key3
+    // - key3a
+    // --- key3a1
+    // --- key3a2
+    // --- key3a3
+    // - key3b
+    // - key3c
+    NamedList<Object> nl2b = new NamedList<Object>();
+    nl2b.add("key2b1", "value2b1");
+    nl2b.add("key2b2", "value2b2");
+    NamedList<Object> nl3a = new NamedList<Object>();
+    nl3a.add("key3a1", "value3a1");
+    nl3a.add("key3a2", "value3a2");
+    nl3a.add("key3a3", "value3a3");
+    NamedList<Object> nl2 = new NamedList<Object>();
+    nl2.add("key2a", "value2a");
+    nl2.add("key2b", nl2b);
+    int int1 = 5;
+    Integer int2 = 7;
+    int int3 = 48;
+    nl2.add("k2int1", int1);
+    nl2.add("k2int2", int2);
+    nl2.add("k2int3", int3);
+    NamedList<Object> nl3 = new NamedList<Object>();
+    nl3.add("key3a", nl3a);
+    nl3.add("key3b", "value3b");
+    nl3.add("key3c", "value3c");
+    NamedList<Object> nl = new NamedList<Object>();
+    nl.add("key1", "value1");
+    nl.add("key2", nl2);
+    nl.add("key3", nl3);
+
+    String test1 = (String) nl.findRecursive("key2", "key2b", "key2b2");
+    assertEquals(test1, "value2b2");
+    String test2 = (String) nl.findRecursive("key3", "key3a", "key3a3");
+    assertEquals(test2, "value3a3");
+    String test3 = (String) nl.findRecursive("key3", "key3c");
+    assertEquals(test3, "value3c");
+    String test4 = (String) nl.findRecursive("key3", "key3c", "invalid");
+    assertEquals(test4, null);
+    String test5 = (String) nl.findRecursive("key3", "invalid", "invalid");
+    assertEquals(test5, null);
+    String test6 = (String) nl.findRecursive("invalid", "key3c");
+    assertEquals(test6, null);
+    Object nltest = nl.findRecursive("key2", "key2b");
+    assertTrue(nltest instanceof NamedList);
+    Integer int1test = (Integer) nl.findRecursive("key2", "k2int1");
+    assertEquals(int1test, (Integer) 5);
+    int int2test = (int) nl.findRecursive("key2", "k2int2");
+    assertEquals(int2test, 7);
+    int int3test = (int) nl.findRecursive("key2", "k2int3");
+    assertEquals(int3test, 48);
+  }
 }