You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by no...@apache.org on 2015/09/29 16:43:04 UTC

svn commit: r1705870 - in /lucene/dev/branches/branch_5x: ./ solr/ solr/core/ solr/core/src/java/org/apache/solr/core/ solr/core/src/java/org/apache/solr/handler/admin/ solr/core/src/java/org/apache/solr/handler/component/ solr/core/src/java/org/apache...

Author: noble
Date: Tue Sep 29 14:43:03 2015
New Revision: 1705870

URL: http://svn.apache.org/viewvc?rev=1705870&view=rev
Log:
SOLR-8104: Config API does not work for spellchecker

Added:
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
      - copied, changed from r1705662, lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java
Removed:
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/servlet/ZookeeperInfoServlet.java
Modified:
    lucene/dev/branches/branch_5x/   (props changed)
    lucene/dev/branches/branch_5x/solr/   (props changed)
    lucene/dev/branches/branch_5x/solr/CHANGES.txt   (contents, props changed)
    lucene/dev/branches/branch_5x/solr/core/   (props changed)
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
    lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java
    lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
    lucene/dev/branches/branch_5x/solr/solrj/   (props changed)
    lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
    lucene/dev/branches/branch_5x/solr/webapp/   (props changed)
    lucene/dev/branches/branch_5x/solr/webapp/web/WEB-INF/web.xml
    lucene/dev/branches/branch_5x/solr/webapp/web/js/angular/services.js
    lucene/dev/branches/branch_5x/solr/webapp/web/js/scripts/cloud.js

Modified: lucene/dev/branches/branch_5x/solr/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/CHANGES.txt?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/CHANGES.txt (original)
+++ lucene/dev/branches/branch_5x/solr/CHANGES.txt Tue Sep 29 14:43:03 2015
@@ -118,6 +118,9 @@ Bug Fixes
   
 * SOLR-8077: Replication can still cause index corruption. (Mark Miller)
 
+* SOLR-8104: Config API does not work for spellchecker (noble)
+
+
 Optimizations
 ----------------------
 
@@ -188,6 +191,8 @@ Other Changes
 * SOLR-8068: Throw a SolrException if the core container has initialization errors or is
   shutting down (Ishan Chattopadhyaya, Noble Paul, Anshum Gupta)
 
+* SOLR-8083: Convert the ZookeeperInfoServlet to a handler at /admin/zookeeper (noble)
+
 ==================  5.3.1 ==================
 
 Bug Fixes

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/core/CoreContainer.java Tue Sep 29 14:43:03 2015
@@ -49,6 +49,7 @@ import org.apache.solr.handler.admin.Con
 import org.apache.solr.handler.admin.CoreAdminHandler;
 import org.apache.solr.handler.admin.InfoHandler;
 import org.apache.solr.handler.admin.SecurityConfHandler;
+import org.apache.solr.handler.admin.ZookeeperInfoHandler;
 import org.apache.solr.handler.component.HttpShardHandlerFactory;
 import org.apache.solr.handler.component.ShardHandlerFactory;
 import org.apache.solr.logging.LogWatcher;
@@ -398,6 +399,7 @@ public class CoreContainer {
     initializeAuthorizationPlugin((Map<String, Object>) securityConfig.data.get("authorization"));
     initializeAuthenticationPlugin((Map<String, Object>) securityConfig.data.get("authentication"));
 
+    containerHandlers.put(ZK_PATH, new ZookeeperInfoHandler(this));
     securityConfHandler = new SecurityConfHandler(this);
     collectionsHandler = createHandler(cfg.getCollectionsHandlerClass(), CollectionsHandler.class);
     containerHandlers.put(COLLECTIONS_HANDLER_PATH, collectionsHandler);

Copied: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java (from r1705662, lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java)
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java?p2=lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java&p1=lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java&r1=1705662&r2=1705870&rev=1705870&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/admin/ZookeeperInfoHandler.java Tue Sep 29 14:43:03 2015
@@ -46,13 +46,11 @@ import org.apache.solr.common.cloud.OnRe
 import org.apache.solr.common.cloud.Replica;
 import org.apache.solr.common.cloud.SolrZkClient;
 import org.apache.solr.common.cloud.ZkStateReader;
-import org.apache.solr.common.params.CommonParams;
 import org.apache.solr.common.params.MapSolrParams;
 import org.apache.solr.common.params.SolrParams;
 import org.apache.solr.common.util.ContentStream;
 import org.apache.solr.common.util.Utils;
 import org.apache.solr.core.CoreContainer;
-import org.apache.solr.handler.ReplicationHandler;
 import org.apache.solr.handler.RequestHandlerBase;
 import org.apache.solr.request.SolrQueryRequest;
 import org.apache.solr.response.JSONResponseWriter;

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/handler/component/SpellCheckComponent.java Tue Sep 29 14:43:03 2015
@@ -79,7 +79,7 @@ import org.slf4j.LoggerFactory;
  * <p>
  * Refer to http://wiki.apache.org/solr/SpellCheckComponent for more details
  * </p>
- * 
+ *
  * @since solr 1.3
  */
 public class SpellCheckComponent extends SearchComponent implements SolrCoreAware, SpellingParams {
@@ -95,7 +95,7 @@ public class SpellCheckComponent extends
 
   @SuppressWarnings("unchecked")
   protected NamedList initParams;
-  
+
 
   /**
    * Key is the dictionary, value is the SpellChecker for that dictionary name
@@ -140,7 +140,7 @@ public class SpellCheckComponent extends
     String q = params.get(SPELLCHECK_Q);
     SolrSpellChecker spellChecker = getSpellChecker(params);
     Collection<Token> tokens = null;
-    
+
     if (q != null) {
       //we have a spell check param, tokenize it with the query analyzer applicable for this spellchecker
       tokens = getTokens(q, spellChecker.getQueryAnalyzer());
@@ -155,16 +155,16 @@ public class SpellCheckComponent extends
       if (spellChecker != null) {
         int count = params.getInt(SPELLCHECK_COUNT, 1);
         boolean onlyMorePopular = params.getBool(SPELLCHECK_ONLY_MORE_POPULAR, DEFAULT_ONLY_MORE_POPULAR);
-        boolean extendedResults = params.getBool(SPELLCHECK_EXTENDED_RESULTS, false); 
+        boolean extendedResults = params.getBool(SPELLCHECK_EXTENDED_RESULTS, false);
         boolean collate = params.getBool(SPELLCHECK_COLLATE, false);
         float accuracy = params.getFloat(SPELLCHECK_ACCURACY, Float.MIN_VALUE);
-        int alternativeTermCount = params.getInt(SpellingParams.SPELLCHECK_ALTERNATIVE_TERM_COUNT, 0); 
+        int alternativeTermCount = params.getInt(SpellingParams.SPELLCHECK_ALTERNATIVE_TERM_COUNT, 0);
         Integer maxResultsForSuggest = params.getInt(SpellingParams.SPELLCHECK_MAX_RESULTS_FOR_SUGGEST);
         ModifiableSolrParams customParams = new ModifiableSolrParams();
         for (String checkerName : getDictionaryNames(params)) {
           customParams.add(getCustomParams(checkerName, params));
         }
-        
+
         Integer hitsInteger = (Integer) rb.rsp.getToLog().get("hits");
         long hits = 0;
         if (hitsInteger == null) {
@@ -180,7 +180,7 @@ public class SpellCheckComponent extends
           } else if (alternativeTermCount > 0) {
             suggestMode = SuggestMode.SUGGEST_ALWAYS;
           }
-          
+
           IndexReader reader = rb.req.getSearcher().getIndexReader();
           SpellingOptions options = new SpellingOptions(tokens, reader, count,
               alternativeTermCount, suggestMode, extendedResults, accuracy,
@@ -190,21 +190,21 @@ public class SpellCheckComponent extends
           spellingResult = new SpellingResult();
         }
         boolean isCorrectlySpelled = hits > (maxResultsForSuggest==null ? 0 : maxResultsForSuggest);
-        
-        NamedList response = new SimpleOrderedMap();        
+
+        NamedList response = new SimpleOrderedMap();
         NamedList suggestions = toNamedList(shardRequest, spellingResult, q, extendedResults);
         response.add("suggestions", suggestions);
-        
+
         if (extendedResults) {
           response.add("correctlySpelled", isCorrectlySpelled);
-        }        
+        }
         if (collate) {
           addCollationsToResponse(params, spellingResult, rb, q, response, spellChecker.isSuggestionsMayOverlap());
         }
         if (shardRequest) {
           addOriginalTermsToResponse(response, tokens);
         }
-        
+
         rb.rsp.add("spellcheck", response);
 
       } else {
@@ -213,7 +213,7 @@ public class SpellCheckComponent extends
       }
     }
   }
-  
+
   @SuppressWarnings("unchecked")
   protected void addCollationsToResponse(SolrParams params, SpellingResult spellingResult, ResponseBuilder rb, String q,
       NamedList response, boolean suggestionsMayOverlap) {
@@ -261,7 +261,7 @@ public class SpellCheckComponent extends
     }
     response.add("collations", collationList);
   }
-  
+
   private void addOriginalTermsToResponse(NamedList response, Collection<Token> originalTerms) {
     List<String> originalTermStr = new ArrayList<String>();
     for(Token t : originalTerms) {
@@ -294,7 +294,7 @@ public class SpellCheckComponent extends
   public void modifyRequest(ResponseBuilder rb, SearchComponent who, ShardRequest sreq) {
     SolrParams params = rb.req.getParams();
     if (!params.getBool(COMPONENT_NAME, false)) return;
-    int purpose = rb.grouping() ? ShardRequest.PURPOSE_GET_TOP_GROUPS : ShardRequest.PURPOSE_GET_TOP_IDS;   
+    int purpose = rb.grouping() ? ShardRequest.PURPOSE_GET_TOP_GROUPS : ShardRequest.PURPOSE_GET_TOP_IDS;
     if ((sreq.purpose & purpose) != 0) {
       // fetch at least 5 suggestions from each shard
       int count = sreq.params.getInt(SPELLCHECK_COUNT, 1);
@@ -318,7 +318,7 @@ public class SpellCheckComponent extends
     boolean collationExtendedResults = params.getBool(SPELLCHECK_COLLATE_EXTENDED_RESULTS, false);
     int maxCollationTries = params.getInt(SPELLCHECK_MAX_COLLATION_TRIES, 0);
     int maxCollations = params.getInt(SPELLCHECK_MAX_COLLATIONS, 1);
-    Integer maxResultsForSuggest = params.getInt(SpellingParams.SPELLCHECK_MAX_RESULTS_FOR_SUGGEST); 
+    Integer maxResultsForSuggest = params.getInt(SpellingParams.SPELLCHECK_MAX_RESULTS_FOR_SUGGEST);
     int count = rb.req.getParams().getInt(SPELLCHECK_COUNT, 1);
     int numSug = Math.max(count, AbstractLuceneSpellChecker.DEFAULT_SUGGESTION_COUNT);
 
@@ -329,11 +329,11 @@ public class SpellCheckComponent extends
         origQuery = params.get(CommonParams.Q);
       }
     }
-    
+
     long hits = rb.grouping() ? rb.totalHitCount : rb.getNumberDocumentsFound();
     boolean isCorrectlySpelled = hits > (maxResultsForSuggest==null ? 0 : maxResultsForSuggest);
-    
-    SpellCheckMergeData mergeData = new SpellCheckMergeData();  
+
+    SpellCheckMergeData mergeData = new SpellCheckMergeData();
     if (maxResultsForSuggest==null || !isCorrectlySpelled) {
       for (ShardRequest sreq : rb.finished) {
         for (ShardResponse srsp : sreq.responses) {
@@ -359,23 +359,23 @@ public class SpellCheckComponent extends
 
     // all shard responses have been collected
     // create token and get top suggestions
-    SolrSpellChecker checker = getSpellChecker(rb.req.getParams());    
+    SolrSpellChecker checker = getSpellChecker(rb.req.getParams());
     SpellingResult result = checker.mergeSuggestions(mergeData, numSug, count, extendedResults);
-    
+
     NamedList response = new SimpleOrderedMap();
-    
+
     NamedList suggestions = toNamedList(false, result, origQuery, extendedResults);
     response.add("suggestions", suggestions);
 
     if (extendedResults) {
-      response.add("correctlySpelled", isCorrectlySpelled);     
+      response.add("correctlySpelled", isCorrectlySpelled);
     }
-    
+
     if (collate) {
       SpellCheckCollation[] sortedCollations = mergeData.collations.values()
           .toArray(new SpellCheckCollation[mergeData.collations.size()]);
       Arrays.sort(sortedCollations);
-      
+
       NamedList collations = new NamedList();
       int i = 0;
       while (i < maxCollations && i < sortedCollations.length) {
@@ -392,16 +392,16 @@ public class SpellCheckComponent extends
           collations.add("collation", collation.getCollationQuery());
         }
       }
-      
+
       response.add("collations", collations);
     }
-    
+
     rb.rsp.add("spellcheck", response);
   }
-    
+
   @SuppressWarnings("unchecked")
   private void collectShardSuggestions(NamedList nl, SpellCheckMergeData mergeData) {
-    SpellCheckResponse spellCheckResp = new SpellCheckResponse(nl);    
+    SpellCheckResponse spellCheckResp = new SpellCheckResponse(nl);
     Iterable<Object> originalTermStrings = (Iterable<Object>) nl.get("originalTerms");
     if(originalTermStrings!=null) {
       mergeData.originalTerms = new HashSet<>();
@@ -423,14 +423,14 @@ public class SpellCheckComponent extends
       if (o != null)  origFreq += o;
       origFreq += suggestion.getOriginalFrequency();
       mergeData.origVsFreq.put(suggestion.getToken(), origFreq);
-      
+
       //# shards reporting
       Integer origShards = mergeData.origVsShards.get(suggestion.getToken());
       if(origShards==null) {
         mergeData.origVsShards.put(suggestion.getToken(), 1);
       } else {
         mergeData.origVsShards.put(suggestion.getToken(), ++origShards);
-      }            
+      }
 
       // find best suggestions
       for (int i = 0; i < suggestion.getNumFound(); i++) {
@@ -451,7 +451,7 @@ public class SpellCheckComponent extends
       }
     }
   }
-  
+
   @SuppressWarnings("unchecked")
   private void collectShardCollations(SpellCheckMergeData mergeData, NamedList spellCheckResponse, int maxCollationTries) {
     Map<String, SpellCheckCollation> collations = mergeData.collations;
@@ -480,7 +480,7 @@ public class SpellCheckComponent extends
             collations.put(coll.getCollationQuery(), coll);
           } else
           {
-            NamedList expandedCollation = (NamedList) o;                  
+            NamedList expandedCollation = (NamedList) o;
             SpellCheckCollation coll = new SpellCheckCollation();
             coll.setCollationQuery((String) expandedCollation.get("collationQuery"));
             coll.setHits((Integer) expandedCollation.get("hits"));
@@ -514,7 +514,7 @@ public class SpellCheckComponent extends
       FlagsAttribute flagsAtt = ts.addAttribute(FlagsAttribute.class);
       PayloadAttribute payloadAtt = ts.addAttribute(PayloadAttribute.class);
       PositionIncrementAttribute posIncAtt = ts.addAttribute(PositionIncrementAttribute.class);
-      
+
       while (ts.incrementToken()){
         Token token = new Token();
         token.copyBuffer(termAtt.buffer(), 0, termAtt.length());
@@ -547,7 +547,7 @@ public class SpellCheckComponent extends
       return ssc;
     }
   }
-  
+
   private String getDictionaryNameAsSingleString(String[] dictName) {
     StringBuilder sb = new StringBuilder();
     for (String dn : dictName) {
@@ -604,7 +604,7 @@ public class SpellCheckComponent extends
         suggestionList.add("numFound", theSuggestions.size());
         suggestionList.add("startOffset", inputToken.startOffset());
         suggestionList.add("endOffset", inputToken.endOffset());
-        
+
         // Logical structure of normal (non-extended) results:
         // "suggestion":["alt1","alt2"]
         //
@@ -616,7 +616,7 @@ public class SpellCheckComponent extends
         if (extendedResults && hasFreqInfo) {
           suggestionList.add("origFreq", spellingResult
               .getTokenFrequency(inputToken));
-          
+
           ArrayList<SimpleOrderedMap> sugs = new ArrayList<>();
           suggestionList.add("suggestion", sugs);
           for (Map.Entry<String,Integer> suggEntry : theSuggestions.entrySet()) {
@@ -628,7 +628,7 @@ public class SpellCheckComponent extends
         } else {
           suggestionList.add("suggestion", theSuggestions.keySet());
         }
-        
+
         if (hasFreqInfo) {
           Integer tokenFrequency = spellingResult.getTokenFrequency(inputToken);
           if (tokenFrequency==null || tokenFrequency == 0) {
@@ -648,45 +648,20 @@ public class SpellCheckComponent extends
       boolean hasDefault = false;
       for (int i = 0; i < initParams.size(); i++) {
         if (initParams.getName(i).equals("spellchecker")) {
-          NamedList spellchecker = (NamedList) initParams.getVal(i);
-          String className = (String) spellchecker.get("classname");
-          // TODO: this is a little bit sneaky: warn if class isnt supplied
-          // so that it's mandatory in a future release?
-          if (className == null)
-            className = IndexBasedSpellChecker.class.getName();
-          SolrResourceLoader loader = core.getResourceLoader();
-          SolrSpellChecker checker = loader.newInstance(className, SolrSpellChecker.class);
-          if (checker != null) {
-            String dictionary = checker.init(spellchecker, core);
-            if (dictionary != null) {
-              boolean isDefault = dictionary.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME);
-              if (isDefault == true && hasDefault == false){
-                hasDefault = true;
-              } else if (isDefault == true && hasDefault == true){
-                throw new RuntimeException("More than one dictionary is missing name.");
-              }
-              spellCheckers.put(dictionary, checker);
-            } else {
-              if (hasDefault == false){
-                spellCheckers.put(SolrSpellChecker.DEFAULT_DICTIONARY_NAME, checker);
-                hasDefault = true;
-              } else {
-                throw new RuntimeException("More than one dictionary is missing name.");
+          Object cfg = initParams.getVal(i);
+          if (cfg instanceof NamedList) {
+            addSpellChecker(core, hasDefault, (NamedList) cfg);
+          } else if (cfg instanceof Map) {
+            addSpellChecker(core, hasDefault, new NamedList((Map) cfg));
+          } else if (cfg instanceof List) {
+            for (Object o : (List) cfg) {
+              if (o instanceof Map) {
+                addSpellChecker(core, hasDefault, new NamedList((Map) o));
               }
             }
-            // Register event listeners for this SpellChecker
-            core.registerFirstSearcherListener(new SpellCheckerListener(core, checker, false, false));
-            boolean buildOnCommit = Boolean.parseBoolean((String) spellchecker.get("buildOnCommit"));
-            boolean buildOnOptimize = Boolean.parseBoolean((String) spellchecker.get("buildOnOptimize"));
-            if (buildOnCommit || buildOnOptimize)   {
-              LOG.info("Registering newSearcher listener for spellchecker: " + checker.getDictionaryName());
-              core.registerNewSearcherListener(new SpellCheckerListener(core, checker, buildOnCommit, buildOnOptimize));
-            }
-          } else {
-            throw new RuntimeException("Can't load spell checker: " + className);
           }
         }
-     }
+      }
 
       Map<String, QueryConverter> queryConverters = new HashMap<>();
       core.initPlugins(queryConverters,QueryConverter.class);
@@ -711,6 +686,47 @@ public class SpellCheckComponent extends
     }
   }
 
+  private boolean addSpellChecker(SolrCore core, boolean hasDefault, NamedList spellchecker) {
+    String className = (String) spellchecker.get("classname");
+    if (className == null) className = (String) spellchecker.get("class");
+    // TODO: this is a little bit sneaky: warn if class isnt supplied
+    // so that it's mandatory in a future release?
+    if (className == null)
+      className = IndexBasedSpellChecker.class.getName();
+    SolrResourceLoader loader = core.getResourceLoader();
+    SolrSpellChecker checker = loader.newInstance(className, SolrSpellChecker.class);
+    if (checker != null) {
+      String dictionary = checker.init(spellchecker, core);
+      if (dictionary != null) {
+        boolean isDefault = dictionary.equals(SolrSpellChecker.DEFAULT_DICTIONARY_NAME);
+        if (isDefault && !hasDefault) {
+          hasDefault = true;
+        } else if (isDefault && hasDefault) {
+          throw new RuntimeException("More than one dictionary is missing name.");
+        }
+        spellCheckers.put(dictionary, checker);
+      } else {
+        if (!hasDefault) {
+          spellCheckers.put(SolrSpellChecker.DEFAULT_DICTIONARY_NAME, checker);
+          hasDefault = true;
+        } else {
+          throw new RuntimeException("More than one dictionary is missing name.");
+        }
+      }
+      // Register event listeners for this SpellChecker
+      core.registerFirstSearcherListener(new SpellCheckerListener(core, checker, false, false));
+      boolean buildOnCommit = Boolean.parseBoolean((String) spellchecker.get("buildOnCommit"));
+      boolean buildOnOptimize = Boolean.parseBoolean((String) spellchecker.get("buildOnOptimize"));
+      if (buildOnCommit || buildOnOptimize) {
+        LOG.info("Registering newSearcher listener for spellchecker: " + checker.getDictionaryName());
+        core.registerNewSearcherListener(new SpellCheckerListener(core, checker, buildOnCommit, buildOnOptimize));
+      }
+    } else {
+      throw new RuntimeException("Can't load spell checker: " + className);
+    }
+    return hasDefault;
+  }
+
   private static class SpellCheckerListener implements SolrEventListener {
     private final SolrCore core;
     private final SolrSpellChecker checker;

Modified: lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/java/org/apache/solr/response/JSONResponseWriter.java Tue Sep 29 14:43:03 2015
@@ -42,7 +42,7 @@ import org.apache.solr.search.SolrReturn
  */
 
 public class JSONResponseWriter implements QueryResponseWriter {
-  static String CONTENT_TYPE_JSON_UTF8 = "application/json; charset=UTF-8";
+  public static String CONTENT_TYPE_JSON_UTF8 = "application/json; charset=UTF-8";
 
   private String contentType = CONTENT_TYPE_JSON_UTF8;
 

Modified: lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java (original)
+++ lucene/dev/branches/branch_5x/solr/core/src/test/org/apache/solr/core/TestSolrConfigHandler.java Tue Sep 29 14:43:03 2015
@@ -174,7 +174,7 @@ public class TestSolrConfigHandler exten
   }
 
 
-  public static void reqhandlertests(RestTestHarness writeHarness, String testServerBaseUrl, CloudSolrClient cloudSolrServer) throws Exception {
+  public static void reqhandlertests(RestTestHarness writeHarness, String testServerBaseUrl, CloudSolrClient cloudSolrClient) throws Exception {
     String payload = "{\n" +
         "'create-requesthandler' : { 'name' : '/x', 'class': 'org.apache.solr.handler.DumpRequestHandler' , 'startup' : 'lazy'}\n" +
         "}";
@@ -183,7 +183,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config/overlay?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("overlay", "requestHandler", "/x", "startup"),
         "lazy",
         10);
@@ -196,7 +196,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config/overlay?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("overlay", "requestHandler", "/x", "a"),
         "b",
         10);
@@ -204,7 +204,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/x?wt=json&getdefaults=true&json.nl=map",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("getdefaults", "def_a"),
         "def A val",
         10);
@@ -212,7 +212,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/x?wt=json&param=multival&json.nl=map",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("params", "multival"),
         Arrays.asList("a", "b", "c"),
         10);
