parent
e916f8676e
commit
a662d4efe8
7 changed files with 203 additions and 48 deletions
|
@ -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;
|
||||
|
|
|
@ -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\":");
|
||||
|
|
|
@ -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("<result>");
|
||||
for (Target target : pingResponse.getTargets()) {
|
||||
buf.append("<server><status>");
|
||||
buf.append(target.getStatus());
|
||||
buf.append("</status><url>");
|
||||
buf.append(escapeXml(target.getRequestUrl()));
|
||||
buf.append("</url><q-time>");
|
||||
buf.append(target.getqTime());
|
||||
buf.append("</q-time><search-time>");
|
||||
buf.append(target.getElapsedTime());
|
||||
buf.append("</search-time></server>");
|
||||
}
|
||||
buf.append("</result>");
|
||||
} 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("<exec-time>");
|
||||
buf.append(execTime);
|
||||
buf.append("</exec-time>");
|
||||
buf.append("<q-time>");
|
||||
buf.append(qTime);
|
||||
buf.append("</q-time>");
|
||||
buf.append("<search-time>");
|
||||
buf.append(elapsedTime);
|
||||
buf.append("</search-time>");
|
||||
if (StringUtil.isNotBlank(queryId)) {
|
||||
buf.append("<query-id>");
|
||||
buf.append(escapeXml(queryId));
|
||||
|
|
70
src/main/java/jp/sf/fess/entity/PingResponse.java
Normal file
70
src/main/java/jp/sf/fess/entity/PingResponse.java
Normal file
|
@ -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<SolrPingResponse> responses) {
|
||||
List<Target> 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;
|
||||
}
|
||||
|
||||
}
|
|
@ -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<String, Object> getDocument(final String query) {
|
||||
return getDocument(query, queryHelper.getResponseFields(), null);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
|
|
@ -83,6 +83,10 @@ public class QueryResponseList implements List<Map<String, Object>> {
|
|||
|
||||
protected boolean partialResults = false;
|
||||
|
||||
protected int qTime;
|
||||
|
||||
protected long elapsedTime;
|
||||
|
||||
public QueryResponseList() {
|
||||
parent = new ArrayList<Map<String, Object>>();
|
||||
}
|
||||
|
@ -99,6 +103,8 @@ public class QueryResponseList implements List<Map<String, Object>> {
|
|||
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<Map<String, Object>> {
|
|||
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<String> getPageNumberList() {
|
||||
return pageNumberList;
|
||||
}
|
||||
|
||||
public void setPageNumberList(final List<String> pageNumberList) {
|
||||
this.pageNumberList = pageNumberList;
|
||||
}
|
||||
|
||||
public String getSearchQuery() {
|
||||
return searchQuery;
|
||||
}
|
||||
|
@ -455,9 +425,6 @@ public class QueryResponseList implements List<Map<String, Object>> {
|
|||
this.execTime = execTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return the facetResponse
|
||||
*/
|
||||
public FacetResponse getFacetResponse() {
|
||||
return facetResponse;
|
||||
}
|
||||
|
@ -466,18 +433,16 @@ public class QueryResponseList implements List<Map<String, Object>> {
|
|||
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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue