diff --git a/src/main/java/org/codelibs/fess/app/service/SearchService.java b/src/main/java/org/codelibs/fess/app/service/SearchService.java index ae59fb27e..5b54b58c4 100644 --- a/src/main/java/org/codelibs/fess/app/service/SearchService.java +++ b/src/main/java/org/codelibs/fess/app/service/SearchService.java @@ -16,7 +16,6 @@ package org.codelibs.fess.app.service; import java.text.NumberFormat; -import java.time.LocalDateTime; import java.util.Enumeration; import java.util.HashSet; import java.util.List; @@ -29,7 +28,6 @@ import java.util.function.Consumer; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import org.apache.commons.lang3.StringUtils; import org.codelibs.core.lang.StringUtil; import org.codelibs.core.misc.DynamicProperties; import org.codelibs.fess.Constants; @@ -39,13 +37,8 @@ import org.codelibs.fess.entity.SearchRequestParams; import org.codelibs.fess.es.client.FessEsClient; import org.codelibs.fess.es.client.FessEsClient.SearchConditionBuilder; import org.codelibs.fess.es.client.FessEsClientException; -import org.codelibs.fess.es.log.exentity.SearchLog; import org.codelibs.fess.helper.QueryHelper; -import org.codelibs.fess.helper.RoleQueryHelper; -import org.codelibs.fess.helper.SearchLogHelper; import org.codelibs.fess.helper.SystemHelper; -import org.codelibs.fess.helper.UserInfoHelper; -import org.codelibs.fess.mylasta.action.FessUserBean; import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.QueryResponseList; @@ -86,9 +79,6 @@ public class SearchService { @Resource protected QueryHelper queryHelper; - @Resource - protected UserInfoHelper userInfoHelper; - // =================================================================================== // Method // ============== @@ -176,7 +166,8 @@ public class SearchService { // search log if (searchLogSupport) { - storeSearchLog(request, DfTypeUtil.toLocalDateTime(requestedTime), queryId, query, pageStart, pageSize, queryResponseList); + ComponentUtil.getSearchLogHelper().addSearchLog(request, DfTypeUtil.toLocalDateTime(requestedTime), queryId, query, pageStart, + pageSize, queryResponseList); } } @@ -192,61 +183,6 @@ public class SearchService { queryContext.getQueryBuilder()); } - protected void storeSearchLog(final HttpServletRequest request, final LocalDateTime requestedTime, final String queryId, - final String query, final int pageStart, final int pageSize, final QueryResponseList queryResponseList) { - - final SearchLogHelper searchLogHelper = ComponentUtil.getSearchLogHelper(); - final RoleQueryHelper roleQueryHelper = ComponentUtil.getRoleQueryHelper(); - final SearchLog searchLog = new SearchLog(); - - if (Constants.TRUE.equals(systemProperties.getProperty(Constants.USER_INFO_PROPERTY, Constants.TRUE))) { - final String userCode = userInfoHelper.getUserCode(); - if (userCode != null) { - searchLog.setUserSessionId(userCode); - } - } - - searchLog.setRoles(roleQueryHelper.build().stream().toArray(n -> new String[n])); - searchLog.setQueryId(queryId); - searchLog.setHitCount(queryResponseList.getAllRecordCount()); - searchLog.setResponseTime(queryResponseList.getExecTime()); - searchLog.setQueryTime(queryResponseList.getQueryTime()); - searchLog.setSearchWord(StringUtils.abbreviate(query, 1000)); - searchLog.setSearchQuery(StringUtils.abbreviate(queryResponseList.getSearchQuery(), 1000)); - searchLog.setRequestedAt(requestedTime); - searchLog.setQueryOffset(pageStart); - searchLog.setQueryPageSize(pageSize); - ComponentUtil.getRequestManager().findUserBean(FessUserBean.class).ifPresent(user -> { - searchLog.setUser(user.getUserId()); - }); - - searchLog.setClientIp(StringUtils.abbreviate(request.getRemoteAddr(), 50)); - searchLog.setReferer(StringUtils.abbreviate(request.getHeader("referer"), 1000)); - searchLog.setUserAgent(StringUtils.abbreviate(request.getHeader("user-agent"), 255)); - final Object accessType = request.getAttribute(Constants.SEARCH_LOG_ACCESS_TYPE); - if (Constants.SEARCH_LOG_ACCESS_TYPE_JSON.equals(accessType)) { - searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_JSON); - } else if (Constants.SEARCH_LOG_ACCESS_TYPE_XML.equals(accessType)) { - searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_XML); - } else if (Constants.SEARCH_LOG_ACCESS_TYPE_OTHER.equals(accessType)) { - searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_OTHER); - } else { - searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_WEB); - } - - @SuppressWarnings("unchecked") - final Map> fieldLogMap = (Map>) request.getAttribute(Constants.FIELD_LOGS); - if (fieldLogMap != null) { - for (final Map.Entry> logEntry : fieldLogMap.entrySet()) { - for (final String value : logEntry.getValue()) { - searchLog.addSearchFieldLogValue(logEntry.getKey(), StringUtils.abbreviate(value, 1000)); - } - } - } - - searchLogHelper.addSearchLog(searchLog); - } - public String[] getLanguages(final HttpServletRequest request, final SearchRequestParams params) { if (params.getLanguages() != null) { final Set langSet = new HashSet<>(); diff --git a/src/main/java/org/codelibs/fess/helper/SearchLogHelper.java b/src/main/java/org/codelibs/fess/helper/SearchLogHelper.java index a3ffd8ecb..4f55d62d4 100644 --- a/src/main/java/org/codelibs/fess/helper/SearchLogHelper.java +++ b/src/main/java/org/codelibs/fess/helper/SearchLogHelper.java @@ -25,7 +25,9 @@ import java.util.concurrent.ConcurrentLinkedQueue; import javax.annotation.PostConstruct; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import org.apache.commons.lang3.StringUtils; import org.codelibs.core.collection.LruHashMap; import org.codelibs.core.lang.StringUtil; import org.codelibs.core.misc.DynamicProperties; @@ -40,9 +42,11 @@ import org.codelibs.fess.es.log.exentity.ClickLog; import org.codelibs.fess.es.log.exentity.SearchFieldLog; import org.codelibs.fess.es.log.exentity.SearchLog; import org.codelibs.fess.es.log.exentity.UserInfo; +import org.codelibs.fess.mylasta.action.FessUserBean; import org.codelibs.fess.mylasta.direction.FessConfig; import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.DocumentUtil; +import org.codelibs.fess.util.QueryResponseList; import org.codelibs.fess.util.StreamUtil; import org.elasticsearch.action.update.UpdateRequest; import org.elasticsearch.script.Script; @@ -71,7 +75,58 @@ public class SearchLogHelper { userInfoCache = new LruHashMap(userInfoCacheSize); } - public void addSearchLog(final SearchLog searchLog) { + public void addSearchLog(final HttpServletRequest request, final LocalDateTime requestedTime, final String queryId, final String query, + final int pageStart, final int pageSize, final QueryResponseList queryResponseList) { + + final RoleQueryHelper roleQueryHelper = ComponentUtil.getRoleQueryHelper(); + final UserInfoHelper userInfoHelper = ComponentUtil.getUserInfoHelper(); + final SearchLog searchLog = new SearchLog(); + + if (Constants.TRUE.equals(systemProperties.getProperty(Constants.USER_INFO_PROPERTY, Constants.TRUE))) { + final String userCode = userInfoHelper.getUserCode(); + if (userCode != null) { + searchLog.setUserSessionId(userCode); + } + } + + searchLog.setRoles(roleQueryHelper.build().stream().toArray(n -> new String[n])); + searchLog.setQueryId(queryId); + searchLog.setHitCount(queryResponseList.getAllRecordCount()); + searchLog.setResponseTime(queryResponseList.getExecTime()); + searchLog.setQueryTime(queryResponseList.getQueryTime()); + searchLog.setSearchWord(StringUtils.abbreviate(query, 1000)); + searchLog.setSearchQuery(StringUtils.abbreviate(queryResponseList.getSearchQuery(), 1000)); + searchLog.setRequestedAt(requestedTime); + searchLog.setQueryOffset(pageStart); + searchLog.setQueryPageSize(pageSize); + ComponentUtil.getRequestManager().findUserBean(FessUserBean.class).ifPresent(user -> { + searchLog.setUser(user.getUserId()); + }); + + searchLog.setClientIp(StringUtils.abbreviate(request.getRemoteAddr(), 50)); + searchLog.setReferer(StringUtils.abbreviate(request.getHeader("referer"), 1000)); + searchLog.setUserAgent(StringUtils.abbreviate(request.getHeader("user-agent"), 255)); + final Object accessType = request.getAttribute(Constants.SEARCH_LOG_ACCESS_TYPE); + if (Constants.SEARCH_LOG_ACCESS_TYPE_JSON.equals(accessType)) { + searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_JSON); + } else if (Constants.SEARCH_LOG_ACCESS_TYPE_XML.equals(accessType)) { + searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_XML); + } else if (Constants.SEARCH_LOG_ACCESS_TYPE_OTHER.equals(accessType)) { + searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_OTHER); + } else { + searchLog.setAccessType(Constants.SEARCH_LOG_ACCESS_TYPE_WEB); + } + + @SuppressWarnings("unchecked") + final Map> fieldLogMap = (Map>) request.getAttribute(Constants.FIELD_LOGS); + if (fieldLogMap != null) { + for (final Map.Entry> logEntry : fieldLogMap.entrySet()) { + for (final String value : logEntry.getValue()) { + searchLog.addSearchFieldLogValue(logEntry.getKey(), StringUtils.abbreviate(value, 1000)); + } + } + } + searchLogQueue.add(searchLog); }