@@ -226,7 +226,7 @@ public class TestSolrConfigHandler exten
     int maxTimeoutSeconds = 10;
     while (TimeUnit.SECONDS.convert(System.nanoTime() - startTime, TimeUnit.NANOSECONDS) < maxTimeoutSeconds) {
       String uri = "/config/overlay?wt=json";
-      Map m = testServerBaseUrl == null ? getRespMap(uri, writeHarness) : TestSolrConfigHandlerConcurrent.getAsMap(testServerBaseUrl + uri, cloudSolrServer);
+      Map m = testServerBaseUrl == null ? getRespMap(uri, writeHarness) : TestSolrConfigHandlerConcurrent.getAsMap(testServerBaseUrl + uri, cloudSolrClient);
       if (null == Utils.getObjectByPath(m, true, Arrays.asList("overlay", "requestHandler", "/x", "a"))) {
         success = true;
         break;
@@ -243,7 +243,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "queryConverter", "qc", "class"),
         "org.apache.solr.spelling.SpellingQueryConverter",
         10);
@@ -254,7 +254,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "queryConverter", "qc", "class"),
         "org.apache.solr.spelling.SuggestQueryConverter",
         10);
@@ -266,7 +266,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "queryConverter", "qc"),
         null,
         10);
@@ -278,7 +278,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "searchComponent", "tc", "class"),
         "org.apache.solr.handler.component.TermsComponent",
         10);
