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/02/11 11:40:03 UTC

svn commit: r1658916 - in /lucene/dev/trunk/solr/core/src/java/org/apache/solr: cloud/ZkController.java handler/SolrConfigHandler.java util/CommandOperation.java

Author: noble
Date: Wed Feb 11 10:40:03 2015
New Revision: 1658916

URL: http://svn.apache.org/r1658916
Log:
SOLR-6533: logging added and formatting fixed

Modified:
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
    lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/CommandOperation.java

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java?rev=1658916&r1=1658915&r2=1658916&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/cloud/ZkController.java Wed Feb 11 10:40:03 2015
@@ -2138,37 +2138,38 @@ public final class ZkController {
    *
    * @return true on success
    */
-  public static boolean persistConfigResourceToZooKeeper( ZkSolrResourceLoader zkLoader, int znodeVersion ,
-                                                          String resourceName, byte[] content,
-                                                          boolean createIfNotExists) {
+  public static boolean persistConfigResourceToZooKeeper(ZkSolrResourceLoader zkLoader, int znodeVersion,
+                                                         String resourceName, byte[] content,
+                                                         boolean createIfNotExists) {
     final ZkController zkController = zkLoader.getZkController();
     final SolrZkClient zkClient = zkController.getZkClient();
     final String resourceLocation = zkLoader.getConfigSetZkPath() + "/" + resourceName;
     String errMsg = "Failed to persist resource at {0} - old {1}";
     try {
       try {
-        zkClient.setData(resourceLocation , content,znodeVersion, true);
+        zkClient.setData(resourceLocation, content, znodeVersion, true);
+        log.info("Persisted config data to node {} ", resourceLocation);
         touchConfDir(zkLoader);
       } catch (NoNodeException e) {
-        if(createIfNotExists){
+        if (createIfNotExists) {
           try {
-            zkClient.create(resourceLocation,content, CreateMode.PERSISTENT,true);
+            zkClient.create(resourceLocation, content, CreateMode.PERSISTENT, true);
             touchConfDir(zkLoader);
           } catch (KeeperException.NodeExistsException nee) {
             try {
               Stat stat = zkClient.exists(resourceLocation, null, true);
-              log.info("failed to set data version in zk is {0} and expected version is {1} ", stat.getVersion(),znodeVersion);
+              log.info("failed to set data version in zk is {0} and expected version is {1} ", stat.getVersion(), znodeVersion);
             } catch (Exception e1) {
               log.warn("could not get stat");
             }
 
-            log.info(MessageFormat.format(errMsg,resourceLocation,znodeVersion));
-            throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, MessageFormat.format(errMsg,resourceLocation,znodeVersion) + ", retry.");
+            log.info(MessageFormat.format(errMsg, resourceLocation, znodeVersion));
+            throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, MessageFormat.format(errMsg, resourceLocation, znodeVersion) + ", retry.");
           }
         }
       }
 
-    } catch (KeeperException.BadVersionException bve){
+    } catch (KeeperException.BadVersionException bve) {
       int v = -1;
       try {
         Stat stat = zkClient.exists(resourceLocation, null, true);
@@ -2177,9 +2178,9 @@ public final class ZkController {
         log.error(e.getMessage());
 
       }
-      log.info(MessageFormat.format(errMsg+ " zkVersion= "+v,resourceLocation,znodeVersion));
-      throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, MessageFormat.format(errMsg,resourceLocation,znodeVersion) + ", retry.");
-    }catch (ResourceModifiedInZkException e){
+      log.info(MessageFormat.format(errMsg + " zkVersion= " + v, resourceLocation, znodeVersion));
+      throw new ResourceModifiedInZkException(ErrorCode.CONFLICT, MessageFormat.format(errMsg, resourceLocation, znodeVersion) + ", retry.");
+    } catch (ResourceModifiedInZkException e) {
       throw e;
     } catch (Exception e) {
       if (e instanceof InterruptedException) {
@@ -2192,10 +2193,10 @@ public final class ZkController {
     return true;
   }
 
-  public static void touchConfDir(ZkSolrResourceLoader zkLoader)  {
+  public static void touchConfDir(ZkSolrResourceLoader zkLoader) {
     SolrZkClient zkClient = zkLoader.getZkController().getZkClient();
     try {
-      zkClient.setData(zkLoader.getConfigSetZkPath(),new byte[]{0},true);
+      zkClient.setData(zkLoader.getConfigSetZkPath(), new byte[]{0}, true);
     } catch (Exception e) {
       if (e instanceof InterruptedException) {
         Thread.currentThread().interrupt(); // Restore the interrupted status

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java?rev=1658916&r1=1658915&r2=1658916&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/handler/SolrConfigHandler.java Wed Feb 11 10:40:03 2015
@@ -90,16 +90,17 @@ public class SolrConfigHandler extends R
     setWt(req, "json");
     String httpMethod = (String) req.getContext().get("httpMethod");
     Command command = new Command(req, rsp, httpMethod);
-    if("POST".equals(httpMethod)){
-      if(configEditing_disabled) throw new SolrException(SolrException.ErrorCode.FORBIDDEN," solrconfig editing is not enabled");
+    if ("POST".equals(httpMethod)) {
+      if (configEditing_disabled)
+        throw new SolrException(SolrException.ErrorCode.FORBIDDEN, " solrconfig editing is not enabled");
       command.handlePOST();
-    }  else {
+    } else {
       command.handleGET();
     }
   }
 
 
-  private static class Command{
+  private static class Command {
     private final SolrQueryRequest req;
     private final SolrQueryResponse resp;
     private final String method;
@@ -111,9 +112,9 @@ public class SolrConfigHandler extends R
       this.resp = resp;
       this.method = httpMethod;
       path = (String) req.getContext().get("path");
-      if(path == null) path= getDefaultPath();
-      parts =StrUtils.splitSmart(path, '/');
-      if(parts.get(0).isEmpty()) parts.remove(0);
+      if (path == null) path = getDefaultPath();
+      parts = StrUtils.splitSmart(path, '/');
+      if (parts.get(0).isEmpty()) parts.remove(0);
     }
 
     private String getDefaultPath() {
@@ -121,28 +122,28 @@ public class SolrConfigHandler extends R
     }
 
     private void handleGET() {
-      if(parts.size() == 1) {
+      if (parts.size() == 1) {
         resp.add("config", getConfigDetails());
       } else {
-        if(ConfigOverlay.NAME.equals(parts.get(1))){
+        if (ConfigOverlay.NAME.equals(parts.get(1))) {
           resp.add(ConfigOverlay.NAME, req.getCore().getSolrConfig().getOverlay().toMap());
-        }else if(RequestParams.NAME.equals(parts.get(1))) {
-          if(parts.size() == 3){
+        } else if (RequestParams.NAME.equals(parts.get(1))) {
+          if (parts.size() == 3) {
             RequestParams params = req.getCore().getSolrConfig().getRequestParams();
             MapSolrParams p = params.getParams(parts.get(2));
-            Map m =new LinkedHashMap<>();
+            Map m = new LinkedHashMap<>();
             m.put(ConfigOverlay.ZNODEVER, params.getZnodeVersion());
-            if(p!=null){
-              m.put(RequestParams.NAME,ZkNodeProps.makeMap(parts.get(2), p.getMap()));
+            if (p != null) {
+              m.put(RequestParams.NAME, ZkNodeProps.makeMap(parts.get(2), p.getMap()));
             }
             resp.add(SolrQueryResponse.NAME, m);
           } else {
-            resp.add(SolrQueryResponse.NAME,req.getCore().getSolrConfig().getRequestParams().toMap());
+            resp.add(SolrQueryResponse.NAME, req.getCore().getSolrConfig().getRequestParams().toMap());
           }
 
         } else {
           Map<String, Object> m = getConfigDetails();
-          resp.add("config", ZkNodeProps.makeMap(parts.get(1),m.get(parts.get(1))));
+          resp.add("config", ZkNodeProps.makeMap(parts.get(1), m.get(parts.get(1))));
         }
       }
     }
@@ -150,12 +151,12 @@ public class SolrConfigHandler extends R
     private Map<String, Object> getConfigDetails() {
       Map<String, Object> map = req.getCore().getSolrConfig().toMap();
       Map reqHandlers = (Map) map.get(SolrRequestHandler.TYPE);
-      if(reqHandlers == null) map.put(SolrRequestHandler.TYPE, reqHandlers =  new LinkedHashMap<>());
+      if (reqHandlers == null) map.put(SolrRequestHandler.TYPE, reqHandlers = new LinkedHashMap<>());
       List<PluginInfo> plugins = PluginsRegistry.getHandlers(req.getCore());
       for (PluginInfo plugin : plugins) {
-        if(SolrRequestHandler.TYPE.equals( plugin.type)){
-          if(!reqHandlers.containsKey(plugin.name)){
-            reqHandlers.put(plugin.name,plugin.toMap());
+        if (SolrRequestHandler.TYPE.equals(plugin.type)) {
+          if (!reqHandlers.containsKey(plugin.name)) {
+            reqHandlers.put(plugin.name, plugin.toMap());
           }
         }
       }
@@ -173,18 +174,18 @@ public class SolrConfigHandler extends R
       for (ContentStream stream : streams)
         ops.addAll(CommandOperation.parse(stream.getReader()));
       List<Map> errList = CommandOperation.captureErrors(ops);
-      if(!errList.isEmpty()) {
-        resp.add(CommandOperation.ERR_MSGS,errList);
+      if (!errList.isEmpty()) {
+        resp.add(CommandOperation.ERR_MSGS, errList);
         return;
       }
 
       try {
-        for (;;) {
+        for (; ; ) {
           ArrayList<CommandOperation> opsCopy = new ArrayList<>(ops.size());
           for (CommandOperation op : ops) opsCopy.add(op.getCopy());
           try {
-            if(parts.size()>1 && RequestParams.NAME.equals(parts.get(1))){
-              RequestParams params = RequestParams.getFreshRequestParams(req.getCore().getResourceLoader(),req.getCore().getSolrConfig().getRequestParams());
+            if (parts.size() > 1 && RequestParams.NAME.equals(parts.get(1))) {
+              RequestParams params = RequestParams.getFreshRequestParams(req.getCore().getResourceLoader(), req.getCore().getSolrConfig().getRequestParams());
               handleParams(opsCopy, params);
             } else {
               ConfigOverlay overlay = SolrConfig.getConfigOverlay(req.getCore().getResourceLoader());
@@ -193,7 +194,7 @@ public class SolrConfigHandler extends R
             break;//succeeded . so no need to go over the loop again
           } catch (ZkController.ResourceModifiedInZkException e) {
             //retry
-            log.info("Race condition, the node is modified in ZK by someone else " +e.getMessage());
+            log.info("Race condition, the node is modified in ZK by someone else " + e.getMessage());
           }
         }
       } catch (Exception e) {
@@ -204,7 +205,6 @@ public class SolrConfigHandler extends R
     }
 
 
-
     private void handleParams(ArrayList<CommandOperation> ops, RequestParams params) {
       for (CommandOperation op : ops) {
         switch (op.name) {
@@ -215,7 +215,7 @@ public class SolrConfigHandler extends R
 
             for (Map.Entry<String, Object> entry : map.entrySet()) {
 
-              Map val =null;
+              Map val = null;
               String key = entry.getKey();
               if (key == null || key.trim().isEmpty()) {
                 op.addError("null key ");
@@ -223,7 +223,7 @@ public class SolrConfigHandler extends R
               }
               key = key.trim();
               String err = validateName(key);
-              if (err !=null) {
+              if (err != null) {
                 op.addError(err);
                 continue;
               }
@@ -268,16 +268,16 @@ public class SolrConfigHandler extends R
 
       List errs = CommandOperation.captureErrors(ops);
       if (!errs.isEmpty()) {
-        resp.add(CommandOperation.ERR_MSGS,errs);
+        resp.add(CommandOperation.ERR_MSGS, errs);
         return;
       }
 
       SolrResourceLoader loader = req.getCore().getResourceLoader();
       if (loader instanceof ZkSolrResourceLoader) {
         ZkSolrResourceLoader zkLoader = (ZkSolrResourceLoader) loader;
-        if(ops.isEmpty()) {
+        if (ops.isEmpty()) {
           ZkController.touchConfDir(zkLoader);
-        }else {
+        } else {
           ZkController.persistConfigResourceToZooKeeper(zkLoader, params.getZnodeVersion(),
               RequestParams.RESOURCE, params.toByteArray(), true);
         }
@@ -289,59 +289,63 @@ public class SolrConfigHandler extends R
 
     }
 
-    private void handleCommands(List<CommandOperation> ops, ConfigOverlay overlay ) throws IOException {
-    for (CommandOperation op : ops) {
-      switch (op.name) {
-        case SET_PROPERTY:
-          overlay = applySetProp(op, overlay);
-          break;
-        case UNSET_PROPERTY:
-          overlay = applyUnset(op, overlay);
-          break;
-        case SET_USER_PROPERTY:
-          overlay = applySetUserProp(op, overlay);
-          break;
-        case UNSET_USER_PROPERTY:
-          overlay = applyUnsetUserProp(op, overlay);
-          break;
-        default: {
-          List<String> pcs = StrUtils.splitSmart(op.name.toLowerCase(Locale.ROOT), '-');
-          if (pcs.size() != 2) {
-            op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
-          } else {
-            String prefix = pcs.get(0);
-            String name = pcs.get(1);
-            if (cmdPrefixes.contains(prefix) && namedPlugins.containsKey(name)) {
-              SolrConfig.SolrPluginInfo info = namedPlugins.get(name);
-              if ("delete".equals(prefix)) {
-                overlay = deleteNamedComponent(op, overlay, info.tag);
+    private void handleCommands(List<CommandOperation> ops, ConfigOverlay overlay) throws IOException {
+      for (CommandOperation op : ops) {
+        switch (op.name) {
+          case SET_PROPERTY:
+            overlay = applySetProp(op, overlay);
+            break;
+          case UNSET_PROPERTY:
+            overlay = applyUnset(op, overlay);
+            break;
+          case SET_USER_PROPERTY:
+            overlay = applySetUserProp(op, overlay);
+            break;
+          case UNSET_USER_PROPERTY:
+            overlay = applyUnsetUserProp(op, overlay);
+            break;
+          default: {
+            List<String> pcs = StrUtils.splitSmart(op.name.toLowerCase(Locale.ROOT), '-');
+            if (pcs.size() != 2) {
+              op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
+            } else {
+              String prefix = pcs.get(0);
+              String name = pcs.get(1);
+              if (cmdPrefixes.contains(prefix) && namedPlugins.containsKey(name)) {
+                SolrConfig.SolrPluginInfo info = namedPlugins.get(name);
+                if ("delete".equals(prefix)) {
+                  overlay = deleteNamedComponent(op, overlay, info.tag);
+                } else {
+                  overlay = updateNamedPlugin(info, op, overlay, prefix.equals("create"));
+                }
               } else {
-                overlay = updateNamedPlugin(info, op, overlay, prefix.equals("create"));
+                op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
               }
-            } else {
-              op.addError(MessageFormat.format("Unknown operation ''{0}'' ", op.name));
             }
           }
         }
       }
-    }
-    List errs = CommandOperation.captureErrors(ops);
-    if (!errs.isEmpty()) {
-      resp.add(CommandOperation.ERR_MSGS,errs);
-      return;
-    }
+      List errs = CommandOperation.captureErrors(ops);
+      if (!errs.isEmpty()) {
+        log.info("Failed to run commands errors are {}", StrUtils.join(errs, ','));
+        resp.add(CommandOperation.ERR_MSGS, errs);
+        return;
+      }
 
-    SolrResourceLoader loader = req.getCore().getResourceLoader();
-    if (loader instanceof ZkSolrResourceLoader) {
-      ZkController.persistConfigResourceToZooKeeper((ZkSolrResourceLoader) loader,overlay.getZnodeVersion(),
-          ConfigOverlay.RESOURCE_NAME,overlay.toByteArray(),true);
+      SolrResourceLoader loader = req.getCore().getResourceLoader();
+      if (loader instanceof ZkSolrResourceLoader) {
+        ZkController.persistConfigResourceToZooKeeper((ZkSolrResourceLoader) loader, overlay.getZnodeVersion(),
+            ConfigOverlay.RESOURCE_NAME, overlay.toByteArray(), true);
+
+        log.info("Executed config commands successfully and persited to ZK {}", ops);
+      } else {
+        SolrResourceLoader.persistConfLocally(loader, ConfigOverlay.RESOURCE_NAME, overlay.toByteArray());
+        req.getCore().getCoreDescriptor().getCoreContainer().reload(req.getCore().getName());
+        log.info("Executed config commands successfully and persited to File System {}", ops);
+      }
 
-    } else {
-      SolrResourceLoader.persistConfLocally(loader, ConfigOverlay.RESOURCE_NAME, overlay.toByteArray());
-      req.getCore().getCoreDescriptor().getCoreContainer().reload(req.getCore().getName());
     }
 
-  }
     private ConfigOverlay deleteNamedComponent(CommandOperation op, ConfigOverlay overlay, String typ) {
       String name = op.getStr(CommandOperation.ROOT_OBJ);
       if (op.hasError()) return overlay;
@@ -353,7 +357,7 @@ public class SolrConfigHandler extends R
       }
     }
 
-    private ConfigOverlay updateNamedPlugin(SolrConfig.SolrPluginInfo info , CommandOperation op, ConfigOverlay overlay, boolean isCeate) {
+    private ConfigOverlay updateNamedPlugin(SolrConfig.SolrPluginInfo info, CommandOperation op, ConfigOverlay overlay, boolean isCeate) {
       String name = op.getStr(NAME);
       String clz = op.getStr(CLASS_NAME);
       op.getMap(PluginInfo.DEFAULTS, null);
@@ -394,7 +398,7 @@ public class SolrConfigHandler extends R
 
     private ConfigOverlay applySetUserProp(CommandOperation op, ConfigOverlay overlay) {
       Map<String, Object> m = op.getDataMap();
-      if(op.hasError()) return overlay;
+      if (op.hasError()) return overlay;
       for (Map.Entry<String, Object> e : m.entrySet()) {
         String name = e.getKey();
         Object val = e.getValue();
@@ -405,9 +409,9 @@ public class SolrConfigHandler extends R
 
     private ConfigOverlay applyUnsetUserProp(CommandOperation op, ConfigOverlay overlay) {
       List<String> name = op.getStrs(CommandOperation.ROOT_OBJ);
-      if(op.hasError()) return overlay;
+      if (op.hasError()) return overlay;
       for (String o : name) {
-        if(!overlay.getUserProps().containsKey(o)) {
+        if (!overlay.getUserProps().containsKey(o)) {
           op.addError(format("No such property ''{0}''", name));
         } else {
           overlay = overlay.unsetUserProperty(o);
@@ -417,13 +421,12 @@ public class SolrConfigHandler extends R
     }
 
 
-
     private ConfigOverlay applyUnset(CommandOperation op, ConfigOverlay overlay) {
       List<String> name = op.getStrs(CommandOperation.ROOT_OBJ);
-      if(op.hasError()) return overlay;
+      if (op.hasError()) return overlay;
 
       for (String o : name) {
-        if(!ConfigOverlay.isEditableProp(o, false, null)) {
+        if (!ConfigOverlay.isEditableProp(o, false, null)) {
           op.addError(format(NOT_EDITABLE, name));
         } else {
           overlay = overlay.unsetProperty(o);
@@ -434,11 +437,11 @@ public class SolrConfigHandler extends R
 
     private ConfigOverlay applySetProp(CommandOperation op, ConfigOverlay overlay) {
       Map<String, Object> m = op.getDataMap();
-      if(op.hasError()) return overlay;
+      if (op.hasError()) return overlay;
       for (Map.Entry<String, Object> e : m.entrySet()) {
         String name = e.getKey();
         Object val = e.getValue();
-        if(!ConfigOverlay.isEditableProp(name, false, null)) {
+        if (!ConfigOverlay.isEditableProp(name, false, null)) {
           op.addError(format(NOT_EDITABLE, name));
           continue;
         }
@@ -450,26 +453,26 @@ public class SolrConfigHandler extends R
   }
 
   public static String validateName(String s) {
-    for(int i=0;i<s.length();i++) {
+    for (int i = 0; i < s.length(); i++) {
       char c = s.charAt(i);
-      if((c >= 'A' && c<='Z') ||
-          (c >='a' && c<='z') ||
-          (c >='0' && c<='9') ||
-           c == '_'||
-           c == '-'||
-           c == '.'
+      if ((c >= 'A' && c <= 'Z') ||
+          (c >= 'a' && c <= 'z') ||
+          (c >= '0' && c <= '9') ||
+          c == '_' ||
+          c == '-' ||
+          c == '.'
           ) continue;
       else {
-        return MessageFormat.format("''{0}'' name should only have chars [a-zA-Z_-.0-9] ",s);
+        return MessageFormat.format("''{0}'' name should only have chars [a-zA-Z_-.0-9] ", s);
       }
     }
     return null;
   }
 
-  static void setWt(SolrQueryRequest req, String wt){
+  static void setWt(SolrQueryRequest req, String wt) {
     SolrParams params = req.getParams();
-    if( params.get(CommonParams.WT) != null ) return;//wt is set by user
-    Map<String,String> map = new HashMap<>(1);
+    if (params.get(CommonParams.WT) != null) return;//wt is set by user
+    Map<String, String> map = new HashMap<>(1);
     map.put(CommonParams.WT, wt);
     map.put("indent", "true");
     req.setParams(SolrParams.wrapDefaults(params, new MapSolrParams(map)));
@@ -477,16 +480,18 @@ public class SolrConfigHandler extends R
 
   @Override
   public SolrRequestHandler getSubHandler(String path) {
-    if(subPaths.contains(path)) return this;
-    if(path.startsWith("/params/")) return this;
+    if (subPaths.contains(path)) return this;
+    if (path.startsWith("/params/")) return this;
     return null;
   }
 
 
-  private static Set<String> subPaths =  new HashSet<>(Arrays.asList("/overlay", "/params",
-      "/query","/jmx","/requestDispatcher"));
+  private static Set<String> subPaths = new HashSet<>(Arrays.asList("/overlay", "/params",
+      "/query", "/jmx", "/requestDispatcher"));
+
   static {
-    for (SolrConfig.SolrPluginInfo solrPluginInfo : SolrConfig.plugins) subPaths.add("/"+solrPluginInfo.tag.replaceAll("/",""));
+    for (SolrConfig.SolrPluginInfo solrPluginInfo : SolrConfig.plugins)
+      subPaths.add("/" + solrPluginInfo.tag.replaceAll("/", ""));
 
   }
 
@@ -510,7 +515,6 @@ public class SolrConfigHandler extends R
   }
 
 
-
   public static final String SET_PROPERTY = "set-property";
   public static final String UNSET_PROPERTY = "unset-property";
   public static final String SET_USER_PROPERTY = "set-user-property";
@@ -518,6 +522,6 @@ public class SolrConfigHandler extends R
   public static final String SET = "set";
   public static final String UPDATE = "update";
   public static final String CREATE = "create";
-  private static Set<String> cmdPrefixes = ImmutableSet.of(CREATE , UPDATE, "delete");
+  private static Set<String> cmdPrefixes = ImmutableSet.of(CREATE, UPDATE, "delete");
 
 }

Modified: lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/CommandOperation.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/CommandOperation.java?rev=1658916&r1=1658915&r2=1658916&view=diff
==============================================================================
--- lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/CommandOperation.java (original)
+++ lucene/dev/trunk/solr/core/src/java/org/apache/solr/util/CommandOperation.java Wed Feb 11 10:40:03 2015
@@ -19,6 +19,7 @@ package org.apache.solr.util;
 
 import java.io.IOException;
 import java.io.Reader;
+import java.io.UnsupportedEncodingException;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -26,14 +27,17 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import org.apache.lucene.util.IOUtils;
+import org.apache.solr.common.cloud.ZkStateReader;
 import org.noggit.JSONParser;
 import org.noggit.ObjectBuilder;
 
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonList;
+import static java.util.Collections.singletonMap;
 import static org.apache.solr.common.cloud.ZkNodeProps.makeMap;
 
-public  class CommandOperation {
+public class CommandOperation {
   public final String name;
   private Object commandData;//this is most often a map
   private List<String> errors = new ArrayList<>();
@@ -43,16 +47,16 @@ public  class CommandOperation {
     this.name = operationName;
   }
 
-  public String getStr(String key, String def){
-    if(ROOT_OBJ.equals(key)){
+  public String getStr(String key, String def) {
+    if (ROOT_OBJ.equals(key)) {
       Object obj = getRootPrimitive();
-      return obj == def ? null: String.valueOf(obj);
+      return obj == def ? null : String.valueOf(obj);
     }
     String s = (String) getMapVal(key);
     return s == null ? def : s;
   }
 
-  public Map<String,Object> getDataMap(){
+  public Map<String, Object> getDataMap() {
     if (commandData instanceof Map) {
       return (Map) commandData;
     }
@@ -60,16 +64,16 @@ public  class CommandOperation {
     return Collections.EMPTY_MAP;
   }
 
-  private Object getRootPrimitive(){
+  private Object getRootPrimitive() {
     if (commandData instanceof Map) {
-      errors.add(MessageFormat.format("The value has to be a string for command : ''{0}'' ",name));
+      errors.add(MessageFormat.format("The value has to be a string for command : ''{0}'' ", name));
       return null;
     }
     return commandData;
 
   }
 
-  public Object getVal(String key){
+  public Object getVal(String key) {
     return getMapVal(key);
   }
 
@@ -78,43 +82,45 @@ public  class CommandOperation {
       Map metaData = (Map) commandData;
       return metaData.get(key);
     } else {
-      String msg= " value has to be an object for operation :"+name;
-      if(!errors.contains(msg)) errors.add(msg);
+      String msg = " value has to be an object for operation :" + name;
+      if (!errors.contains(msg)) errors.add(msg);
       return null;
     }
   }
 
-  public List<String> getStrs(String key){
+  public List<String> getStrs(String key) {
     List<String> val = getStrs(key, null);
-    if(val == null) {
+    if (val == null) {
       errors.add(MessageFormat.format(REQD, key));
     }
     return val;
 
   }
+
   static final String REQD = "''{0}'' is a required field";
 
 
-  /**Get collection of values for a key. If only one val is present a
+  /**
+   * Get collection of values for a key. If only one val is present a
    * single value collection is returned
    */
-  public List<String> getStrs(String key, List<String> def){
+  public List<String> getStrs(String key, List<String> def) {
     Object v = null;
-    if(ROOT_OBJ.equals(key)) {
+    if (ROOT_OBJ.equals(key)) {
       v = getRootPrimitive();
     } else {
       v = getMapVal(key);
     }
-    if(v == null){
+    if (v == null) {
       return def;
     } else {
       if (v instanceof List) {
-        ArrayList<String> l =  new ArrayList<>();
-        for (Object o : (List)v) {
+        ArrayList<String> l = new ArrayList<>();
+        for (Object o : (List) v) {
           l.add(String.valueOf(o));
         }
-        if(l.isEmpty()) return def;
-        return  l;
+        if (l.isEmpty()) return def;
+        return l;
       } else {
         return singletonList(String.valueOf(v));
       }
@@ -122,23 +128,24 @@ public  class CommandOperation {
 
   }
 
-  /**Get a required field. If missing it adds to the errors
+  /**
+   * Get a required field. If missing it adds to the errors
    */
-  public String getStr(String key){
-    if(ROOT_OBJ.equals(key)){
+  public String getStr(String key) {
+    if (ROOT_OBJ.equals(key)) {
       Object obj = getRootPrimitive();
-      if(obj == null) {
-        errors.add(MessageFormat.format(REQD,name));
+      if (obj == null) {
+        errors.add(MessageFormat.format(REQD, name));
       }
-      return obj == null ? null: String.valueOf(obj);
+      return obj == null ? null : String.valueOf(obj);
     }
 
-    String s = getStr(key,null);
-    if(s==null) errors.add(MessageFormat.format(REQD, key));
+    String s = getStr(key, null);
+    if (s == null) errors.add(MessageFormat.format(REQD, key));
     return s;
   }
 
-  private Map errorDetails(){
+  private Map errorDetails() {
     return makeMap(name, commandData, ERR_MSGS, errors);
   }
 
@@ -147,18 +154,19 @@ public  class CommandOperation {
   }
 
   public void addError(String s) {
-    if(errors.contains(s)) return;
+    if (errors.contains(s)) return;
     errors.add(s);
   }
 
-  /**Get all the values from the metadata for the command
+  /**
+   * Get all the values from the metadata for the command
    * without the specified keys
    */
   public Map getValuesExcluding(String... keys) {
     getMapVal(null);
-    if(hasError()) return emptyMap();//just to verify the type is Map
-    LinkedHashMap<String, Object> cp = new LinkedHashMap<>((Map<String,?>) commandData);
-    if(keys == null) return cp;
+    if (hasError()) return emptyMap();//just to verify the type is Map
+    LinkedHashMap<String, Object> cp = new LinkedHashMap<>((Map<String, ?>) commandData);
+    if (keys == null) return cp;
     for (String key : keys) {
       cp.remove(key);
     }
@@ -169,12 +177,14 @@ public  class CommandOperation {
   public List<String> getErrors() {
     return errors;
   }
+
   public static final String ERR_MSGS = "errorMessages";
   public static final String ROOT_OBJ = "";
-  public static List<Map> captureErrors(List<CommandOperation> ops){
+
+  public static List<Map> captureErrors(List<CommandOperation> ops) {
     List<Map> errors = new ArrayList<>();
     for (CommandOperation op : ops) {
-      if(op.hasError()) {
+      if (op.hasError()) {
         errors.add(op.errorDetails());
       }
     }
@@ -182,21 +192,22 @@ public  class CommandOperation {
   }
 
 
-  /**Parse the command operations into command objects
+  /**
+   * Parse the command operations into command objects
    */
-  public static List<CommandOperation> parse(Reader rdr ) throws IOException {
+  public static List<CommandOperation> parse(Reader rdr) throws IOException {
     JSONParser parser = new JSONParser(rdr);
 
     ObjectBuilder ob = new ObjectBuilder(parser);
 
-    if(parser.lastEvent() != JSONParser.OBJECT_START) {
+    if (parser.lastEvent() != JSONParser.OBJECT_START) {
       throw new RuntimeException("The JSON must be an Object of the form {\"command\": {...},...");
     }
     List<CommandOperation> operations = new ArrayList<>();
-    for(;;) {
+    for (; ; ) {
       int ev = parser.nextEvent();
-      if (ev==JSONParser.OBJECT_END) return operations;
-      Object key =  ob.getKey();
+      if (ev == JSONParser.OBJECT_END) return operations;
+      Object key = ob.getKey();
       ev = parser.nextEvent();
       Object val = ob.getVal();
       if (val instanceof List) {
@@ -210,14 +221,15 @@ public  class CommandOperation {
     }
 
   }
-  public CommandOperation getCopy(){
-    return new CommandOperation(name,commandData);
+
+  public CommandOperation getCopy() {
+    return new CommandOperation(name, commandData);
   }
 
   public Map getMap(String key, Map def) {
-    Object o =getMapVal(key);
-    if(o==null) return def;
-    if ( !(o instanceof Map)) {
+    Object o = getMapVal(key);
+    if (o == null) return def;
+    if (!(o instanceof Map)) {
       addError(MessageFormat.format("''{0}'' must be a map", key));
       return def;
     } else {
@@ -225,4 +237,14 @@ public  class CommandOperation {
 
     }
   }
+
+  @Override
+  public String toString() {
+    try {
+      return new String(ZkStateReader.toJSON(singletonMap(name, commandData)), IOUtils.UTF_8);
+    } catch (UnsupportedEncodingException e) {
+      //should not happen
+      return "";
+    }
+  }
 }