123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818 |
- /*
- * Copyright 2012-2021 CodeLibs Project and the Others.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
- * either express or implied. See the License for the specific language
- * governing permissions and limitations under the License.
- */
- package org.codelibs.fess.api.json;
- import java.io.IOException;
- import java.net.URLDecoder;
- import java.util.ArrayList;
- import java.util.Arrays;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Locale;
- import java.util.Map;
- import javax.annotation.PostConstruct;
- import javax.servlet.FilterChain;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.logging.log4j.LogManager;
- import org.apache.logging.log4j.Logger;
- import org.codelibs.core.exception.IORuntimeException;
- import org.codelibs.core.lang.StringUtil;
- import org.codelibs.fesen.script.Script;
- import org.codelibs.fess.Constants;
- import org.codelibs.fess.api.BaseJsonApiManager;
- import org.codelibs.fess.app.service.FavoriteLogService;
- import org.codelibs.fess.entity.FacetInfo;
- import org.codelibs.fess.entity.GeoInfo;
- import org.codelibs.fess.entity.HighlightInfo;
- import org.codelibs.fess.entity.PingResponse;
- import org.codelibs.fess.entity.SearchRenderData;
- import org.codelibs.fess.entity.SearchRequestParams;
- import org.codelibs.fess.entity.SearchRequestParams.SearchRequestType;
- import org.codelibs.fess.es.client.SearchEngineClient;
- import org.codelibs.fess.exception.WebApiException;
- import org.codelibs.fess.helper.LabelTypeHelper;
- import org.codelibs.fess.helper.PopularWordHelper;
- import org.codelibs.fess.helper.RelatedContentHelper;
- import org.codelibs.fess.helper.RelatedQueryHelper;
- import org.codelibs.fess.helper.SearchHelper;
- import org.codelibs.fess.helper.SystemHelper;
- import org.codelibs.fess.helper.UserInfoHelper;
- import org.codelibs.fess.mylasta.direction.FessConfig;
- import org.codelibs.fess.util.ComponentUtil;
- import org.codelibs.fess.util.DocumentUtil;
- import org.codelibs.fess.util.FacetResponse;
- import org.codelibs.fess.util.FacetResponse.Field;
- import org.dbflute.optional.OptionalThing;
- public class JsonApiManager extends BaseJsonApiManager {
- private static final Logger logger = LogManager.getLogger(JsonApiManager.class);
- public JsonApiManager() {
- setPathPrefix("/json");
- }
- @PostConstruct
- public void register() {
- if (logger.isInfoEnabled()) {
- logger.info("Load {}", this.getClass().getSimpleName());
- }
- ComponentUtil.getWebApiManagerFactory().add(this);
- }
- @Override
- public boolean matches(final HttpServletRequest request) {
- final FessConfig fessConfig = ComponentUtil.getFessConfig();
- if (!fessConfig.isWebApiJson()) {
- switch (getFormatType(request)) {
- case SEARCH:
- case LABEL:
- case POPULARWORD:
- return false;
- default:
- break;
- }
- }
- final String servletPath = request.getServletPath();
- return servletPath.startsWith(pathPrefix);
- }
- @Override
- public void process(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain)
- throws IOException, ServletException {
- switch (getFormatType(request)) {
- case SEARCH:
- processSearchRequest(request, response, chain);
- break;
- case LABEL:
- processLabelRequest(request, response, chain);
- break;
- case POPULARWORD:
- processPopularWordRequest(request, response, chain);
- break;
- case FAVORITE:
- processFavoriteRequest(request, response, chain);
- break;
- case FAVORITES:
- processFavoritesRequest(request, response, chain);
- break;
- case PING:
- processPingRequest(request, response, chain);
- break;
- case SCROLL:
- processScrollSearchRequest(request, response, chain);
- break;
- default:
- writeJsonResponse(99, StringUtil.EMPTY, "Not found.");
- break;
- }
- }
- protected void processScrollSearchRequest(final HttpServletRequest request, final HttpServletResponse response,
- final FilterChain chain) {
- final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
- final FessConfig fessConfig = ComponentUtil.getFessConfig();
- if (!fessConfig.isAcceptedSearchReferer(request.getHeader("referer"))) {
- writeJsonResponse(99, StringUtil.EMPTY, "Referer is invalid.");
- return;
- }
- if (!fessConfig.isApiSearchScroll()) {
- writeJsonResponse(99, StringUtil.EMPTY, "Scroll Search is not available.");
- return;
- }
- final StringBuilder buf = new StringBuilder(1000);
- request.setAttribute(Constants.SEARCH_LOG_ACCESS_TYPE, Constants.SEARCH_LOG_ACCESS_TYPE_JSON);
- final JsonRequestParams params = new JsonRequestParams(request, fessConfig);
- try {
- response.setContentType("application/x-ndjson; charset=UTF-8");
- final long count = searchHelper.scrollSearch(params, doc -> {
- buf.setLength(0);
- buf.append('{');
- boolean first2 = true;
- for (final Map.Entry<String, Object> entry : doc.entrySet()) {
- final String name = entry.getKey();
- if (StringUtil.isNotBlank(name) && entry.getValue() != null) {
- if (!first2) {
- buf.append(',');
- } else {
- first2 = false;
- }
- buf.append(escapeJson(name));
- buf.append(':');
- buf.append(escapeJson(entry.getValue()));
- }
- }
- buf.append('}');
- buf.append('\n');
- try {
- response.getWriter().print(buf.toString());
- } catch (final IOException e) {
- throw new IORuntimeException(e);
- }
- return true;
- }, OptionalThing.empty());
- response.flushBuffer();
- if (logger.isDebugEnabled()) {
- logger.debug("Loaded {} docs", count);
- }
- } catch (final Exception e) {
- final int status = 9;
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a ping request.", e);
- }
- writeJsonResponse(status, null, e);
- }
- }
- protected void processPingRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
- final SearchEngineClient searchEngineClient = ComponentUtil.getSearchEngineClient();
- int status;
- Exception err = null;
- try {
- final PingResponse pingResponse = searchEngineClient.ping();
- status = pingResponse.getStatus();
- writeJsonResponse(status, "\"message\":" + pingResponse.getMessage());
- } catch (final Exception e) {
- status = 9;
- err = e;
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a ping request.", e);
- }
- writeJsonResponse(status, null, err);
- }
- }
- protected void processSearchRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
- final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
- final FessConfig fessConfig = ComponentUtil.getFessConfig();
- final RelatedQueryHelper relatedQueryHelper = ComponentUtil.getRelatedQueryHelper();
- final RelatedContentHelper relatedContentHelper = ComponentUtil.getRelatedContentHelper();
- int status = 0;
- Exception err = null;
- String query = null;
- final StringBuilder buf = new StringBuilder(1000); // TODO replace response stream
- request.setAttribute(Constants.SEARCH_LOG_ACCESS_TYPE, Constants.SEARCH_LOG_ACCESS_TYPE_JSON);
- try {
- final SearchRenderData data = new SearchRenderData();
- final JsonRequestParams params = new JsonRequestParams(request, fessConfig);
- query = params.getQuery();
- searchHelper.search(params, data, OptionalThing.empty());
- final String execTime = data.getExecTime();
- final String queryTime = Long.toString(data.getQueryTime());
- final String pageSize = Integer.toString(data.getPageSize());
- final String currentPageNumber = Integer.toString(data.getCurrentPageNumber());
- final String allRecordCount = Long.toString(data.getAllRecordCount());
- final String allRecordCountRelation = data.getAllRecordCountRelation();
- final String allPageCount = Integer.toString(data.getAllPageCount());
- final List<Map<String, Object>> documentItems = data.getDocumentItems();
- final FacetResponse facetResponse = data.getFacetResponse();
- final String queryId = data.getQueryId();
- final String highlightParams = data.getAppendHighlightParams();
- final boolean nextPage = data.isExistNextPage();
- final boolean prevPage = data.isExistPrevPage();
- final long startRecordNumber = data.getCurrentStartRecordNumber();
- final long endRecordNumber = data.getCurrentEndRecordNumber();
- final List<String> pageNumbers = data.getPageNumberList();
- final boolean partial = data.isPartialResults();
- final String searchQuery = data.getSearchQuery();
- final long requestedTime = data.getRequestedTime();
- buf.append("\"q\":");
- buf.append(escapeJson(query));
- buf.append(",\"query_id\":");
- buf.append(escapeJson(queryId));
- buf.append(",\"exec_time\":");
- buf.append(execTime);
- buf.append(",\"query_time\":");
- buf.append(queryTime);
- buf.append(',');
- buf.append("\"page_size\":");
- buf.append(pageSize);
- buf.append(',');
- buf.append("\"page_number\":");
- buf.append(currentPageNumber);
- buf.append(',');
- buf.append("\"record_count\":");
- buf.append(allRecordCount);
- buf.append(',');
- buf.append("\"record_count_relation\":");
- buf.append(escapeJson(allRecordCountRelation));
- buf.append(',');
- buf.append("\"page_count\":");
- buf.append(allPageCount);
- buf.append(",\"highlight_params\":");
- buf.append(escapeJson(highlightParams));
- buf.append(",\"next_page\":");
- buf.append(escapeJson(nextPage));
- buf.append(",\"prev_page\":");
- buf.append(escapeJson(prevPage));
- buf.append(",\"start_record_number\":");
- buf.append(startRecordNumber);
- buf.append(",\"end_record_number\":");
- buf.append(escapeJson(endRecordNumber));
- buf.append(",\"page_numbers\":");
- buf.append(escapeJson(pageNumbers));
- buf.append(",\"partial\":");
- buf.append(escapeJson(partial));
- buf.append(",\"search_query\":");
- buf.append(escapeJson(searchQuery));
- buf.append(",\"requested_time\":");
- buf.append(requestedTime);
- final String[] relatedQueries = relatedQueryHelper.getRelatedQueries(params.getQuery());
- buf.append(",\"related_query\":");
- buf.append(escapeJson(relatedQueries));
- final String[] relatedContents = relatedContentHelper.getRelatedContents(params.getQuery());
- buf.append(",\"related_contents\":");
- buf.append(escapeJson(relatedContents));
- buf.append(',');
- buf.append("\"result\":[");
- if (!documentItems.isEmpty()) {
- boolean first1 = true;
- for (final Map<String, Object> document : documentItems) {
- if (!first1) {
- buf.append(',');
- } else {
- first1 = false;
- }
- buf.append('{');
- boolean first2 = true;
- for (final Map.Entry<String, Object> entry : document.entrySet()) {
- final String name = entry.getKey();
- if (StringUtil.isNotBlank(name) && entry.getValue() != null
- && ComponentUtil.getQueryHelper().isApiResponseField(name)) {
- if (!first2) {
- buf.append(',');
- } else {
- first2 = false;
- }
- buf.append(escapeJson(name));
- buf.append(':');
- buf.append(escapeJson(entry.getValue()));
- }
- }
- buf.append('}');
- }
- }
- buf.append(']');
- if (facetResponse != null && facetResponse.hasFacetResponse()) {
- // facet field
- buf.append(',');
- buf.append("\"facet_field\":[");
- if (facetResponse.getFieldList() != null) {
- boolean first1 = true;
- for (final Field field : facetResponse.getFieldList()) {
- if (!first1) {
- buf.append(',');
- } else {
- first1 = false;
- }
- buf.append("{\"name\":");
- buf.append(escapeJson(field.getName()));
- buf.append(",\"result\":[");
- boolean first2 = true;
- for (final Map.Entry<String, Long> entry : field.getValueCountMap().entrySet()) {
- if (!first2) {
- buf.append(',');
- } else {
- first2 = false;
- }
- buf.append("{\"value\":");
- buf.append(escapeJson(entry.getKey()));
- buf.append(",\"count\":");
- buf.append(entry.getValue());
- buf.append('}');
- }
- buf.append(']');
- buf.append('}');
- }
- }
- buf.append(']');
- // facet q
- buf.append(',');
- buf.append("\"facet_query\":[");
- if (facetResponse.getQueryCountMap() != null) {
- boolean first1 = true;
- for (final Map.Entry<String, Long> entry : facetResponse.getQueryCountMap().entrySet()) {
- if (!first1) {
- buf.append(',');
- } else {
- first1 = false;
- }
- buf.append("{\"value\":");
- buf.append(escapeJson(entry.getKey()));
- buf.append(",\"count\":");
- buf.append(entry.getValue());
- buf.append('}');
- }
- }
- buf.append(']');
- }
- } catch (final Exception e) {
- status = 1;
- err = e;
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a search request.", e);
- }
- }
- writeJsonResponse(status, buf.toString(), err);
- }
- protected String detailedMessage(final Throwable t) {
- if (t == null) {
- return "Unknown";
- }
- Throwable target = t;
- if (target.getCause() == null) {
- return target.getClass().getSimpleName() + "[" + target.getMessage() + "]";
- }
- final StringBuilder sb = new StringBuilder();
- while (target != null) {
- sb.append(target.getClass().getSimpleName());
- if (target.getMessage() != null) {
- sb.append("[");
- sb.append(target.getMessage());
- sb.append("]");
- }
- sb.append("; ");
- target = target.getCause();
- if (target != null) {
- sb.append("nested: ");
- }
- }
- return sb.toString();
- }
- protected void processLabelRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
- final LabelTypeHelper labelTypeHelper = ComponentUtil.getLabelTypeHelper();
- int status = 0;
- Exception err = null;
- final StringBuilder buf = new StringBuilder(255); // TODO replace response stream
- try {
- final List<Map<String, String>> labelTypeItems = labelTypeHelper.getLabelTypeItemList(SearchRequestType.JSON);
- buf.append("\"record_count\":");
- buf.append(labelTypeItems.size());
- if (!labelTypeItems.isEmpty()) {
- buf.append(',');
- buf.append("\"result\":[");
- boolean first1 = true;
- for (final Map<String, String> labelMap : labelTypeItems) {
- if (!first1) {
- buf.append(',');
- } else {
- first1 = false;
- }
- buf.append("{\"label\":");
- buf.append(escapeJson(labelMap.get(Constants.ITEM_LABEL)));
- buf.append(", \"value\":");
- buf.append(escapeJson(labelMap.get(Constants.ITEM_VALUE)));
- buf.append('}');
- }
- buf.append(']');
- }
- } catch (final Exception e) {
- status = 1;
- err = e;
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a label request.", e);
- }
- }
- writeJsonResponse(status, buf.toString(), err);
- }
- protected void processPopularWordRequest(final HttpServletRequest request, final HttpServletResponse response,
- final FilterChain chain) {
- if (!ComponentUtil.getFessConfig().isWebApiPopularWord()) {
- writeJsonResponse(9, null, "Unsupported operation.");
- return;
- }
- final String seed = request.getParameter("seed");
- final List<String> tagList = new ArrayList<>();
- final String[] tags = request.getParameterValues("labels");
- if (tags != null) {
- tagList.addAll(Arrays.asList(tags));
- }
- final String key = ComponentUtil.getVirtualHostHelper().getVirtualHostKey();
- if (StringUtil.isNotBlank(key)) {
- tagList.add(key);
- }
- final String[] fields = request.getParameterValues("fields");
- final String[] excludes = StringUtil.EMPTY_STRINGS;// TODO
- final PopularWordHelper popularWordHelper = ComponentUtil.getPopularWordHelper();
- int status = 0;
- Exception err = null;
- final StringBuilder buf = new StringBuilder(255); // TODO replace response stream
- try {
- final List<String> popularWordList = popularWordHelper.getWordList(SearchRequestType.JSON, seed,
- tagList.toArray(new String[tagList.size()]), null, fields, excludes);
- buf.append("\"result\":[");
- boolean first1 = true;
- for (final String word : popularWordList) {
- if (!first1) {
- buf.append(',');
- } else {
- first1 = false;
- }
- buf.append(escapeJson(word));
- }
- buf.append(']');
- } catch (final Exception e) {
- if (e instanceof WebApiException) {
- status = ((WebApiException) e).getStatusCode();
- } else {
- status = 1;
- }
- err = e;
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a popularWord request.", e);
- }
- }
- writeJsonResponse(status, buf.toString(), err);
- }
- protected void processFavoriteRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
- if (!ComponentUtil.getFessConfig().isUserFavorite()) {
- writeJsonResponse(9, null, "Unsupported operation.");
- return;
- }
- final FessConfig fessConfig = ComponentUtil.getFessConfig();
- final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper();
- final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
- final FavoriteLogService favoriteLogService = ComponentUtil.getComponent(FavoriteLogService.class);
- final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
- try {
- final String docId = request.getParameter("docId");
- final String queryId = request.getParameter("queryId");
- final String[] docIds = userInfoHelper.getResultDocIds(URLDecoder.decode(queryId, Constants.UTF_8));
- if (docIds == null) {
- throw new WebApiException(6, "No searched urls.");
- }
- searchHelper.getDocumentByDocId(docId, new String[] { fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldLang() },
- OptionalThing.empty()).ifPresent(doc -> {
- final String favoriteUrl = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
- final String userCode = userInfoHelper.getUserCode();
- if (StringUtil.isBlank(userCode)) {
- throw new WebApiException(2, "No user session.");
- }
- if (StringUtil.isBlank(favoriteUrl)) {
- throw new WebApiException(2, "URL is null.");
- }
- boolean found = false;
- for (final String id : docIds) {
- if (docId.equals(id)) {
- found = true;
- break;
- }
- }
- if (!found) {
- throw new WebApiException(5, "Not found: " + favoriteUrl);
- }
- if (!favoriteLogService.addUrl(userCode, (userInfo, favoriteLog) -> {
- favoriteLog.setUserInfoId(userInfo.getId());
- favoriteLog.setUrl(favoriteUrl);
- favoriteLog.setDocId(docId);
- favoriteLog.setQueryId(queryId);
- favoriteLog.setCreatedAt(systemHelper.getCurrentTimeAsLocalDateTime());
- })) {
- throw new WebApiException(4, "Failed to add url: " + favoriteUrl);
- }
- final String id = DocumentUtil.getValue(doc, fessConfig.getIndexFieldId(), String.class);
- searchHelper.update(id, builder -> {
- final Script script = ComponentUtil.getLanguageHelper().createScript(doc,
- "ctx._source." + fessConfig.getIndexFieldFavoriteCount() + "+=1");
- builder.setScript(script);
- final Map<String, Object> upsertMap = new HashMap<>();
- upsertMap.put(fessConfig.getIndexFieldFavoriteCount(), 1);
- builder.setUpsert(upsertMap);
- builder.setRefreshPolicy(Constants.TRUE);
- });
- writeJsonResponse(0, "\"result\":\"ok\"", (String) null);
- }).orElse(() -> {
- throw new WebApiException(6, "Not found: " + docId);
- });
- } catch (final Exception e) {
- int status;
- if (e instanceof WebApiException) {
- status = ((WebApiException) e).getStatusCode();
- } else {
- status = 1;
- }
- writeJsonResponse(status, null, e);
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a favorite request.", e);
- }
- }
- }
- protected void processFavoritesRequest(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) {
- if (!ComponentUtil.getFessConfig().isUserFavorite()) {
- writeJsonResponse(9, null, "Unsupported operation.");
- return;
- }
- final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper();
- final FessConfig fessConfig = ComponentUtil.getFessConfig();
- final SearchHelper searchHelper = ComponentUtil.getSearchHelper();
- final FavoriteLogService favoriteLogService = ComponentUtil.getComponent(FavoriteLogService.class);
- int status = 0;
- String body = null;
- Exception err = null;
- try {
- final String queryId = request.getParameter("queryId");
- final String userCode = userInfoHelper.getUserCode();
- if (StringUtil.isBlank(userCode)) {
- throw new WebApiException(2, "No user session.");
- }
- if (StringUtil.isBlank(queryId)) {
- throw new WebApiException(3, "Query ID is null.");
- }
- final String[] docIds = userInfoHelper.getResultDocIds(queryId);
- final List<Map<String, Object>> docList = searchHelper.getDocumentListByDocIds(docIds, new String[] {
- fessConfig.getIndexFieldUrl(), fessConfig.getIndexFieldDocId(), fessConfig.getIndexFieldFavoriteCount() },
- OptionalThing.empty(), SearchRequestType.JSON);
- List<String> urlList = new ArrayList<>(docList.size());
- for (final Map<String, Object> doc : docList) {
- final String urlObj = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
- if (urlObj != null) {
- urlList.add(urlObj);
- }
- }
- urlList = favoriteLogService.getUrlList(userCode, urlList);
- final List<String> docIdList = new ArrayList<>(urlList.size());
- for (final Map<String, Object> doc : docList) {
- final String urlObj = DocumentUtil.getValue(doc, fessConfig.getIndexFieldUrl(), String.class);
- if (urlObj != null && urlList.contains(urlObj)) {
- final String docIdObj = DocumentUtil.getValue(doc, fessConfig.getIndexFieldDocId(), String.class);
- if (docIdObj != null) {
- docIdList.add(docIdObj);
- }
- }
- }
- final StringBuilder buf = new StringBuilder(255); // TODO replace response stream
- buf.append("\"num\":").append(docIdList.size());
- buf.append(", \"doc_ids\":[");
- if (!docIdList.isEmpty()) {
- for (int i = 0; i < docIdList.size(); i++) {
- if (i > 0) {
- buf.append(',');
- }
- buf.append(escapeJson(docIdList.get(i)));
- }
- }
- buf.append(']');
- body = buf.toString();
- } catch (final Exception e) {
- if (e instanceof WebApiException) {
- status = ((WebApiException) e).getStatusCode();
- } else {
- status = 1;
- }
- err = e;
- if (logger.isDebugEnabled()) {
- logger.debug("Failed to process a favorites request.", e);
- }
- }
- writeJsonResponse(status, body, err);
- }
- protected static class JsonRequestParams extends SearchRequestParams {
- private final HttpServletRequest request;
- private final FessConfig fessConfig;
- private int startPosition = -1;
- private int pageSize = -1;
- protected JsonRequestParams(final HttpServletRequest request, final FessConfig fessConfig) {
- this.request = request;
- this.fessConfig = fessConfig;
- }
- @Override
- public String getTrackTotalHits() {
- return request.getParameter(Constants.TRACK_TOTAL_HITS);
- }
- @Override
- public String getQuery() {
- return request.getParameter("q");
- }
- @Override
- public String[] getExtraQueries() {
- return getParamValueArray(request, "ex_q");
- }
- @Override
- public Map<String, String[]> getFields() {
- final Map<String, String[]> fields = new HashMap<>();
- for (final Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
- final String key = entry.getKey();
- if (key.startsWith("fields.")) {
- final String[] value = simplifyArray(entry.getValue());
- fields.put(key.substring("fields.".length()), value);
- }
- }
- return fields;
- }
- @Override
- public Map<String, String[]> getConditions() {
- final Map<String, String[]> conditions = new HashMap<>();
- for (final Map.Entry<String, String[]> entry : request.getParameterMap().entrySet()) {
- final String key = entry.getKey();
- if (key.startsWith("as.")) {
- final String[] value = simplifyArray(entry.getValue());
- conditions.put(key.substring("as.".length()), value);
- }
- }
- return conditions;
- }
- @Override
- public String[] getLanguages() {
- return getParamValueArray(request, "lang");
- }
- @Override
- public GeoInfo getGeoInfo() {
- return createGeoInfo(request);
- }
- @Override
- public FacetInfo getFacetInfo() {
- return createFacetInfo(request);
- }
- @Override
- public String getSort() {
- return request.getParameter("sort");
- }
- @Override
- public int getStartPosition() {
- if (startPosition != -1) {
- return startPosition;
- }
- final String start = request.getParameter("start");
- if (StringUtil.isBlank(start)) {
- startPosition = fessConfig.getPagingSearchPageStartAsInteger();
- } else {
- try {
- startPosition = Integer.parseInt(start);
- } catch (final NumberFormatException e) {
- startPosition = fessConfig.getPagingSearchPageStartAsInteger();
- }
- }
- return startPosition;
- }
- @Override
- public int getPageSize() {
- if (pageSize != -1) {
- return pageSize;
- }
- final String num = request.getParameter("num");
- if (StringUtil.isBlank(num)) {
- pageSize = fessConfig.getPagingSearchPageSizeAsInteger();
- } else {
- try {
- pageSize = Integer.parseInt(num);
- if (pageSize > fessConfig.getPagingSearchPageMaxSizeAsInteger().intValue() || pageSize <= 0) {
- pageSize = fessConfig.getPagingSearchPageMaxSizeAsInteger();
- }
- } catch (final NumberFormatException e) {
- pageSize = fessConfig.getPagingSearchPageSizeAsInteger();
- }
- }
- return pageSize;
- }
- @Override
- public Object getAttribute(final String name) {
- return request.getAttribute(name);
- }
- @Override
- public Locale getLocale() {
- return Locale.ROOT;
- }
- @Override
- public SearchRequestType getType() {
- return SearchRequestType.JSON;
- }
- @Override
- public String getSimilarDocHash() {
- return request.getParameter("sdh");
- }
- @Override
- public HighlightInfo getHighlightInfo() {
- return ComponentUtil.getViewHelper().createHighlightInfo();
- }
- }
- @Override
- protected void writeHeaders(final HttpServletResponse response) {
- ComponentUtil.getFessConfig().getApiJsonResponseHeaderList().forEach(e -> response.setHeader(e.getFirst(), e.getSecond()));
- }
- }
|