@@ -289,7 +289,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "searchComponent", "tc", "class"),
         "org.apache.solr.handler.component.TermVectorComponent",
         10);
@@ -301,7 +301,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "searchComponent", "tc"),
         null,
         10);
@@ -313,7 +313,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "valueSourceParser", "cu", "class"),
         "org.apache.solr.core.CountUsageValueSourceParser",
         10);
@@ -327,7 +327,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "valueSourceParser", "cu", "class"),
         "org.apache.solr.search.function.NvlValueSourceParser",
         10);
@@ -339,7 +339,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "valueSourceParser", "cu"),
         null,
         10);
@@ -353,7 +353,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "transformer", "mytrans", "class"),
         "org.apache.solr.response.transform.ValueAugmenterFactory",
         10);
@@ -365,7 +365,7 @@ public class TestSolrConfigHandler exten
     testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "transformer", "mytrans", "value"),
         "6",
         10);
@@ -378,7 +378,7 @@ public class TestSolrConfigHandler exten
     Map map = testForResponseElement(writeHarness,
         testServerBaseUrl,
         "/config?wt=json",
-        cloudSolrServer,
+        cloudSolrClient,
         Arrays.asList("config", "transformer", "mytrans"),
         null,
         10);
@@ -387,6 +387,28 @@ public class TestSolrConfigHandler exten
     assertNotNull("no object /config/initParams : "+ TestBlobHandler.getAsString(map) , l);
     assertEquals( 1, l.size());
     assertEquals( "val", ((Map)l.get(0)).get("key") );
