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.group;
17  
18  import java.util.Base64;
19  
20  import javax.annotation.Resource;
21  
22  import org.codelibs.fess.Constants;
23  import org.codelibs.fess.app.pager.GroupPager;
24  import org.codelibs.fess.app.service.GroupService;
25  import org.codelibs.fess.app.web.CrudMode;
26  import org.codelibs.fess.app.web.base.FessAdminAction;
27  import org.codelibs.fess.es.user.exentity.Group;
28  import org.codelibs.fess.util.ComponentUtil;
29  import org.codelibs.fess.util.RenderDataUtil;
30  import org.dbflute.optional.OptionalEntity;
31  import org.dbflute.optional.OptionalThing;
32  import org.lastaflute.web.Execute;
33  import org.lastaflute.web.response.HtmlResponse;
34  import org.lastaflute.web.response.render.RenderData;
35  import org.lastaflute.web.ruts.process.ActionRuntime;
36  import org.slf4j.Logger;
37  import org.slf4j.LoggerFactory;
38  
39  /**
40   * @author shinsuke
41   * @author Keiichi Watanabe
42   */
43  public class AdminGroupAction extends FessAdminAction {
44  
45      private static final Logger logger = LoggerFactory.getLogger(AdminGroupAction.class);
46  
47      // ===================================================================================
48      //                                                                           Attribute
49      //                                                                           =========
50      @Resource
51      private GroupService groupService;
52      @Resource
53      private GroupPager groupPager;
54  
55      // ===================================================================================
56      //                                                                               Hook
57      //                                                                              ======
58      @Override
59      protected void setupHtmlData(final ActionRuntime runtime) {
60          super.setupHtmlData(runtime);
61          runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameGroup()));
62      }
63  
64      // ===================================================================================
65      //                                                                      Search Execute
66      //                                                                      ==============
67      @Execute
68      public HtmlResponse index() {
69          return asListHtml();
70      }
71  
72      @Execute
73      public HtmlResponse list(final OptionalThing<Integer> pageNumber, final SearchForm form) {
74          pageNumber.ifPresent(num -> {
75              groupPager.setCurrentPageNumber(pageNumber.get());
76          }).orElse(() -> {
77              groupPager.setCurrentPageNumber(0);
78          });
79          return asHtml(path_AdminGroup_AdminGroupJsp).renderWith(data -> {
80              searchPaging(data, form);
81          });
82      }
83  
84      @Execute
85      public HtmlResponse search(final SearchForm form) {
86          copyBeanToBean(form, groupPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
87          return asHtml(path_AdminGroup_AdminGroupJsp).renderWith(data -> {
88              searchPaging(data, form);
89          });
90      }
91  
92      @Execute
93      public HtmlResponse reset(final SearchForm form) {
94          groupPager.clear();
95          return asHtml(path_AdminGroup_AdminGroupJsp).renderWith(data -> {
96              searchPaging(data, form);
97          });
98      }
99  
100     protected void searchPaging(final RenderData data, final SearchForm form) {
101         RenderDataUtil.register(data, "groupItems", groupService.getGroupList(groupPager)); // page navi
102 
103         // restore from pager
104         copyBeanToBean(groupPager, form, op -> op.include("id"));
105     }
106 
107     // ===================================================================================
108     //                                                                        Edit Execute
109     //                                                                        ============
110     // -----------------------------------------------------
111     //                                            Entry Page
112     //                                            ----------
113     @Execute
114     public HtmlResponse createnew() {
115         saveToken();
116         return asHtml(path_AdminGroup_AdminGroupEditJsp).useForm(CreateForm.class, op -> {
117             op.setup(form -> {
118                 form.initialize();
119                 form.crudMode = CrudMode.CREATE;
120             });
121         });
122     }
123 
124     @Execute
125     public HtmlResponse edit(final EditForm form) {
126         validate(form, messages -> {}, () -> asListHtml());
127         final String id = form.id;
128         groupService.getGroup(id).ifPresent(entity -> {
129             copyBeanToBean(entity, form, op -> {});
130         }).orElse(() -> {
131             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), () -> asListHtml());
132         });
133         saveToken();
134         if (form.crudMode.intValue() == CrudMode.EDIT) {
135             // back
136             form.crudMode = CrudMode.DETAILS;
137             return asDetailsHtml();
138         } else {
139             form.crudMode = CrudMode.EDIT;
140             return asEditHtml();
141         }
142     }
143 
144     // -----------------------------------------------------
145     //                                               Details
146     //                                               -------
147     @Execute
148     public HtmlResponse details(final int crudMode, final String id) {
149         verifyCrudMode(crudMode, CrudMode.DETAILS);
150         saveToken();
151         return asHtml(path_AdminGroup_AdminGroupDetailsJsp).useForm(EditForm.class, op -> {
152             op.setup(form -> {
153                 groupService.getGroup(id).ifPresent(entity -> {
154                     copyBeanToBean(entity, form, copyOp -> {
155                         copyOp.excludeNull();
156                     });
157                     form.crudMode = crudMode;
158                 }).orElse(() -> {
159                     throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), () -> asListHtml());
160                 });
161             });
162         });
163     }
164 
165     // -----------------------------------------------------
166     //                                         Actually Crud
167     //                                         -------------
168     @Execute
169     public HtmlResponse create(final CreateForm form) {
170         verifyCrudMode(form.crudMode, CrudMode.CREATE);
171         validate(form, messages -> {}, () -> asEditHtml());
172         verifyToken(() -> asEditHtml());
173         getGroup(form).ifPresent(
174                 entity -> {
175                     try {
176                         groupService.store(entity);
177                         saveInfo(messages -> messages.addSuccessCrudCreateCrudTable(GLOBAL));
178                     } catch (final Exception e) {
179                         logger.error("Failed to add " + entity, e);
180                         throwValidationError(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)),
181                                 () -> asEditHtml());
182                     }
183                 }).orElse(() -> {
184             throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), () -> asEditHtml());
185         });
186         return redirect(getClass());
187     }
188 
189     @Execute
190     public HtmlResponse update(final EditForm form) {
191         verifyCrudMode(form.crudMode, CrudMode.EDIT);
192         validate(form, messages -> {}, () -> asEditHtml());
193         verifyToken(() -> asEditHtml());
194         getGroup(form).ifPresent(
195                 entity -> {
196                     try {
197                         groupService.store(entity);
198                         saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL));
199                     } catch (final Exception e) {
200                         logger.error("Failed to update " + entity, e);
201                         throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)),
202                                 () -> asEditHtml());
203                     }
204                 }).orElse(() -> {
205             throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.id), () -> asEditHtml());
206         });
207         return redirect(getClass());
208     }
209 
210     @Execute
211     public HtmlResponse delete(final EditForm form) {
212         verifyCrudMode(form.crudMode, CrudMode.DETAILS);
213         validate(form, messages -> {}, () -> asDetailsHtml());
214         verifyToken(() -> asDetailsHtml());
215         final String id = form.id;
216         groupService
217                 .getGroup(id)
218                 .ifPresent(
219                         entity -> {
220                             try {
221                                 groupService.delete(entity);
222                                 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
223                             } catch (final Exception e) {
224                                 logger.error("Failed to delete " + entity, e);
225                                 throwValidationError(
226                                         messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)),
227                                         () -> asDetailsHtml());
228                             }
229                         }).orElse(() -> {
230                     throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), () -> asDetailsHtml());
231                 });
232         return redirect(getClass());
233     }
234 
235     // ===================================================================================
236     //                                                                        Assist Logic
237     //                                                                        ============
238     private static OptionalEntity<Group> getEntity(final CreateForm form) {
239         switch (form.crudMode) {
240         case CrudMode.CREATE:
241             return OptionalEntity.of(new Group()).map(entity -> {
242                 entity.setId(Base64.getUrlEncoder().encodeToString(form.name.getBytes(Constants.CHARSET_UTF_8)));
243                 return entity;
244             });
245         case CrudMode.EDIT:
246             if (form instanceof EditForm) {
247                 return ComponentUtil.getComponent(GroupService.class).getGroup(((EditForm) form).id);
248             }
249             break;
250         default:
251             break;
252         }
253         return OptionalEntity.empty();
254     }
255 
256     public static OptionalEntity<Group> getGroup(final CreateForm form) {
257         return getEntity(form).map(entity -> {
258             copyBeanToBean(form, entity, op -> op.exclude(Constants.COMMON_CONVERSION_RULE));
259             return entity;
260         });
261     }
262 
263     // ===================================================================================
264     //                                                                        Small Helper
265     //                                                                        ============
266     protected void verifyCrudMode(final int crudMode, final int expectedMode) {
267         if (crudMode != expectedMode) {
268             throwValidationError(messages -> {
269                 messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
270             }, () -> asListHtml());
271         }
272     }
273 
274     // ===================================================================================
275     //                                                                              JSP
276     //                                                                           =========
277 
278     private HtmlResponse asListHtml() {
279         return asHtml(path_AdminGroup_AdminGroupJsp).renderWith(data -> {
280             RenderDataUtil.register(data, "groupItems", groupService.getGroupList(groupPager)); // page navi
281             }).useForm(SearchForm.class, setup -> {
282             setup.setup(form -> {
283                 copyBeanToBean(groupPager, form, op -> op.include("id"));
284             });
285         });
286     }
287 
288     private HtmlResponse asEditHtml() {
289         return asHtml(path_AdminGroup_AdminGroupEditJsp);
290     }
291 
292     private HtmlResponse asDetailsHtml() {
293         return asHtml(path_AdminGroup_AdminGroupDetailsJsp);
294     }
295 }