This commit is contained in:
Shinsuke Sugaya 2014-06-21 08:15:19 +09:00
parent e916f8676e
commit a662d4efe8
7 changed files with 203 additions and 48 deletions

View file

@ -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;

View file

@ -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\":");

View file

@ -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));

View 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;
}
}

View file

@ -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);
}

View file

@ -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);
}
}

View file

@ -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;
}
}