+
+
+    payload = "{\n" +
+        "    'add-searchcomponent': {\n" +
+        "        'name': 'myspellcheck',\n" +
+        "        'class': 'solr.SpellCheckComponent',\n" +
+        "        'queryAnalyzerFieldType': 'text_general',\n" +
+        "        'spellchecker': {\n" +
+        "            'name': 'default',\n" +
+        "            'field': '_text_',\n" +
+        "            'class': 'solr.DirectSolrSpellChecker'\n" +
+        "        }\n" +
+        "    }\n" +
+        "}";
+    runConfigCommand(writeHarness, "/config?wt=json", payload);
+    map = testForResponseElement(writeHarness,
+        testServerBaseUrl,
+        "/config?wt=json",
+        cloudSolrClient,
+        Arrays.asList("config", "searchComponent","myspellcheck", "spellchecker", "class"),
+        "solr.DirectSolrSpellChecker",
+        10);
   }
 
   public static Map testForResponseElement(RestTestHarness harness,

Modified: lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java (original)
+++ lucene/dev/branches/branch_5x/solr/solrj/src/java/org/apache/solr/common/params/CommonParams.java Tue Sep 29 14:43:03 2015
@@ -169,6 +169,7 @@ public interface CommonParams {
   public static final String CONFIGSETS_HANDLER_PATH = "/admin/configs";
   public static final String AUTHZ_PATH = "/admin/authorization";
   public static final String AUTHC_PATH = "/admin/authentication";
+  public static final String ZK_PATH = "/admin/zookeeper";
 
   /** valid values for: <code>echoParams</code> */
   public enum EchoParamStyle {

Modified: lucene/dev/branches/branch_5x/solr/webapp/web/WEB-INF/web.xml
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/webapp/web/WEB-INF/web.xml?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/webapp/web/WEB-INF/web.xml (original)
+++ lucene/dev/branches/branch_5x/solr/webapp/web/WEB-INF/web.xml Tue Sep 29 14:43:03 2015
@@ -76,11 +76,6 @@
   </filter-mapping>
 
   <servlet>
-    <servlet-name>Zookeeper</servlet-name>
-    <servlet-class>org.apache.solr.servlet.ZookeeperInfoServlet</servlet-class>
-  </servlet>
-  
-  <servlet>
     <servlet-name>LoadAdminUI</servlet-name>
     <servlet-class>org.apache.solr.servlet.LoadAdminUiServlet</servlet-class>
   </servlet>
@@ -101,10 +96,10 @@
     <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
     <init-param>
       <param-name>destination</param-name>
-      <param-value>${context}/zookeeper</param-value>
+      <param-value>${context}/admin/zookeeper</param-value>
     </init-param>
   </servlet>
-  
+
   <servlet>
     <servlet-name>RedirectLogging</servlet-name>
     <servlet-class>org.apache.solr.servlet.RedirectServlet</servlet-class>
@@ -136,16 +131,14 @@
     <url-pattern>/zookeeper.jsp</url-pattern>
   </servlet-mapping>
   <servlet-mapping>
+    <servlet-name>RedirectOldZookeeper</servlet-name>
+    <url-pattern>/zookeeper</url-pattern>
+  </servlet-mapping>
+  <servlet-mapping>
     <servlet-name>RedirectLogging</servlet-name>
     <url-pattern>/logging</url-pattern>
   </servlet-mapping>
 
-  <!-- Servlet Mapping -->
-  <servlet-mapping>
-    <servlet-name>Zookeeper</servlet-name>
-    <url-pattern>/zookeeper</url-pattern>
-  </servlet-mapping>
-  
   <servlet-mapping>
     <servlet-name>LoadAdminUI</servlet-name>
     <url-pattern>/admin.html</url-pattern>

Modified: lucene/dev/branches/branch_5x/solr/webapp/web/js/angular/services.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/webapp/web/js/angular/services.js?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/webapp/web/js/angular/services.js (original)
+++ lucene/dev/branches/branch_5x/solr/webapp/web/js/angular/services.js Tue Sep 29 14:43:03 2015
@@ -60,7 +60,7 @@ solrAdminServices.factory('System',
   }])
 .factory('Zookeeper',
   ['$resource', function($resource) {
-    return $resource('/solr/zookeeper', {wt:'json', _:Date.now()}, {
+    return $resource('/solr/admin/zookeeper', {wt:'json', _:Date.now()}, {
       "simple": {},
       "dump": {params: {dump: "true"}},
       "liveNodes": {params: {path: '/live_nodes'}},

Modified: lucene/dev/branches/branch_5x/solr/webapp/web/js/scripts/cloud.js
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_5x/solr/webapp/web/js/scripts/cloud.js?rev=1705870&r1=1705869&r2=1705870&view=diff
==============================================================================
--- lucene/dev/branches/branch_5x/solr/webapp/web/js/scripts/cloud.js (original)
+++ lucene/dev/branches/branch_5x/solr/webapp/web/js/scripts/cloud.js Tue Sep 29 14:43:03 2015
@@ -91,7 +91,7 @@ var init_debug = function( cloud_element
         $.ajax
         (
           {
-            url : app.config.solr_path + '/zookeeper?wt=json&dump=true',
+            url : app.config.solr_path + '/admin/zookeeper?wt=json&dump=true',
             dataType : 'text',
             context : debug_element,
             beforeSend : function( xhr, settings )
@@ -455,7 +455,7 @@ var prepare_graph = function( graph_elem
   $.ajax
   (
     {
-      url : app.config.solr_path + '/zookeeper?wt=json&path=%2Flive_nodes',
+      url : app.config.solr_path + '/admin/zookeeper?wt=json&path=%2Flive_nodes',
       dataType : 'json',
       success : function( response, text_status, xhr )
       {
@@ -467,7 +467,7 @@ var prepare_graph = function( graph_elem
 
         var start = $( '#cloudGraphPagingStart' ).val();
         var rows = $( '#cloudGraphPagingRows' ).val();
-        var clusterStateUrl = app.config.solr_path + '/zookeeper?wt=json&detail=true&path=%2Fclusterstate.json&view=graph';
+        var clusterStateUrl = app.config.solr_path + '/admin/zookeeper?wt=json&detail=true&path=%2Fclusterstate.json&view=graph';
         if (start && rows)
           clusterStateUrl += ('&start='+start+'&rows='+rows);
         
@@ -591,7 +591,7 @@ var init_tree = function( tree_element )
   $.ajax
   (
     {
-      url : app.config.solr_path + '/zookeeper?wt=json',
+      url : app.config.solr_path + '/admin/zookeeper?wt=json',
       dataType : 'json',
       context : tree_element,
       beforeSend : function( xhr, settings )
@@ -859,7 +859,7 @@ sammy.get
         $.ajax
         (
           {
-            url : app.config.solr_path + '/zookeeper?wt=json',
+            url : app.config.solr_path + '/admin/zookeeper?wt=json',
             dataType : 'json',
             context : cloud_element,
             success : function( response, text_status, xhr )