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.relatedquery;
17  
18  import static org.codelibs.core.stream.StreamUtil.split;
19  import static org.codelibs.core.stream.StreamUtil.stream;
20  
21  import java.util.stream.Collectors;
22  import java.util.stream.Stream;
23  
24  import javax.annotation.Resource;
25  
26  import org.codelibs.core.beans.util.BeanUtil;
27  import org.codelibs.core.lang.StringUtil;
28  import org.codelibs.fess.Constants;
29  import org.codelibs.fess.annotation.Secured;
30  import org.codelibs.fess.app.pager.RelatedQueryPager;
31  import org.codelibs.fess.app.service.RelatedQueryService;
32  import org.codelibs.fess.app.web.CrudMode;
33  import org.codelibs.fess.app.web.base.FessAdminAction;
34  import org.codelibs.fess.es.config.exentity.RelatedQuery;
35  import org.codelibs.fess.helper.SystemHelper;
36  import org.codelibs.fess.util.ComponentUtil;
37  import org.codelibs.fess.util.RenderDataUtil;
38  import org.dbflute.optional.OptionalEntity;
39  import org.dbflute.optional.OptionalThing;
40  import org.lastaflute.web.Execute;
41  import org.lastaflute.web.response.HtmlResponse;
42  import org.lastaflute.web.response.render.RenderData;
43  import org.lastaflute.web.ruts.process.ActionRuntime;
44  
45  /**
46   * @author shinsuke
47   */
48  public class AdminRelatedqueryAction extends FessAdminAction {
49  
50      public static final String ROLE = "admin-relatedquery";
51  
52      // ===================================================================================
53      //                                                                           Attribute
54      //                                                                           =========
55      @Resource
56      private RelatedQueryService relatedQueryService;
57      @Resource
58      private RelatedQueryPager relatedQueryPager;
59  
60      // ===================================================================================
61      //                                                                               Hook
62      //                                                                              ======
63      @Override
64      protected void setupHtmlData(final ActionRuntime runtime) {
65          super.setupHtmlData(runtime);
66          runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameRelatedquery()));
67      }
68  
69      @Override
70      protected String getActionRole() {
71          return ROLE;
72      }
73  
74      // ===================================================================================
75      //                                                                      Search Execute
76      //                                                                      ==============
77      @Execute
78      @Secured({ ROLE, ROLE + VIEW })
79      public HtmlResponse index() {
80          return asListHtml();
81      }
82  
83      @Execute
84      @Secured({ ROLE, ROLE + VIEW })
85      public HtmlResponse list(final OptionalThing<Integer> pageNumber, final SearchForm form) {
86          pageNumber.ifPresent(num -> {
87              relatedQueryPager.setCurrentPageNumber(pageNumber.get());
88          }).orElse(() -> {
89              relatedQueryPager.setCurrentPageNumber(0);
90          });
91          return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
92              searchPaging(data, form);
93          });
94      }
95  
96      @Execute
97      @Secured({ ROLE, ROLE + VIEW })
98      public HtmlResponse search(final SearchForm form) {
99          copyBeanToBean(form, relatedQueryPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
100         return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
101             searchPaging(data, form);
102         });
103     }
104 
105     @Execute
106     @Secured({ ROLE, ROLE + VIEW })
107     public HtmlResponse reset(final SearchForm form) {
108         relatedQueryPager.clear();
109         return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
110             searchPaging(data, form);
111         });
112     }
113 
114     protected void searchPaging(final RenderData data, final SearchForm form) {
115         RenderDataUtil.register(data, "relatedQueryItems", relatedQueryService.getRelatedQueryList(relatedQueryPager)); // page navi
116 
117         // restore from pager
118         copyBeanToBean(relatedQueryPager, form, op -> op.include("term", "queries"));
119     }
120 
121     // ===================================================================================
122     //                                                                        Edit Execute
123     //                                                                        ============
124     // -----------------------------------------------------
125     //                                            Entry Page
126     //                                            ----------
127     @Execute
128     @Secured({ ROLE })
129     public HtmlResponse createnew() {
130         saveToken();
131         return asEditHtml().useForm(CreateForm.class, op -> {
132             op.setup(form -> {
133                 form.initialize();
134                 form.crudMode = CrudMode.CREATE;
135             });
136         });
137     }
138 
139     @Execute
140     @Secured({ ROLE })
141     public HtmlResponse edit(final EditForm form) {
142         validate(form, messages -> {}, this::asListHtml);
143         final String id = form.id;
144         relatedQueryService.getRelatedQuery(id).ifPresent(entity -> {
145             copyBeanToBean(entity, form, copyOp -> {
146                 copyOp.excludeNull();
147                 copyOp.exclude(Constants.QUERIES);
148             });
149             form.queries =
150                     stream(entity.getQueries()).get(stream -> stream.filter(StringUtil::isNotBlank).collect(Collectors.joining("\n")));
151         }).orElse(() -> {
152             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asListHtml);
153         });
154         saveToken();
155         if (form.crudMode.intValue() == CrudMode.EDIT) {
156             // back
157             form.crudMode = CrudMode.DETAILS;
158             return asDetailsHtml();
159         }
160         form.crudMode = CrudMode.EDIT;
161         return asEditHtml();
162     }
163 
164     // -----------------------------------------------------
165     //                                               Details
166     //                                               -------
167     @Execute
168     @Secured({ ROLE, ROLE + VIEW })
169     public HtmlResponse details(final int crudMode, final String id) {
170         verifyCrudMode(crudMode, CrudMode.DETAILS);
171         saveToken();
172         return asDetailsHtml().useForm(EditForm.class, op -> {
173             op.setup(form -> {
174                 relatedQueryService.getRelatedQuery(id).ifPresent(entity -> {
175                     copyBeanToBean(entity, form, copyOp -> {
176                         copyOp.excludeNull();
177                         copyOp.exclude(Constants.QUERIES);
178                     });
179                     form.queries = stream(entity.getQueries())
180                             .get(stream -> stream.filter(StringUtil::isNotBlank).collect(Collectors.joining("\n")));
181                     form.crudMode = crudMode;
182                 }).orElse(() -> {
183                     throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asListHtml);
184                 });
185             });
186         });
187     }
188 
189     // -----------------------------------------------------
190     //                                         Actually Crud
191     //                                         -------------
192     @Execute
193     @Secured({ ROLE })
194     public HtmlResponse create(final CreateForm form) {
195         verifyCrudMode(form.crudMode, CrudMode.CREATE);
196         validate(form, messages -> {}, this::asEditHtml);
197         verifyToken(this::asEditHtml);
198         getRelatedQuery(form).ifPresent(entity -> {
199             try {
200                 relatedQueryService.store(entity);
201                 saveInfo(messages -> messages.addSuccessCrudCreateCrudTable(GLOBAL));
202             } catch (final Exception e) {
203                 throwValidationError(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)),
204                         this::asEditHtml);
205             }
206         }).orElse(() -> {
207             throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), this::asEditHtml);
208         });
209         return redirect(getClass());
210     }
211 
212     @Execute
213     @Secured({ ROLE })
214     public HtmlResponse update(final EditForm form) {
215         verifyCrudMode(form.crudMode, CrudMode.EDIT);
216         validate(form, messages -> {}, this::asEditHtml);
217         verifyToken(this::asEditHtml);
218         getRelatedQuery(form).ifPresent(entity -> {
219             try {
220                 relatedQueryService.store(entity);
221                 saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL));
222             } catch (final Exception e) {
223                 throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)),
224                         this::asEditHtml);
225             }
226         }).orElse(() -> {
227             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.id), this::asEditHtml);
228         });
229         return redirect(getClass());
230     }
231 
232     @Execute
233     @Secured({ ROLE })
234     public HtmlResponse delete(final EditForm form) {
235         verifyCrudMode(form.crudMode, CrudMode.DETAILS);
236         validate(form, messages -> {}, this::asDetailsHtml);
237         verifyToken(this::asDetailsHtml);
238         final String id = form.id;
239         relatedQueryService.getRelatedQuery(id).ifPresent(entity -> {
240             try {
241                 relatedQueryService.delete(entity);
242                 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
243             } catch (final Exception e) {
244                 throwValidationError(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)),
245                         this::asEditHtml);
246             }
247         }).orElse(() -> {
248             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asDetailsHtml);
249         });
250         return redirect(getClass());
251     }
252 
253     // ===================================================================================
254     //                                                                        Assist Logic
255     //                                                                        ============
256 
257     private static OptionalEntity<RelatedQuery> getEntity(final CreateForm form, final String username, final long currentTime) {
258         switch (form.crudMode) {
259         case CrudMode.CREATE:
260             return OptionalEntity.of(new RelatedQuery()).map(entity -> {
261                 entity.setCreatedBy(username);
262                 entity.setCreatedTime(currentTime);
263                 return entity;
264             });
265         case CrudMode.EDIT:
266             if (form instanceof EditForm) {
267                 return ComponentUtil.getComponent(RelatedQueryService.class).getRelatedQuery(((EditForm) form).id);
268             }
269             break;
270         default:
271             break;
272         }
273         return OptionalEntity.empty();
274     }
275 
276     public static OptionalEntity<RelatedQuery> getRelatedQuery(final CreateForm form) {
277         final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
278         final String username = systemHelper.getUsername();
279         final long currentTime = systemHelper.getCurrentTimeAsLong();
280         return getEntity(form, username, currentTime).map(entity -> {
281             entity.setUpdatedBy(username);
282             entity.setUpdatedTime(currentTime);
283             BeanUtil.copyBeanToBean(form, entity, op -> op.exclude(
284                     Stream.concat(Stream.of(Constants.COMMON_CONVERSION_RULE), Stream.of(Constants.QUERIES)).toArray(n -> new String[n])));
285             entity.setQueries(split(form.queries, "\n").get(stream -> stream.filter(StringUtil::isNotBlank).toArray(n -> new String[n])));
286             return entity;
287         });
288     }
289 
290     // ===================================================================================
291     //                                                                        Small Helper
292     //                                                                        ============
293     protected void verifyCrudMode(final int crudMode, final int expectedMode) {
294         if (crudMode != expectedMode) {
295             throwValidationError(messages -> {
296                 messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
297             }, this::asListHtml);
298         }
299     }
300 
301     // ===================================================================================
302     //                                                                              JSP
303     //                                                                           =========
304 
305     private HtmlResponse asListHtml() {
306         return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
307             RenderDataUtil.register(data, "relatedQueryItems", relatedQueryService.getRelatedQueryList(relatedQueryPager));
308         }).useForm(SearchForm.class, setup -> {
309             setup.setup(form -> {
310                 copyBeanToBean(relatedQueryPager, form, op -> op.include("term", "queries"));
311             });
312         });
313     }
314 
315     private HtmlResponse asEditHtml() {
316         return asHtml(path_AdminRelatedquery_AdminRelatedqueryEditJsp);
317     }
318 
319     private HtmlResponse asDetailsHtml() {
320         return asHtml(path_AdminRelatedquery_AdminRelatedqueryDetailsJsp);
321     }
322 
323 }