1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.web.admin.dict.stemmeroverride;
17
18 import java.io.File;
19 import java.io.IOException;
20 import java.io.InputStream;
21
22 import org.apache.logging.log4j.LogManager;
23 import org.apache.logging.log4j.Logger;
24 import org.codelibs.core.beans.util.BeanUtil;
25 import org.codelibs.core.lang.StringUtil;
26 import org.codelibs.fess.Constants;
27 import org.codelibs.fess.annotation.Secured;
28 import org.codelibs.fess.app.pager.StemmerOverridePager;
29 import org.codelibs.fess.app.service.StemmerOverrideService;
30 import org.codelibs.fess.app.web.CrudMode;
31 import org.codelibs.fess.app.web.admin.dict.AdminDictAction;
32 import org.codelibs.fess.app.web.base.FessAdminAction;
33 import org.codelibs.fess.app.web.base.FessBaseAction;
34 import org.codelibs.fess.dict.stemmeroverride.StemmerOverrideItem;
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.ActionResponse;
41 import org.lastaflute.web.response.HtmlResponse;
42 import org.lastaflute.web.response.render.RenderData;
43 import org.lastaflute.web.ruts.process.ActionRuntime;
44 import org.lastaflute.web.validation.VaErrorHook;
45 import org.lastaflute.web.validation.exception.ValidationErrorException;
46
47 import jakarta.annotation.Resource;
48
49
50
51
52
53 public class AdminDictStemmeroverrideAction extends FessAdminAction {
54
55
56
57
58 public AdminDictStemmeroverrideAction() {
59 super();
60 }
61
62
63
64
65 public static final String ROLE = "admin-dict";
66
67 private static final Logger logger = LogManager.getLogger(AdminDictStemmeroverrideAction.class);
68
69
70
71
72 @Resource
73 private StemmerOverrideService stemmerOverrideService;
74 @Resource
75 private StemmerOverridePager stemmerOverridePager;
76
77
78
79
80 @Override
81 protected void setupHtmlData(final ActionRuntime runtime) {
82 super.setupHtmlData(runtime);
83 runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameDictStemmeroverride()));
84 }
85
86 @Override
87 protected String getActionRole() {
88 return ROLE;
89 }
90
91
92
93
94
95
96
97
98
99
100
101 @Execute
102 @Secured({ ROLE, ROLE + VIEW })
103 public HtmlResponse index(final SearchForm form) {
104 validate(form, messages -> {}, this::asDictIndexHtml);
105 stemmerOverridePager.clear();
106 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideJsp).renderWith(data -> {
107 searchPaging(data, form);
108 });
109 }
110
111
112
113
114
115
116
117
118
119 @Execute
120 @Secured({ ROLE, ROLE + VIEW })
121 public HtmlResponse list(final OptionalThing<Integer> pageNumber, final SearchForm form) {
122 validate(form, messages -> {}, this::asDictIndexHtml);
123 pageNumber.ifPresent(num -> {
124 stemmerOverridePager.setCurrentPageNumber(pageNumber.get());
125 }).orElse(() -> {
126 stemmerOverridePager.setCurrentPageNumber(0);
127 });
128 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideJsp).renderWith(data -> {
129 searchPaging(data, form);
130 });
131 }
132
133
134
135
136
137
138
139
140 @Execute
141 @Secured({ ROLE, ROLE + VIEW })
142 public HtmlResponse search(final SearchForm form) {
143 validate(form, messages -> {}, this::asDictIndexHtml);
144 copyBeanToBean(form, stemmerOverridePager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
145 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideJsp).renderWith(data -> {
146 searchPaging(data, form);
147 });
148 }
149
150
151
152
153
154
155
156
157 @Execute
158 @Secured({ ROLE, ROLE + VIEW })
159 public HtmlResponse reset(final SearchForm form) {
160 validate(form, messages -> {}, this::asDictIndexHtml);
161 stemmerOverridePager.clear();
162 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideJsp).renderWith(data -> {
163 searchPaging(data, form);
164 });
165 }
166
167
168
169
170
171
172
173
174 protected void searchPaging(final RenderData data, final SearchForm form) {
175
176 RenderDataUtil.register(data, "stemmerOverrideItemItems",
177 stemmerOverrideService.getStemmerOverrideList(form.dictId, stemmerOverridePager));
178
179
180 BeanUtil.copyBeanToBean(stemmerOverridePager, form, op -> {
181 op.exclude(Constants.PAGER_CONVERSION_RULE);
182 });
183 }
184
185
186
187
188
189
190
191
192
193
194
195
196 @Execute
197 @Secured({ ROLE })
198 public HtmlResponse createnew(final String dictId) {
199 saveToken();
200 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideEditJsp).useForm(CreateForm.class, op -> {
201 op.setup(form -> {
202 form.initialize();
203 form.crudMode = CrudMode.CREATE;
204 form.dictId = dictId;
205 });
206 });
207 }
208
209
210
211
212
213
214
215
216 @Execute
217 @Secured({ ROLE })
218 public HtmlResponse edit(final EditForm form) {
219 validate(form, messages -> {}, () -> asListHtml(form.dictId));
220 stemmerOverrideService.getStemmerOverrideItem(form.dictId, form.id).ifPresent(entity -> {
221 form.input = entity.getInput();
222 form.output = entity.getOutput();
223 }).orElse(() -> {
224 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.getDisplayId()),
225 () -> asListHtml(form.dictId));
226 });
227 saveToken();
228 if (form.crudMode.intValue() == CrudMode.EDIT) {
229
230 form.crudMode = CrudMode.DETAILS;
231 return asDetailsHtml();
232 }
233 form.crudMode = CrudMode.EDIT;
234 return asEditHtml();
235 }
236
237
238
239
240
241
242
243
244
245
246
247
248
249 @Execute
250 @Secured({ ROLE, ROLE + VIEW })
251 public HtmlResponse details(final String dictId, final int crudMode, final long id) {
252 verifyCrudMode(crudMode, CrudMode.DETAILS, dictId);
253 saveToken();
254 return asDetailsHtml().useForm(EditForm.class, op -> {
255 op.setup(form -> {
256 stemmerOverrideService.getStemmerOverrideItem(dictId, id).ifPresent(entity -> {
257 form.input = entity.getInput();
258 form.output = entity.getOutput();
259 }).orElse(() -> {
260 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, dictId + ":" + id),
261 () -> asListHtml(dictId));
262 });
263 form.id = id;
264 form.crudMode = crudMode;
265 form.dictId = dictId;
266 });
267 });
268 }
269
270
271
272
273
274
275
276
277
278
279
280 @Execute
281 @Secured({ ROLE, ROLE + VIEW })
282 public HtmlResponse downloadpage(final String dictId) {
283 saveToken();
284 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideDownloadJsp).useForm(DownloadForm.class, op -> {
285 op.setup(form -> {
286 form.dictId = dictId;
287 });
288 }).renderWith(data -> {
289 stemmerOverrideService.getStemmerOverrideFile(dictId).ifPresent(file -> {
290 RenderDataUtil.register(data, "path", file.getPath());
291 }).orElse(() -> {
292 throwValidationError(messages -> messages.addErrorsFailedToDownloadStemmeroverrideFile(GLOBAL), this::asDictIndexHtml);
293 });
294 });
295 }
296
297
298
299
300
301
302
303
304 @Execute
305 @Secured({ ROLE, ROLE + VIEW })
306 public ActionResponse download(final DownloadForm form) {
307 validate(form, messages -> {}, () -> downloadpage(form.dictId));
308 verifyTokenKeep(() -> downloadpage(form.dictId));
309 return stemmerOverrideService.getStemmerOverrideFile(form.dictId)
310 .map(file -> asStream(new File(file.getPath()).getName()).contentTypeOctetStream().stream(out -> {
311 file.writeOut(out);
312 }))
313 .orElseGet(() -> {
314 throwValidationError(messages -> messages.addErrorsFailedToDownloadStemmeroverrideFile(GLOBAL),
315 () -> downloadpage(form.dictId));
316 return null;
317 });
318 }
319
320
321
322
323
324
325
326
327
328
329
330 @Execute
331 @Secured({ ROLE })
332 public HtmlResponse uploadpage(final String dictId) {
333 saveToken();
334 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideUploadJsp).useForm(UploadForm.class, op -> {
335 op.setup(form -> {
336 form.dictId = dictId;
337 });
338 }).renderWith(data -> {
339 stemmerOverrideService.getStemmerOverrideFile(dictId).ifPresent(file -> {
340 RenderDataUtil.register(data, "path", file.getPath());
341 }).orElse(() -> {
342 throwValidationError(messages -> messages.addErrorsFailedToDownloadStemmeroverrideFile(GLOBAL), this::asDictIndexHtml);
343 });
344 });
345 }
346
347
348
349
350
351
352
353
354 @Execute
355 @Secured({ ROLE })
356 public HtmlResponse upload(final UploadForm form) {
357 validate(form, messages -> {}, () -> uploadpage(form.dictId));
358 verifyToken(() -> uploadpage(form.dictId));
359 return stemmerOverrideService.getStemmerOverrideFile(form.dictId).map(file -> {
360 try (InputStream inputStream = form.stemmerOverrideFile.getInputStream()) {
361 file.update(inputStream);
362 } catch (final IOException e) {
363 logger.warn("Failed to process a request.", e);
364 throwValidationError(messages -> messages.addErrorsFailedToUploadStemmeroverrideFile(GLOBAL),
365 () -> redirectWith(getClass(), moreUrl("uploadpage/" + form.dictId)));
366 }
367 saveInfo(messages -> messages.addSuccessUploadStemmeroverrideFile(GLOBAL));
368 return redirectWith(getClass(), moreUrl("list/1").params("dictId", form.dictId));
369 }).orElseGet(() -> {
370 throwValidationError(messages -> messages.addErrorsFailedToUploadStemmeroverrideFile(GLOBAL), () -> uploadpage(form.dictId));
371 return null;
372 });
373
374 }
375
376
377
378
379
380
381
382
383
384 @Execute
385 @Secured({ ROLE })
386 public HtmlResponse create(final CreateForm form) {
387 verifyCrudMode(form.crudMode, CrudMode.CREATE, form.dictId);
388 validate(form, messages -> {}, this::asEditHtml);
389 verifyToken(this::asEditHtml);
390 createStemmerOverrideItem(form, this::asEditHtml).ifPresent(entity -> {
391 try {
392 stemmerOverrideService.store(form.dictId, entity);
393 saveInfo(messages -> messages.addSuccessCrudCreateCrudTable(GLOBAL));
394 } catch (final Exception e) {
395 logger.warn("Failed to process a request.", e);
396 throwValidationError(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)),
397 this::asEditHtml);
398 }
399 }).orElse(() -> {
400 throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), this::asEditHtml);
401 });
402 return redirectWith(getClass(), moreUrl("list/1").params("dictId", form.dictId));
403 }
404
405
406
407
408
409
410
411
412 @Execute
413 @Secured({ ROLE })
414 public HtmlResponse update(final EditForm form) {
415 verifyCrudMode(form.crudMode, CrudMode.EDIT, form.dictId);
416 validate(form, messages -> {}, this::asEditHtml);
417 verifyToken(this::asEditHtml);
418 createStemmerOverrideItem(form, this::asEditHtml).ifPresent(entity -> {
419 try {
420 stemmerOverrideService.store(form.dictId, entity);
421 saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL));
422 } catch (final Exception e) {
423 logger.warn("Failed to process a request.", e);
424 throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)),
425 this::asEditHtml);
426 }
427 }).orElse(() -> {
428 saveToken();
429 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.getDisplayId()), this::asEditHtml);
430 });
431 return redirectWith(getClass(), moreUrl("list/1").params("dictId", form.dictId));
432 }
433
434
435
436
437
438
439
440
441 @Execute
442 @Secured({ ROLE })
443 public HtmlResponse delete(final EditForm form) {
444 verifyCrudMode(form.crudMode, CrudMode.DETAILS, form.dictId);
445 validate(form, messages -> {}, this::asDetailsHtml);
446 verifyToken(this::asDetailsHtml);
447 stemmerOverrideService.getStemmerOverrideItem(form.dictId, form.id).ifPresent(entity -> {
448 try {
449 stemmerOverrideService.delete(form.dictId, entity);
450 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
451 } catch (final Exception e) {
452 logger.warn("Failed to process a request.", e);
453 throwValidationError(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)),
454 this::asEditHtml);
455 }
456 }).orElse(() -> {
457 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.getDisplayId()), this::asDetailsHtml);
458 });
459 return redirectWith(getClass(), moreUrl("list/1").params("dictId", form.dictId));
460 }
461
462
463
464
465
466 private static OptionalEntity<StemmerOverrideItem> getEntity(final CreateForm form) {
467 switch (form.crudMode) {
468 case CrudMode.CREATE:
469 final StemmerOverrideItem entity = new StemmerOverrideItem(0, StringUtil.EMPTY, StringUtil.EMPTY);
470 return OptionalEntity.of(entity);
471 case CrudMode.EDIT:
472 if (form instanceof EditForm) {
473 return ComponentUtil.getComponent(StemmerOverrideService.class).getStemmerOverrideItem(form.dictId, ((EditForm) form).id);
474 }
475 break;
476 default:
477 break;
478 }
479 return OptionalEntity.empty();
480 }
481
482
483
484
485
486
487
488 protected OptionalEntity<StemmerOverrideItem> createStemmerOverrideItem(final CreateForm form, final VaErrorHook hook) {
489 try {
490 return createStemmerOverrideItem(this, form, hook);
491 } catch (final ValidationErrorException e) {
492 saveToken();
493 throw e;
494 }
495 }
496
497
498
499
500
501
502
503
504 public static OptionalEntity<StemmerOverrideItem> createStemmerOverrideItem(final FessBaseAction action, final CreateForm form,
505 final VaErrorHook hook) {
506 return getEntity(form).map(entity -> {
507 entity.setNewInput(form.input);
508 entity.setNewOutput(form.output);
509 return entity;
510 });
511 }
512
513
514
515
516
517
518
519
520
521
522
523
524 protected void verifyCrudMode(final int crudMode, final int expectedMode, final String dictId) {
525 if (crudMode != expectedMode) {
526 throwValidationError(messages -> {
527 messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
528 }, () -> asListHtml(dictId));
529 }
530 }
531
532
533
534
535
536
537
538
539
540 protected HtmlResponse asDictIndexHtml() {
541 return redirect(AdminDictAction.class);
542 }
543
544 private HtmlResponse asListHtml(final String dictId) {
545 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideJsp).renderWith(data -> {
546 RenderDataUtil.register(data, "stemmerOverrideItemItems",
547 stemmerOverrideService.getStemmerOverrideList(dictId, stemmerOverridePager));
548 }).useForm(SearchForm.class, setup -> {
549 setup.setup(form -> {
550 copyBeanToBean(stemmerOverridePager, form, op -> op.include("id"));
551 });
552 });
553 }
554
555 private HtmlResponse asEditHtml() {
556 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideEditJsp);
557 }
558
559 private HtmlResponse asDetailsHtml() {
560 return asHtml(path_AdminDictStemmeroverride_AdminDictStemmeroverrideDetailsJsp);
561 }
562
563 }