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.app.web.admin.searchlog;
17  
18  import javax.annotation.Resource;
19  
20  import org.codelibs.fess.Constants;
21  import org.codelibs.fess.annotation.Secured;
22  import org.codelibs.fess.app.pager.SearchLogPager;
23  import org.codelibs.fess.app.service.SearchLogService;
24  import org.codelibs.fess.app.web.CrudMode;
25  import org.codelibs.fess.app.web.base.FessAdminAction;
26  import org.codelibs.fess.util.RenderDataUtil;
27  import org.lastaflute.web.Execute;
28  import org.lastaflute.web.response.HtmlResponse;
29  import org.lastaflute.web.response.render.RenderData;
30  import org.lastaflute.web.ruts.process.ActionRuntime;
31  
32  /**
33   * @author shinsuke
34   */
35  public class AdminSearchlogAction extends FessAdminAction {
36  
37      public static final String ROLE = "admin-searchlog";
38  
39      private static final String[] CONDITION_FIELDS =
40              new String[] { "logType", "queryId", "userSessionId", "accessType", "requestedTimeRange", "pageSize" };
41  
42      // ===================================================================================
43      //                                                                           Attribute
44      //                                                                           =========
45      @Resource
46      private SearchLogService searchLogService;
47      @Resource
48      private SearchLogPager searchLogPager;
49  
50      // ===================================================================================
51      //                                                                               Hook
52      //                                                                              ======
53      @Override
54      protected void setupHtmlData(final ActionRuntime runtime) {
55          super.setupHtmlData(runtime);
56          runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameSearchlog()));
57      }
58  
59      @Override
60      protected String getActionRole() {
61          return ROLE;
62      }
63  
64      // ===================================================================================
65      //                                                                      Search Execute
66      //                                                                      ==============
67      @Execute
68      @Secured({ ROLE, ROLE + VIEW })
69      public HtmlResponse index() {
70          saveToken();
71          return asListHtml();
72      }
73  
74      @Execute
75      @Secured({ ROLE, ROLE + VIEW })
76      public HtmlResponse list(final Integer pageNumber, final SearchForm form) {
77          saveToken();
78          searchLogPager.setCurrentPageNumber(pageNumber);
79          return asHtml(path_AdminSearchlog_AdminSearchlogJsp).renderWith(data -> {
80              searchPaging(data, form);
81          });
82      }
83  
84      @Execute
85      @Secured({ ROLE, ROLE + VIEW })
86      public HtmlResponse search(final SearchForm form) {
87          saveToken();
88          searchLogPager.clear();
89          copyBeanToBean(form, searchLogPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
90          searchLogPager.setPageSize(form.getPageSize());
91          return asHtml(path_AdminSearchlog_AdminSearchlogJsp).renderWith(data -> {
92              searchPaging(data, form);
93          });
94      }
95  
96      @Execute
97      @Secured({ ROLE, ROLE + VIEW })
98      public HtmlResponse reset(final SearchForm form) {
99          saveToken();
100         searchLogPager.clear();
101         return asHtml(path_AdminSearchlog_AdminSearchlogJsp).renderWith(data -> {
102             searchPaging(data, form);
103         });
104     }
105 
106     @Execute
107     @Secured({ ROLE, ROLE + VIEW })
108     public HtmlResponse back(final SearchForm form) {
109         saveToken();
110         return asHtml(path_AdminSearchlog_AdminSearchlogJsp).renderWith(data -> {
111             searchPaging(data, form);
112         });
113     }
114 
115     protected void searchPaging(final RenderData data, final SearchForm form) {
116         RenderDataUtil.register(data, "searchLogItems", searchLogService.getSearchLogList(searchLogPager)); // page navi
117 
118         // restore from pager
119         copyBeanToBean(searchLogPager, form, op -> op.include(CONDITION_FIELDS));
120     }
121 
122     // ===================================================================================
123     //                                                                        Edit Execute
124     //                                                                        ============
125 
126     // -----------------------------------------------------
127     //                                               Details
128     //                                               -------
129     @Execute
130     @Secured({ ROLE, ROLE + VIEW })
131     public HtmlResponse details(final int crudMode, final String logType, final String id) {
132         verifyCrudMode(crudMode, CrudMode.DETAILS);
133         saveToken();
134         return asDetailsHtml().useForm(EditForm.class, op -> {
135             op.setup(form -> {
136                 form.id = id;
137                 form.logType = logType;
138                 form.crudMode = crudMode;
139             });
140         }).renderWith(data -> {
141             RenderDataUtil.register(data, "logParamItems", searchLogService.getSearchLogMap(logType, id));
142         });
143     }
144 
145     // -----------------------------------------------------
146     //                                         Actually Crud
147     //                                         -------------
148     @Execute
149     @Secured({ ROLE })
150     public HtmlResponse delete(final EditForm form) {
151         verifyCrudMode(form.crudMode, CrudMode.DETAILS);
152         validate(form, messages -> {}, this::asDetailsHtml);
153         verifyToken(this::asDetailsHtml);
154         searchLogService.getSearchLog(form.logType, form.id).alwaysPresent(e -> {
155             searchLogService.deleteSearchLog(e);
156             saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
157         });
158         return redirect(getClass());
159     }
160 
161     @Execute
162     @Secured({ ROLE })
163     public HtmlResponse deleteall() {
164         verifyToken(this::asListHtml);
165         searchLogPager.clear();
166         // TODO delete logs
167         saveInfo(messages -> messages.addSuccessCrawlingInfoDeleteAll(GLOBAL));
168         return redirect(getClass());
169     }
170 
171     // ===================================================================================
172     //                                                                        Assist Logic
173     //                                                                        ============
174 
175     // ===================================================================================
176     //                                                                        Small Helper
177     //                                                                        ============
178     protected void verifyCrudMode(final int crudMode, final int expectedMode) {
179         if (crudMode != expectedMode) {
180             throwValidationError(messages -> {
181                 messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
182             }, this::asListHtml);
183         }
184     }
185 
186     // ===================================================================================
187     //                                                                              JSP
188     //                                                                           =========
189 
190     private HtmlResponse asListHtml() {
191         return asHtml(path_AdminSearchlog_AdminSearchlogJsp).renderWith(data -> {
192             RenderDataUtil.register(data, "searchLogItems", searchLogService.getSearchLogList(searchLogPager)); // page navi
193         }).useForm(SearchForm.class, setup -> {
194             setup.setup(form -> {
195                 copyBeanToBean(searchLogPager, form, op -> op.include(CONDITION_FIELDS));
196             });
197         });
198     }
199 
200     private HtmlResponse asDetailsHtml() {
201         return asHtml(path_AdminSearchlog_AdminSearchlogDetailsJsp);
202     }
203 }