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