SOLR-6233: Minor refactorings provided by Steve Davids.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1626802 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Timothy Potter 2014-09-22 15:11:20 +00:00
parent 2cd2251e9c
commit e8e49968c9
1 changed files with 34 additions and 130 deletions

View File

@ -17,17 +17,12 @@ package org.apache.solr.util;
* limitations under the License.
*/
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.ConnectException;
import java.net.SocketException;
import java.net.URL;
import java.text.DateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.List;
@ -45,12 +40,12 @@ import org.apache.commons.cli.Option;
import org.apache.commons.cli.OptionBuilder;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NoHttpResponseException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.conn.ConnectTimeoutException;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.log4j.Level;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
@ -313,7 +308,7 @@ public class SolrCLI {
}
for (String classInPackage : classes) {
Class theClass = Class.forName(classInPackage);
Class<?> theClass = Class.forName(classInPackage);
if (Tool.class.isAssignableFrom(theClass)) {
toolClasses.add((Class<Tool>) theClass);
}
@ -425,97 +420,34 @@ public class SolrCLI {
* Utility function for sending HTTP GET request to Solr and then doing some
* validation of the response.
*/
@SuppressWarnings({"unchecked", "rawtypes"})
@SuppressWarnings({"unchecked"})
public static Map<String,Object> getJson(HttpClient httpClient, String getUrl) throws Exception {
Map<String,Object> json = null;
// ensure we're requesting JSON back from Solr
URL url = new URL(getUrl);
String queryString = url.getQuery();
if (queryString != null) {
if (queryString.indexOf("wt=json") == -1) {
getUrl += "&wt=json";
}
} else {
getUrl += "?wt=json";
}
// Prepare a request object
HttpGet httpget = new HttpGet(getUrl);
// ensure we're requesting JSON back from Solr
HttpGet httpGet = new HttpGet(new URIBuilder(getUrl).setParameter("wt", "json").build());
//Will throw HttpResponseException if a non-ok response
String content = httpClient.execute(httpGet, new BasicResponseHandler());
// Execute the request
HttpResponse response = httpClient.execute(httpget);
// Get hold of the response entity
HttpEntity entity = response.getEntity();
if (response.getStatusLine().getStatusCode() != 200) {
StringBuilder body = new StringBuilder();
if (entity != null) {
InputStream instream = entity.getContent();
String line;
try {
BufferedReader reader =
new BufferedReader(new InputStreamReader(instream, "UTF-8"));
while ((line = reader.readLine()) != null) {
body.append(line);
}
} catch (Exception ignore) {
// squelch it - just trying to compose an error message here
} finally {
instream.close();
}
}
throw new Exception("GET request [" + getUrl + "] failed due to: "
+ response.getStatusLine() + ": " + body);
}
// If the response does not enclose an entity, there is no need
// to worry about connection release
if (entity != null) {
InputStreamReader isr = null;
try {
isr = new InputStreamReader(entity.getContent(), "UTF-8");
Object resp =
ObjectBuilder.getVal(new JSONParser(isr));
if (resp != null && resp instanceof Map) {
json = (Map<String,Object>)resp;
} else {
throw new SolrServerException("Expected JSON object in response from "+
getUrl+" but received "+ resp);
}
} catch (RuntimeException ex) {
// In case of an unexpected exception you may want to abort
// the HTTP request in order to shut down the underlying
// connection and release it back to the connection manager.
httpget.abort();
throw ex;
} finally {
// Closing the input stream will trigger connection release
isr.close();
}
Object resp = ObjectBuilder.getVal(new JSONParser(content));
if (resp != null && resp instanceof Map) {
json = (Map<String,Object>)resp;
} else {
throw new SolrServerException("Expected JSON object in response from "+
getUrl+" but received "+ resp);
}
// lastly check the response JSON from Solr to see if it is an error
int statusCode = -1;
Map responseHeader = (Map)json.get("responseHeader");
if (responseHeader != null) {
Long status = (Long)responseHeader.get("status");
if (status != null)
statusCode = status.intValue();
}
Long statusCode = asLong("/responseHeader/status", json);
if (statusCode == -1)
if (statusCode == -1) {
throw new SolrServerException("Unable to determine outcome of GET request to: "+
getUrl+"! Response: "+json);
if (statusCode != 0) {
String errMsg = null;
Map error = (Map) json.get("error");
if (error != null) {
errMsg = (String)error.get("msg");
}
getUrl+"! Response: "+json);
} else if (statusCode != 0) {
String errMsg = asString("/error/msg", json);
if (errMsg == null) errMsg = String.valueOf(json);
errMsg = errMsg == null ? String.valueOf(json) : errMsg;
throw new SolrServerException("Request to "+getUrl+" failed due to: "+errMsg);
}
@ -526,36 +458,14 @@ public class SolrCLI {
* Helper function for reading a String value from a JSON Object tree.
*/
public static String asString(String jsonPath, Map<String,Object> json) {
String str = null;
Object obj = atPath(jsonPath, json);
if (obj != null) {
if (obj instanceof String) {
str = (String)obj;
} else {
// no ok if it's not null and of a different type
throw new IllegalStateException("Expected a String at path "+
jsonPath+" but found "+obj+" instead! "+json);
}
} // it's ok if it is null
return str;
return pathAs(String.class, jsonPath, json);
}
/**
* Helper function for reading a Long value from a JSON Object tree.
*/
public static Long asLong(String jsonPath, Map<String,Object> json) {
Long num = null;
Object obj = atPath(jsonPath, json);
if (obj != null) {
if (obj instanceof Long) {
num = (Long)obj;
} else {
// no ok if it's not null and of a different type
throw new IllegalStateException("Expected a Long at path "+
jsonPath+" but found "+obj+" instead! "+json);
}
} // it's ok if it is null
return num;
return pathAs(Long.class, jsonPath, json);
}
/**
@ -563,18 +473,7 @@ public class SolrCLI {
*/
@SuppressWarnings("unchecked")
public static List<String> asList(String jsonPath, Map<String,Object> json) {
List<String> list = null;
Object obj = atPath(jsonPath, json);
if (obj != null) {
if (obj instanceof List) {
list = (List<String>)obj;
} else {
// no ok if it's not null and of a different type
throw new IllegalStateException("Expected a List at path "+
jsonPath+" but found "+obj+" instead! "+json);
}
} // it's ok if it is null
return list;
return pathAs(List.class, jsonPath, json);
}
/**
@ -582,18 +481,23 @@ public class SolrCLI {
*/
@SuppressWarnings("unchecked")
public static Map<String,Object> asMap(String jsonPath, Map<String,Object> json) {
Map<String,Object> map = null;
return pathAs(Map.class, jsonPath, json);
}
@SuppressWarnings("unchecked")
public static <T> T pathAs(Class<T> clazz, String jsonPath, Map<String,Object> json) {
T val = null;
Object obj = atPath(jsonPath, json);
if (obj != null) {
if (obj instanceof Map) {
map = (Map<String,Object>)obj;
if (clazz.isAssignableFrom(obj.getClass())) {
val = (T) obj;
} else {
// no ok if it's not null and of a different type
throw new IllegalStateException("Expected a Map at path "+
throw new IllegalStateException("Expected a " + clazz.getName() + " at path "+
jsonPath+" but found "+obj+" instead! "+json);
}
} // it's ok if it is null
return map;
return val;
}
/**