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> { protected boolean partialResults = false; + protected int qTime; + + protected long elapsedTime; + public QueryResponseList() { parent = new ArrayList>(); } @@ -99,6 +103,8 @@ public class QueryResponseList implements List> { final SolrDocumentList sdList = queryResponse.getResults(); start = sdList.getStart(); numFound = sdList.getNumFound(); + qTime = queryResponse.getQTime(); + elapsedTime = queryResponse.getElapsedTime(); final Object partialResultsValue = queryResponse .getResponseHeader().get(PARTIAL_RESULTS); @@ -363,74 +369,38 @@ public class QueryResponseList implements List> { return pageSize; } - public void setPageSize(final int pageSize) { - this.pageSize = pageSize; - } - public int getCurrentPageNumber() { return currentPageNumber; } - public void setCurrentPageNumber(final int currentPageNumber) { - this.currentPageNumber = currentPageNumber; - } - public long getAllRecordCount() { return allRecordCount; } - public void setAllRecordCount(final long allRecordCount) { - this.allRecordCount = allRecordCount; - } - public int getAllPageCount() { return allPageCount; } - public void setAllPageCount(final int allPageCount) { - this.allPageCount = allPageCount; - } - public boolean isExistNextPage() { return existNextPage; } - public void setExistNextPage(final boolean existNextPage) { - this.existNextPage = existNextPage; - } - public boolean isExistPrevPage() { return existPrevPage; } - public void setExistPrevPage(final boolean existPrevPage) { - this.existPrevPage = existPrevPage; - } - public long getCurrentStartRecordNumber() { return currentStartRecordNumber; } - public void setCurrentStartRecordNumber(final long currentStartRecordRange) { - currentStartRecordNumber = currentStartRecordRange; - } - public long getCurrentEndRecordNumber() { return currentEndRecordNumber; } - public void setCurrentEndRecordNumber(final long currentEndRecordRange) { - currentEndRecordNumber = currentEndRecordRange; - } - public List getPageNumberList() { return pageNumberList; } - public void setPageNumberList(final List pageNumberList) { - this.pageNumberList = pageNumberList; - } - public String getSearchQuery() { return searchQuery; } @@ -455,9 +425,6 @@ public class QueryResponseList implements List> { this.execTime = execTime; } - /** - * @return the facetResponse - */ public FacetResponse getFacetResponse() { return facetResponse; } @@ -466,18 +433,16 @@ public class QueryResponseList implements List> { return moreLikeThisResponse; } - /** - * @return the partialResults - */ public boolean isPartialResults() { return partialResults; } - /** - * @param partialResults the partialResults to set - */ - public void setPartialResults(final boolean partialResults) { - this.partialResults = partialResults; + public int getQTime() { + return qTime; + } + + public long getElapsedTime() { + return elapsedTime; } }