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.reqheader;
17  
18  import java.util.ArrayList;
19  import java.util.HashMap;
20  import java.util.List;
21  import java.util.Map;
22  
23  import javax.annotation.Resource;
24  
25  import org.codelibs.fess.Constants;
26  import org.codelibs.fess.app.pager.ReqHeaderPager;
27  import org.codelibs.fess.app.service.RequestHeaderService;
28  import org.codelibs.fess.app.service.WebConfigService;
29  import org.codelibs.fess.app.web.CrudMode;
30  import org.codelibs.fess.app.web.base.FessAdminAction;
31  import org.codelibs.fess.es.config.exentity.RequestHeader;
32  import org.codelibs.fess.es.config.exentity.WebConfig;
33  import org.codelibs.fess.helper.SystemHelper;
34  import org.codelibs.fess.util.ComponentUtil;
35  import org.codelibs.fess.util.RenderDataUtil;
36  import org.dbflute.optional.OptionalEntity;
37  import org.dbflute.optional.OptionalThing;
38  import org.lastaflute.web.Execute;
39  import org.lastaflute.web.response.HtmlResponse;
40  import org.lastaflute.web.response.render.RenderData;
41  import org.lastaflute.web.ruts.process.ActionRuntime;
42  
43  /**
44   * @author shinsuke
45   * @author Shunji Makino
46   * @author Keiichi Watanabe
47   */
48  public class AdminReqheaderAction extends FessAdminAction {
49  
50      // ===================================================================================
51      //                                                                           Attribute
52      //                                                                           =========
53      @Resource
54      private RequestHeaderService requestHeaderService;
55      @Resource
56      private ReqHeaderPager reqHeaderPager;
57      @Resource
58      protected WebConfigService webConfigService;
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.getOnlineHelpNameReqheader()));
67      }
68  
69      // ===================================================================================
70      //                                                                      Search Execute
71      //                                                                      ==============
72      @Execute
73      public HtmlResponse index(final SearchForm form) {
74          return asListHtml();
75      }
76  
77      @Execute
78      public HtmlResponse list(final OptionalThing<Integer> pageNumber, final SearchForm form) {
79          pageNumber.ifPresent(num -> {
80              reqHeaderPager.setCurrentPageNumber(pageNumber.get());
81          }).orElse(() -> {
82              reqHeaderPager.setCurrentPageNumber(0);
83          });
84          return asHtml(path_AdminReqheader_AdminReqheaderJsp).renderWith(data -> {
85              searchPaging(data, form);
86          });
87      }
88  
89      @Execute
90      public HtmlResponse search(final SearchForm form) {
91          copyBeanToBean(form, reqHeaderPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
92          return asHtml(path_AdminReqheader_AdminReqheaderJsp).renderWith(data -> {
93              searchPaging(data, form);
94          });
95      }
96  
97      @Execute
98      public HtmlResponse reset(final SearchForm form) {
99          reqHeaderPager.clear();
100         return asHtml(path_AdminReqheader_AdminReqheaderJsp).renderWith(data -> {
101             searchPaging(data, form);
102         });
103     }
104 
105     protected void searchPaging(final RenderData data, final SearchForm form) {
106         RenderDataUtil.register(data, "requestHeaderItems", requestHeaderService.getRequestHeaderList(reqHeaderPager)); // page navi
107         RenderDataUtil.register(data, "displayCreateLink", !webConfigService.getAllWebConfigList(false, false, false, null).isEmpty());
108 
109         // restore from pager
110         copyBeanToBean(reqHeaderPager, form, op -> op.include("id"));
111     }
112 
113     // ===================================================================================
114     //                                                                        Edit Execute
115     //                                                                        ============
116     // -----------------------------------------------------
117     //                                            Entry Page
118     //                                            ----------
119     @Execute
120     public HtmlResponse createnew() {
121         saveToken();
122         return asHtml(path_AdminReqheader_AdminReqheaderEditJsp).useForm(CreateForm.class, op -> {
123             op.setup(form -> {
124                 form.initialize();
125                 form.crudMode = CrudMode.CREATE;
126             });
127         }).renderWith(data -> {
128             registerWebConfigItems(data);
129         });
130     }
131 
132     @Execute
133     public HtmlResponse edit(final EditForm form) {
134         validate(form, messages -> {}, () -> asListHtml());
135         final String id = form.id;
136         requestHeaderService.getRequestHeader(id).ifPresent(entity -> {
137             copyBeanToBean(entity, form, op -> {});
138         }).orElse(() -> {
139             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), () -> asListHtml());
140         });
141         saveToken();
142         if (form.crudMode.intValue() == CrudMode.EDIT) {
143             // back
144             form.crudMode = CrudMode.DETAILS;
145             return asDetailsHtml();
146         } else {
147             form.crudMode = CrudMode.EDIT;
148             return asEditHtml();
149         }
150     }
151 
152     // -----------------------------------------------------
153     //                                               Details
154     //                                               -------
155     @Execute
156     public HtmlResponse details(final int crudMode, final String id) {
157         verifyCrudMode(crudMode, CrudMode.DETAILS);
158         saveToken();
159         return asDetailsHtml().useForm(EditForm.class, op -> {
160             op.setup(form -> {
161                 requestHeaderService.getRequestHeader(id).ifPresent(entity -> {
162                     copyBeanToBean(entity, form, copyOp -> {
163                         copyOp.excludeNull();
164                     });
165                     form.crudMode = crudMode;
166                 }).orElse(() -> {
167                     throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), () -> asListHtml());
168                 });
169             });
170         });
171     }
172 
173     // -----------------------------------------------------
174     //                                         Actually Crud
175     //                                         -------------
176     @Execute
177     public HtmlResponse create(final CreateForm form) {
178         verifyCrudMode(form.crudMode, CrudMode.CREATE);
179         validate(form, messages -> {}, () -> asEditHtml());
180         verifyToken(() -> asEditHtml());
181         getRequestHeader(form).ifPresent(
182                 entity -> {
183                     try {
184                         requestHeaderService.store(entity);
185                         saveInfo(messages -> messages.addSuccessCrudCreateCrudTable(GLOBAL));
186                     } catch (final Exception e) {
187                         throwValidationError(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)),
188                                 () -> asEditHtml());
189                     }
190                 }).orElse(() -> {
191             throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml());
192         });
193         return redirect(getClass());
194     }
195 
196     @Execute
197     public HtmlResponse update(final EditForm form) {
198         verifyCrudMode(form.crudMode, CrudMode.EDIT);
199         validate(form, messages -> {}, () -> asEditHtml());
200         verifyToken(() -> asEditHtml());
201         getRequestHeader(form).ifPresent(
202                 entity -> {
203                     try {
204                         requestHeaderService.store(entity);
205                         saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL));
206                     } catch (final Exception e) {
207                         throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)),
208                                 () -> asEditHtml());
209                     }
210                 }).orElse(() -> {
211             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.id), () -> asEditHtml());
212         });
213         return redirect(getClass());
214     }
215 
216     @Execute
217     public HtmlResponse delete(final EditForm form) {
218         verifyCrudMode(form.crudMode, CrudMode.DETAILS);
219         validate(form, messages -> {}, () -> asDetailsHtml());
220         verifyToken(() -> asDetailsHtml());
221         final String id = form.id;
222         requestHeaderService
223                 .getRequestHeader(id)
224                 .ifPresent(
225                         entity -> {
226                             try {
227                                 requestHeaderService.delete(entity);
228                                 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
229                             } catch (final Exception e) {
230                                 throwValidationError(
231                                         messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)),
232                                         () -> asEditHtml());
233                             }
234                         }).orElse(() -> {
235                     throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), () -> asDetailsHtml());
236                 });
237         return redirect(getClass());
238     }
239 
240     // ===================================================================================
241     //                                                                        Assist Logic
242     //                                                                        ============
243     public static OptionalEntity<RequestHeader> getEntity(final CreateForm form, final String username, final long currentTime) {
244         switch (form.crudMode) {
245         case CrudMode.CREATE:
246             return OptionalEntity.of(new RequestHeader()).map(entity -> {
247                 entity.setCreatedBy(username);
248                 entity.setCreatedTime(currentTime);
249                 return entity;
250             });
251         case CrudMode.EDIT:
252             if (form instanceof EditForm) {
253                 return ComponentUtil.getComponent(RequestHeaderService.class).getRequestHeader(((EditForm) form).id);
254             }
255             break;
256         default:
257             break;
258         }
259         return OptionalEntity.empty();
260     }
261 
262     public static OptionalEntity<RequestHeader> getRequestHeader(final CreateForm form) {
263         final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
264         final String username = systemHelper.getUsername();
265         final long currentTime = systemHelper.getCurrentTimeAsLong();
266         return getEntity(form, username, currentTime).map(entity -> {
267             entity.setUpdatedBy(username);
268             entity.setUpdatedTime(currentTime);
269             copyBeanToBean(form, entity, op -> op.exclude(Constants.COMMON_CONVERSION_RULE));
270             return entity;
271         });
272     }
273 
274     protected void registerWebConfigItems(final RenderData data) {
275         final List<Map<String, String>> itemList = new ArrayList<>();
276         final List<WebConfig> webConfigList = webConfigService.getAllWebConfigList(false, false, false, null);
277         for (final WebConfig webConfig : webConfigList) {
278             itemList.add(createItem(webConfig.getName(), webConfig.getId().toString()));
279         }
280         RenderDataUtil.register(data, "webConfigItems", itemList);
281     }
282 
283     protected Map<String, String> createItem(final String label, final String value) {
284         final Map<String, String> map = new HashMap<>(2);
285         map.put(Constants.ITEM_LABEL, label);
286         map.put(Constants.ITEM_VALUE, value);
287         return map;
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             }, () -> asListHtml());
298         }
299     }
300 
301     // ===================================================================================
302     //                                                                              JSP
303     //                                                                           =========
304 
305     private HtmlResponse asListHtml() {
306         return asHtml(path_AdminReqheader_AdminReqheaderJsp).renderWith(data -> {
307             RenderDataUtil.register(data, "requestHeaderItems", requestHeaderService.getRequestHeaderList(reqHeaderPager)); // page navi
308                 RenderDataUtil.register(data, "displayCreateLink", !webConfigService.getAllWebConfigList(false, false, false, null)
309                         .isEmpty());
310             }).useForm(SearchForm.class, setup -> {
311             setup.setup(form -> {
312                 copyBeanToBean(reqHeaderPager, form, op -> op.include("id"));
313             });
314         });
315     }
316 
317     private HtmlResponse asEditHtml() {
318         return asHtml(path_AdminReqheader_AdminReqheaderEditJsp).renderWith(data -> {
319             registerWebConfigItems(data);
320         });
321     }
322 
323     private HtmlResponse asDetailsHtml() {
324         return asHtml(path_AdminReqheader_AdminReqheaderDetailsJsp).renderWith(data -> {
325             registerWebConfigItems(data);
326         });
327     }
328 }