1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.es.log.exentity;
17
18 import java.time.LocalDateTime;
19 import java.time.ZoneId;
20 import java.time.ZonedDateTime;
21 import java.time.format.DateTimeFormatter;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.List;
25 import java.util.Map;
26 import java.util.stream.Collectors;
27
28 import org.codelibs.core.lang.StringUtil;
29 import org.codelibs.core.misc.Pair;
30 import org.codelibs.fess.Constants;
31 import org.codelibs.fess.entity.SearchLogEvent;
32 import org.codelibs.fess.es.log.bsentity.BsSearchLog;
33 import org.codelibs.fess.es.log.exbhv.UserInfoBhv;
34 import org.codelibs.fess.util.ComponentUtil;
35 import org.dbflute.optional.OptionalEntity;
36
37
38
39
40 public class SearchLog extends BsSearchLog implements SearchLogEvent {
41
42 private static final long serialVersionUID = 1L;
43
44 private final List<Pair<String, String>> searchFieldLogList = new ArrayList<>();
45
46 private OptionalEntity<UserInfo> userInfo;
47
48 private Map<String, Object> fields;
49
50 private final List<Map<String, Object>> documentList = new ArrayList<>();
51
52 @Override
53 public String getId() {
54 return asDocMeta().id();
55 }
56
57 public void setId(final String id) {
58 asDocMeta().id(id);
59 }
60
61 @Override
62 public Long getVersionNo() {
63 return asDocMeta().version();
64 }
65
66 public void setVersionNo(final Long version) {
67 asDocMeta().version(version);
68 }
69
70 public void addSearchFieldLogValue(final String name, final String value) {
71 if (StringUtil.isNotBlank(name) && StringUtil.isNotBlank(value)) {
72 searchFieldLogList.add(new Pair<>(name, value));
73 }
74 }
75
76 public void addDocument(final Map<String, Object> doc) {
77 documentList.add(doc);
78 }
79
80 public void setSearchQuery(final String query) {
81 addSearchFieldLogValue(Constants.SEARCH_FIELD_LOG_SEARCH_QUERY, query);
82 }
83
84 public OptionalEntity<UserInfo> getUserInfo() {
85 if (getUserInfoId() == null) {
86 return OptionalEntity.empty();
87 }
88 if (userInfo == null) {
89 final UserInfoBhv userInfoBhv = ComponentUtil.getComponent(UserInfoBhv.class);
90 userInfo = userInfoBhv.selectByPK(getUserInfoId());
91 }
92 return userInfo;
93 }
94
95 public void setUserInfo(final OptionalEntity<UserInfo> userInfo) {
96 this.userInfo = userInfo;
97 userInfo.ifPresent(e -> {
98 super.setUserInfoId(e.getId());
99 });
100 }
101
102 public List<Pair<String, String>> getSearchFieldLogList() {
103 return searchFieldLogList;
104 }
105
106 public void addField(final String key, final Object value) {
107 fields.put(key, value);
108 }
109
110 public String getLogMessage() {
111 return getSearchWord();
112 }
113
114 @Override
115 public Map<String, Object> toSource() {
116 final Map<String, Object> sourceMap = super.toSource();
117 if (fields != null) {
118 sourceMap.putAll(fields);
119 }
120 final Map<String, List<String>> searchFieldMap = searchFieldLogList.stream()
121 .collect(Collectors.groupingBy(Pair::getFirst, Collectors.mapping(Pair::getSecond, Collectors.toList())));
122 sourceMap.put("searchField", searchFieldMap);
123 sourceMap.put("documents", documentList);
124 return sourceMap;
125 }
126
127 @Override
128 protected void addFieldToSource(final Map<String, Object> sourceMap, final String field, final Object value) {
129 if (value instanceof LocalDateTime) {
130 final LocalDateTime ldt = (LocalDateTime) value;
131 final ZonedDateTime zdt = ZonedDateTime.of(ldt, ZoneId.systemDefault());
132 super.addFieldToSource(sourceMap, field, DateTimeFormatter.ISO_INSTANT.format(zdt));
133 } else {
134 super.addFieldToSource(sourceMap, field, value);
135 }
136 }
137
138 @Override
139 public void setUserInfoId(final String value) {
140 userInfo = null;
141 super.setUserInfoId(value);
142 }
143
144 @Override
145 public String toString() {
146 return "SearchLog [searchFieldLogList=" + searchFieldLogList + ", userInfo=" + userInfo + ", fields=" + fields + ", accessType="
147 + accessType + ", clientIp=" + clientIp + ", hitCount=" + hitCount + ", languages=" + languages + ", queryId=" + queryId
148 + ", queryOffset=" + queryOffset + ", queryPageSize=" + queryPageSize + ", queryTime=" + queryTime + ", referer=" + referer
149 + ", requestedAt=" + requestedAt + ", responseTime=" + responseTime + ", roles=" + Arrays.toString(roles) + ", searchWord="
150 + searchWord + ", user=" + user + ", userAgent=" + userAgent + ", userInfoId=" + userInfoId + ", userSessionId="
151 + userSessionId + ", virtualHost=" + virtualHost + ", documents=" + documentList + "]";
152 }
153
154 @Override
155 public String getEventType() {
156 return "log";
157 }
158 }