View Javadoc
1   /*
2    * Copyright 2012-2021 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
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   * @author FreeGen
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 }