1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.web.admin.relatedquery;
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.beans.util.BeanUtil;
27 import org.codelibs.core.lang.StringUtil;
28 import org.codelibs.fess.Constants;
29 import org.codelibs.fess.annotation.Secured;
30 import org.codelibs.fess.app.pager.RelatedQueryPager;
31 import org.codelibs.fess.app.service.RelatedQueryService;
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.RelatedQuery;
35 import org.codelibs.fess.helper.SystemHelper;
36 import org.codelibs.fess.util.ComponentUtil;
37 import org.codelibs.fess.util.RenderDataUtil;
38 import org.dbflute.optional.OptionalEntity;
39 import org.dbflute.optional.OptionalThing;
40 import org.lastaflute.web.Execute;
41 import org.lastaflute.web.response.HtmlResponse;
42 import org.lastaflute.web.response.render.RenderData;
43 import org.lastaflute.web.ruts.process.ActionRuntime;
44
45
46
47
48 public class AdminRelatedqueryAction extends FessAdminAction {
49
50 public static final String ROLE = "admin-relatedquery";
51
52
53
54
55 @Resource
56 private RelatedQueryService relatedQueryService;
57 @Resource
58 private RelatedQueryPager relatedQueryPager;
59
60
61
62
63 @Override
64 protected void setupHtmlData(final ActionRuntime runtime) {
65 super.setupHtmlData(runtime);
66 runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameRelatedquery()));
67 }
68
69 @Override
70 protected String getActionRole() {
71 return ROLE;
72 }
73
74
75
76
77 @Execute
78 @Secured({ ROLE, ROLE + VIEW })
79 public HtmlResponse index() {
80 return asListHtml();
81 }
82
83 @Execute
84 @Secured({ ROLE, ROLE + VIEW })
85 public HtmlResponse list(final OptionalThing<Integer> pageNumber, final SearchForm form) {
86 pageNumber.ifPresent(num -> {
87 relatedQueryPager.setCurrentPageNumber(pageNumber.get());
88 }).orElse(() -> {
89 relatedQueryPager.setCurrentPageNumber(0);
90 });
91 return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
92 searchPaging(data, form);
93 });
94 }
95
96 @Execute
97 @Secured({ ROLE, ROLE + VIEW })
98 public HtmlResponse search(final SearchForm form) {
99 copyBeanToBean(form, relatedQueryPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
100 return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
101 searchPaging(data, form);
102 });
103 }
104
105 @Execute
106 @Secured({ ROLE, ROLE + VIEW })
107 public HtmlResponse reset(final SearchForm form) {
108 relatedQueryPager.clear();
109 return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
110 searchPaging(data, form);
111 });
112 }
113
114 protected void searchPaging(final RenderData data, final SearchForm form) {
115 RenderDataUtil.register(data, "relatedQueryItems", relatedQueryService.getRelatedQueryList(relatedQueryPager));
116
117
118 copyBeanToBean(relatedQueryPager, form, op -> op.include("term", "queries"));
119 }
120
121
122
123
124
125
126
127 @Execute
128 @Secured({ ROLE })
129 public HtmlResponse createnew() {
130 saveToken();
131 return asEditHtml().useForm(CreateForm.class, op -> {
132 op.setup(form -> {
133 form.initialize();
134 form.crudMode = CrudMode.CREATE;
135 });
136 });
137 }
138
139 @Execute
140 @Secured({ ROLE })
141 public HtmlResponse edit(final EditForm form) {
142 validate(form, messages -> {}, this::asListHtml);
143 final String id = form.id;
144 relatedQueryService.getRelatedQuery(id).ifPresent(entity -> {
145 copyBeanToBean(entity, form, copyOp -> {
146 copyOp.excludeNull();
147 copyOp.exclude(Constants.QUERIES);
148 });
149 form.queries =
150 stream(entity.getQueries()).get(stream -> stream.filter(StringUtil::isNotBlank).collect(Collectors.joining("\n")));
151 }).orElse(() -> {
152 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asListHtml);
153 });
154 saveToken();
155 if (form.crudMode.intValue() == CrudMode.EDIT) {
156
157 form.crudMode = CrudMode.DETAILS;
158 return asDetailsHtml();
159 }
160 form.crudMode = CrudMode.EDIT;
161 return asEditHtml();
162 }
163
164
165
166
167 @Execute
168 @Secured({ ROLE, ROLE + VIEW })
169 public HtmlResponse details(final int crudMode, final String id) {
170 verifyCrudMode(crudMode, CrudMode.DETAILS);
171 saveToken();
172 return asDetailsHtml().useForm(EditForm.class, op -> {
173 op.setup(form -> {
174 relatedQueryService.getRelatedQuery(id).ifPresent(entity -> {
175 copyBeanToBean(entity, form, copyOp -> {
176 copyOp.excludeNull();
177 copyOp.exclude(Constants.QUERIES);
178 });
179 form.queries = stream(entity.getQueries())
180 .get(stream -> stream.filter(StringUtil::isNotBlank).collect(Collectors.joining("\n")));
181 form.crudMode = crudMode;
182 }).orElse(() -> {
183 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asListHtml);
184 });
185 });
186 });
187 }
188
189
190
191
192 @Execute
193 @Secured({ ROLE })
194 public HtmlResponse create(final CreateForm form) {
195 verifyCrudMode(form.crudMode, CrudMode.CREATE);
196 validate(form, messages -> {}, this::asEditHtml);
197 verifyToken(this::asEditHtml);
198 getRelatedQuery(form).ifPresent(entity -> {
199 try {
200 relatedQueryService.store(entity);
201 saveInfo(messages -> messages.addSuccessCrudCreateCrudTable(GLOBAL));
202 } catch (final Exception e) {
203 throwValidationError(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)),
204 this::asEditHtml);
205 }
206 }).orElse(() -> {
207 throwValidationError(messages -> messages.addErrorsCrudFailedToCreateInstance(GLOBAL), this::asEditHtml);
208 });
209 return redirect(getClass());
210 }
211
212 @Execute
213 @Secured({ ROLE })
214 public HtmlResponse update(final EditForm form) {
215 verifyCrudMode(form.crudMode, CrudMode.EDIT);
216 validate(form, messages -> {}, this::asEditHtml);
217 verifyToken(this::asEditHtml);
218 getRelatedQuery(form).ifPresent(entity -> {
219 try {
220 relatedQueryService.store(entity);
221 saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL));
222 } catch (final Exception e) {
223 throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)),
224 this::asEditHtml);
225 }
226 }).orElse(() -> {
227 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.id), this::asEditHtml);
228 });
229 return redirect(getClass());
230 }
231
232 @Execute
233 @Secured({ ROLE })
234 public HtmlResponse delete(final EditForm form) {
235 verifyCrudMode(form.crudMode, CrudMode.DETAILS);
236 validate(form, messages -> {}, this::asDetailsHtml);
237 verifyToken(this::asDetailsHtml);
238 final String id = form.id;
239 relatedQueryService.getRelatedQuery(id).ifPresent(entity -> {
240 try {
241 relatedQueryService.delete(entity);
242 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
243 } catch (final Exception e) {
244 throwValidationError(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)),
245 this::asEditHtml);
246 }
247 }).orElse(() -> {
248 throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), this::asDetailsHtml);
249 });
250 return redirect(getClass());
251 }
252
253
254
255
256
257 private static OptionalEntity<RelatedQuery> getEntity(final CreateForm form, final String username, final long currentTime) {
258 switch (form.crudMode) {
259 case CrudMode.CREATE:
260 return OptionalEntity.of(new RelatedQuery()).map(entity -> {
261 entity.setCreatedBy(username);
262 entity.setCreatedTime(currentTime);
263 return entity;
264 });
265 case CrudMode.EDIT:
266 if (form instanceof EditForm) {
267 return ComponentUtil.getComponent(RelatedQueryService.class).getRelatedQuery(((EditForm) form).id);
268 }
269 break;
270 default:
271 break;
272 }
273 return OptionalEntity.empty();
274 }
275
276 public static OptionalEntity<RelatedQuery> getRelatedQuery(final CreateForm form) {
277 final SystemHelper systemHelper = ComponentUtil.getSystemHelper();
278 final String username = systemHelper.getUsername();
279 final long currentTime = systemHelper.getCurrentTimeAsLong();
280 return getEntity(form, username, currentTime).map(entity -> {
281 entity.setUpdatedBy(username);
282 entity.setUpdatedTime(currentTime);
283 BeanUtil.copyBeanToBean(form, entity, op -> op.exclude(
284 Stream.concat(Stream.of(Constants.COMMON_CONVERSION_RULE), Stream.of(Constants.QUERIES)).toArray(n -> new String[n])));
285 entity.setQueries(split(form.queries, "\n").get(stream -> stream.filter(StringUtil::isNotBlank).toArray(n -> new String[n])));
286 return entity;
287 });
288 }
289
290
291
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 }, this::asListHtml);
298 }
299 }
300
301
302
303
304
305 private HtmlResponse asListHtml() {
306 return asHtml(path_AdminRelatedquery_AdminRelatedqueryJsp).renderWith(data -> {
307 RenderDataUtil.register(data, "relatedQueryItems", relatedQueryService.getRelatedQueryList(relatedQueryPager));
308 }).useForm(SearchForm.class, setup -> {
309 setup.setup(form -> {
310 copyBeanToBean(relatedQueryPager, form, op -> op.include("term", "queries"));
311 });
312 });
313 }
314
315 private HtmlResponse asEditHtml() {
316 return asHtml(path_AdminRelatedquery_AdminRelatedqueryEditJsp);
317 }
318
319 private HtmlResponse asDetailsHtml() {
320 return asHtml(path_AdminRelatedquery_AdminRelatedqueryDetailsJsp);
321 }
322
323 }