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