diff --git a/src/main/java/jp/sf/fess/api/BaseApiManager.java b/src/main/java/jp/sf/fess/api/BaseApiManager.java
index bf8c32a6c..b43601f04 100644
--- a/src/main/java/jp/sf/fess/api/BaseApiManager.java
+++ b/src/main/java/jp/sf/fess/api/BaseApiManager.java
@@ -32,7 +32,7 @@ public class BaseApiManager {
protected static final String SEARCH_API = "/searchApi";
protected static enum FormatType {
- SEARCH, LABEL, SUGGEST, SPELLCHECK, ANALYSIS, HOTSEARCHWORD, FAVORITE, FAVORITES, OTHER;
+ SEARCH, LABEL, SUGGEST, SPELLCHECK, ANALYSIS, HOTSEARCHWORD, FAVORITE, FAVORITES, OTHER, PING;
}
public BaseApiManager() {
@@ -60,6 +60,8 @@ public class BaseApiManager {
return FormatType.FAVORITE;
} else if (FormatType.FAVORITES.name().equals(type)) {
return FormatType.FAVORITES;
+ } else if (FormatType.PING.name().equals(type)) {
+ return FormatType.PING;
} else {
// default
return FormatType.OTHER;
diff --git a/src/main/java/jp/sf/fess/api/json/JsonApiManager.java b/src/main/java/jp/sf/fess/api/json/JsonApiManager.java
index 22032139c..06e16e4fe 100644
--- a/src/main/java/jp/sf/fess/api/json/JsonApiManager.java
+++ b/src/main/java/jp/sf/fess/api/json/JsonApiManager.java
@@ -36,9 +36,12 @@ import jp.sf.fess.api.WebApiRequest;
import jp.sf.fess.api.WebApiResponse;
import jp.sf.fess.db.allcommon.CDef;
import jp.sf.fess.entity.FieldAnalysisResponse;
+import jp.sf.fess.entity.PingResponse;
+import jp.sf.fess.entity.PingResponse.Target;
import jp.sf.fess.entity.SpellCheckResponse;
import jp.sf.fess.entity.SuggestResponse;
import jp.sf.fess.entity.SuggestResponse.SuggestResponseList;
+import jp.sf.fess.service.SearchService;
import jp.sf.fess.util.ComponentUtil;
import jp.sf.fess.util.FacetResponse;
import jp.sf.fess.util.FacetResponse.Field;
@@ -101,12 +104,56 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager {
case FAVORITES:
processFavoritesRequest(request, response, chain);
break;
+ case PING:
+ processPingRequest(request, response, chain);
+ break;
default:
writeJsonResponse(99, StringUtil.EMPTY, "Not found.");
break;
}
}
+ protected void processPingRequest(HttpServletRequest request,
+ HttpServletResponse response, FilterChain chain) {
+ SearchService searchService = ComponentUtil.getSearchService();
+ int status;
+ final StringBuilder buf = new StringBuilder(1000);
+ String errMsg = null;
+ try {
+ PingResponse pingResponse = searchService.ping();
+ status = pingResponse.getStatus();
+ buf.append("\"result\":[");
+ boolean appended = false;
+ for (Target target : pingResponse.getTargets()) {
+ if (!appended) {
+ buf.append(',');
+ appended = true;
+ }
+ buf.append("{\"status\":");
+ buf.append(target.getStatus());
+ buf.append(",\"url\":\"");
+ buf.append(escapeJson(target.getRequestUrl()));
+ buf.append("\",\"qTime\":");
+ buf.append(target.getqTime());
+ buf.append(",\"searchTime\":");
+ buf.append(target.getElapsedTime());
+ buf.append("}");
+ }
+ buf.append(']');
+ } catch (Exception e) {
+ status = 9;
+ errMsg = e.getMessage();
+ if (errMsg == null) {
+ errMsg = e.getClass().getName();
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("Failed to process a ping request.", e);
+ }
+ }
+
+ writeJsonResponse(status, buf.toString(), errMsg);
+ }
+
protected void processSearchRequest(final HttpServletRequest request,
final HttpServletResponse response, final FilterChain chain) {
int status = 0;
@@ -122,6 +169,8 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager {
WebApiUtil.validate();
query = WebApiUtil.getObject("searchQuery");
final String execTime = WebApiUtil.getObject("execTime");
+ final String qTime = WebApiUtil.getObject("qTime");
+ final String elapsedTime = WebApiUtil.getObject("elapsedTime");
final String pageSize = WebApiUtil.getObject("pageSize");
final String currentPageNumber = WebApiUtil
.getObject("currentPageNumber");
@@ -139,6 +188,10 @@ public class JsonApiManager extends BaseApiManager implements WebApiManager {
buf.append(escapeJson(query));
buf.append(",\"execTime\":");
buf.append(execTime);
+ buf.append(",\"qTime\":");
+ buf.append(qTime);
+ buf.append(",\"searchTime\":");
+ buf.append(elapsedTime);
buf.append(',');
if (StringUtil.isNotBlank(queryId)) {
buf.append("\"queryId\":");
diff --git a/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java b/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java
index 6b86ef7ce..fab6fa547 100644
--- a/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java
+++ b/src/main/java/jp/sf/fess/api/xml/XmlApiManager.java
@@ -35,9 +35,12 @@ import jp.sf.fess.api.WebApiRequest;
import jp.sf.fess.api.WebApiResponse;
import jp.sf.fess.db.allcommon.CDef;
import jp.sf.fess.entity.FieldAnalysisResponse;
+import jp.sf.fess.entity.PingResponse;
+import jp.sf.fess.entity.PingResponse.Target;
import jp.sf.fess.entity.SpellCheckResponse;
import jp.sf.fess.entity.SuggestResponse;
import jp.sf.fess.entity.SuggestResponse.SuggestResponseList;
+import jp.sf.fess.service.SearchService;
import jp.sf.fess.util.ComponentUtil;
import jp.sf.fess.util.FacetResponse;
import jp.sf.fess.util.FacetResponse.Field;
@@ -89,6 +92,9 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
case ANALYSIS:
processAnalysisRequest(request, response, chain);
break;
+ case PING:
+ processPingRequest(request, response, chain);
+ break;
default:
writeXmlResponse(-1, StringUtil.EMPTY, "Not found.");
break;
@@ -96,6 +102,42 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
}
+ protected void processPingRequest(HttpServletRequest request,
+ HttpServletResponse response, FilterChain chain) {
+ SearchService searchService = ComponentUtil.getSearchService();
+ int status;
+ final StringBuilder buf = new StringBuilder(1000);
+ String errMsg = null;
+ try {
+ PingResponse pingResponse = searchService.ping();
+ status = pingResponse.getStatus();
+ buf.append("");
+ for (Target target : pingResponse.getTargets()) {
+ buf.append("");
+ buf.append(target.getStatus());
+ buf.append("");
+ buf.append(escapeXml(target.getRequestUrl()));
+ buf.append("");
+ buf.append(target.getqTime());
+ buf.append("");
+ buf.append(target.getElapsedTime());
+ buf.append("");
+ }
+ buf.append("");
+ } catch (Exception e) {
+ status = 9;
+ errMsg = e.getMessage();
+ if (errMsg == null) {
+ errMsg = e.getClass().getName();
+ }
+ if (logger.isDebugEnabled()) {
+ logger.debug("Failed to process a ping request.", e);
+ }
+ }
+
+ writeXmlResponse(status, buf.toString(), errMsg);
+ }
+
protected void processSearchRequest(final HttpServletRequest request,
final HttpServletResponse response, final FilterChain chain) {
int status = 0;
@@ -111,6 +153,8 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
WebApiUtil.validate();
query = WebApiUtil.getObject("searchQuery");
final String execTime = WebApiUtil.getObject("execTime");
+ final String qTime = WebApiUtil.getObject("qTime");
+ final String elapsedTime = WebApiUtil.getObject("elapsedTime");
final String pageSize = WebApiUtil.getObject("pageSize");
final String currentPageNumber = WebApiUtil
.getObject("currentPageNumber");
@@ -130,6 +174,12 @@ public class XmlApiManager extends BaseApiManager implements WebApiManager {
buf.append("");
buf.append(execTime);
buf.append("");
+ buf.append("");
+ buf.append(qTime);
+ buf.append("");
+ buf.append("");
+ buf.append(elapsedTime);
+ buf.append("");
if (StringUtil.isNotBlank(queryId)) {
buf.append("");
buf.append(escapeXml(queryId));
diff --git a/src/main/java/jp/sf/fess/entity/PingResponse.java b/src/main/java/jp/sf/fess/entity/PingResponse.java
new file mode 100644
index 000000000..6007892ba
--- /dev/null
+++ b/src/main/java/jp/sf/fess/entity/PingResponse.java
@@ -0,0 +1,70 @@
+package jp.sf.fess.entity;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.solr.client.solrj.response.SolrPingResponse;
+
+public class PingResponse {
+ private int status = 0;
+
+ private Target[] targets;
+
+ public PingResponse(Collection responses) {
+ List targetList = new ArrayList<>();
+ for (SolrPingResponse response : responses) {
+ int status = response.getStatus();
+ if (status != 0) {
+ status = 1;
+ }
+ targetList.add(new Target(status, response.getRequestUrl(),
+ response.getElapsedTime(), response.getQTime()));
+ }
+ targets = targetList.toArray(new Target[targetList.size()]);
+ }
+
+ public static class Target {
+
+ private int status;
+
+ private String requestUrl;
+
+ private long elapsedTime;
+
+ private int qTime;
+
+ public Target(int status, String requestUrl, long elapsedTime, int qTime) {
+ this.status = status;
+ this.requestUrl = requestUrl;
+ this.elapsedTime = elapsedTime;
+ this.qTime = qTime;
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public String getRequestUrl() {
+ return requestUrl;
+ }
+
+ public long getElapsedTime() {
+ return elapsedTime;
+ }
+
+ public int getqTime() {
+ return qTime;
+ }
+
+ }
+
+ public int getStatus() {
+ return status;
+ }
+
+ public Target[] getTargets() {
+ return targets;
+ }
+
+}
diff --git a/src/main/java/jp/sf/fess/service/SearchService.java b/src/main/java/jp/sf/fess/service/SearchService.java
index c12e915df..99e256699 100644
--- a/src/main/java/jp/sf/fess/service/SearchService.java
+++ b/src/main/java/jp/sf/fess/service/SearchService.java
@@ -33,6 +33,7 @@ import jp.sf.fess.entity.FacetInfo;
import jp.sf.fess.entity.FieldAnalysisResponse;
import jp.sf.fess.entity.GeoInfo;
import jp.sf.fess.entity.MoreLikeThisInfo;
+import jp.sf.fess.entity.PingResponse;
import jp.sf.fess.entity.SearchQuery;
import jp.sf.fess.entity.SearchQuery.SortField;
import jp.sf.fess.entity.SpellCheckResponse;
@@ -78,6 +79,12 @@ public class SearchService implements Serializable {
@Resource
protected SpellChecker spellChecker;
+ public PingResponse ping( ) {
+ final SolrGroup solrGroup = solrGroupManager
+ .getSolrGroup(QueryType.QUERY);
+ return new PingResponse(solrGroup.ping());
+ }
+
public Map getDocument(final String query) {
return getDocument(query, queryHelper.getResponseFields(), null);
}
diff --git a/src/main/java/jp/sf/fess/util/ComponentUtil.java b/src/main/java/jp/sf/fess/util/ComponentUtil.java
index 6af43d282..3070fd7ad 100644
--- a/src/main/java/jp/sf/fess/util/ComponentUtil.java
+++ b/src/main/java/jp/sf/fess/util/ComponentUtil.java
@@ -38,6 +38,7 @@ import jp.sf.fess.helper.SystemHelper;
import jp.sf.fess.helper.UserAgentHelper;
import jp.sf.fess.helper.ViewHelper;
import jp.sf.fess.job.JobExecutor;
+import jp.sf.fess.service.SearchService;
import jp.sf.fess.solr.IndexUpdater;
import org.codelibs.core.crypto.CachedCipher;
@@ -105,6 +106,8 @@ public final class ComponentUtil {
private static final String JOB_EXECUTOR_SUFFIX = "JobExecutor";
+ private static final String SEARCH_SERVICE = "searchService";
+
private ComponentUtil() {
}
@@ -228,4 +231,9 @@ public final class ComponentUtil {
public static String getUserAgentName() {
return SingletonS2Container.getComponent(USER_AGENT_NAME);
}
+
+ public static SearchService getSearchService() {
+ return SingletonS2Container.getComponent(SEARCH_SERVICE);
+
+ }
}
diff --git a/src/main/java/jp/sf/fess/util/QueryResponseList.java b/src/main/java/jp/sf/fess/util/QueryResponseList.java
index c57c6e0de..0a785d099 100644
--- a/src/main/java/jp/sf/fess/util/QueryResponseList.java
+++ b/src/main/java/jp/sf/fess/util/QueryResponseList.java
@@ -83,6 +83,10 @@ public class QueryResponseList implements List