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