1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.codelibs.fess.app.web.api.admin.elevateword;
17
18 import static org.codelibs.core.stream.StreamUtil.stream;
19 import static org.codelibs.fess.app.web.admin.elevateword.AdminElevatewordAction.getElevateWord;
20
21 import java.io.BufferedReader;
22 import java.io.BufferedWriter;
23 import java.io.InputStream;
24 import java.io.InputStreamReader;
25 import java.io.OutputStreamWriter;
26 import java.io.Reader;
27 import java.io.Writer;
28 import java.nio.file.Files;
29 import java.nio.file.Path;
30 import java.util.List;
31 import java.util.stream.Collectors;
32
33 import javax.annotation.Resource;
34
35 import org.codelibs.core.concurrent.CommonPoolUtil;
36 import org.codelibs.core.lang.StringUtil;
37 import org.codelibs.fess.Constants;
38 import org.codelibs.fess.app.pager.ElevateWordPager;
39 import org.codelibs.fess.app.service.ElevateWordService;
40 import org.codelibs.fess.app.web.CrudMode;
41 import org.codelibs.fess.app.web.admin.elevateword.UploadForm;
42 import org.codelibs.fess.app.web.api.ApiResult;
43 import org.codelibs.fess.app.web.api.ApiResult.ApiUpdateResponse;
44 import org.codelibs.fess.app.web.api.ApiResult.Status;
45 import org.codelibs.fess.app.web.api.admin.FessApiAdminAction;
46 import org.codelibs.fess.es.config.exentity.ElevateWord;
47 import org.codelibs.fess.exception.FessSystemException;
48 import org.codelibs.fess.helper.PermissionHelper;
49 import org.codelibs.fess.helper.SuggestHelper;
50 import org.codelibs.fess.util.ComponentUtil;
51 import org.lastaflute.web.Execute;
52 import org.lastaflute.web.response.JsonResponse;
53 import org.lastaflute.web.response.StreamResponse;
54
55 public class ApiAdminElevatewordAction extends FessApiAdminAction {
56
57 @Resource
58 private ElevateWordService elevateWordService;
59
60 @Resource
61 protected SuggestHelper suggestHelper;
62
63
64
65 @Execute
66 public JsonResponse<ApiResult> settings(final SearchBody body) {
67 validateApi(body, messages -> {});
68 final ElevateWordPager pager = copyBeanToNewBean(body, ElevateWordPager.class);
69 final List<ElevateWord> list = elevateWordService.getElevateWordList(pager);
70 return asJson(
71 new ApiResult.ApiConfigsResponse<EditBody>().settings(list.stream().map(this::createEditBody).collect(Collectors.toList()))
72 .total(pager.getAllRecordCount()).status(ApiResult.Status.OK).result());
73 }
74
75
76 @Execute
77 public JsonResponse<ApiResult> get$setting(final String id) {
78
79 final ElevateWord entity = elevateWordService.getElevateWord(id).orElseGet(() -> {
80 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
81 return null;
82 });
83
84 final EditBody body = createEditBody(entity);
85 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
86 body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
87 .filter(StringUtil::isNotBlank).distinct().collect(Collectors.joining("\n")));
88 return asJson(new ApiResult.ApiConfigResponse().setting(body).status(ApiResult.Status.OK).result());
89 }
90
91
92 @Execute
93 public JsonResponse<ApiResult> put$setting(final CreateBody body) {
94 validateApi(body, messages -> {});
95 body.crudMode = CrudMode.CREATE;
96 final ElevateWord entity = getElevateWord(body).orElseGet(() -> {
97 throwValidationErrorApi(messages -> {
98 messages.addErrorsCrudFailedToCreateInstance(GLOBAL);
99 });
100 return null;
101 });
102 try {
103 elevateWordService.store(entity);
104 suggestHelper.addElevateWord(entity.getSuggestWord(), entity.getReading(), entity.getLabelTypeValues(), entity.getPermissions(),
105 entity.getBoost(), false);
106 } catch (final Exception e) {
107 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e)));
108 }
109 return asJson(new ApiResult.ApiUpdateResponse().id(entity.getId()).created(true).status(ApiResult.Status.OK).result());
110 }
111
112
113 @Execute
114 public JsonResponse<ApiResult> post$setting(final EditBody body) {
115 validateApi(body, messages -> {});
116 body.crudMode = CrudMode.EDIT;
117 final ElevateWord elevateWord = getElevateWord(body).map(entity -> {
118 try {
119 elevateWordService.store(entity);
120 suggestHelper.deleteAllElevateWord(false);
121 suggestHelper.storeAllElevateWords(false);
122 } catch (final Exception e) {
123 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)));
124 }
125 return entity;
126 }).orElseGet(() -> {
127 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, body.id));
128 return null;
129 });
130
131 return asJson(new ApiUpdateResponse().id(elevateWord.getId()).created(false).status(Status.OK).result());
132 }
133
134
135 @Execute
136 public JsonResponse<ApiResult> delete$setting(final String id) {
137 try {
138 elevateWordService.getElevateWord(id).ifPresent(entity -> {
139 try {
140 elevateWordService.delete(entity);
141 suggestHelper.deleteElevateWord(entity.getSuggestWord(), false);
142 saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
143 } catch (final Exception e) {
144 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
145 }
146 }).orElse(() -> {
147 throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id));
148 });
149 } catch (final Exception e) {
150 throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e)));
151 }
152 return asJson(new ApiResult.ApiUpdateResponse().id(id).created(false).status(ApiResult.Status.OK).result());
153 }
154
155
156 @Execute
157 public JsonResponse<ApiResult> post$upload(final UploadForm body) {
158 validateApi(body, messages -> {});
159 CommonPoolUtil.execute(() -> {
160 try (Reader reader = new BufferedReader(new InputStreamReader(body.elevateWordFile.getInputStream(), getCsvEncoding()))) {
161 elevateWordService.importCsv(reader);
162 suggestHelper.storeAllElevateWords(false);
163 } catch (final Exception e) {
164 throw new FessSystemException("Failed to import data.", e);
165 }
166 });
167 return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result());
168 }
169
170
171 @Execute
172 public StreamResponse get$download(final DownloadBody body) {
173 validateApi(body, messages -> {});
174 return asStream("elevate.csv").contentTypeOctetStream().stream(out -> {
175 final Path tempFile = ComponentUtil.getSystemHelper().createTempFile("fess-elevate-", ".csv").toPath();
176 try {
177 try (Writer writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(tempFile), getCsvEncoding()))) {
178 elevateWordService.exportCsv(writer);
179 } catch (final Exception e) {
180 throwValidationErrorApi(messages -> messages.addErrorsFailedToDownloadElevateFile(GLOBAL));
181 }
182 try (InputStream in = Files.newInputStream(tempFile)) {
183 out.write(in);
184 }
185 } finally {
186 Files.delete(tempFile);
187 }
188 });
189 }
190
191 protected EditBody createEditBody(final ElevateWord entity) {
192 final EditBody body = new EditBody();
193 copyBeanToBean(entity, body, copyOp -> {
194 copyOp.excludeNull();
195 copyOp.exclude(Constants.PERMISSIONS);
196 });
197 final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper();
198 body.permissions = stream(entity.getPermissions()).get(stream -> stream.map(s -> permissionHelper.decode(s))
199 .filter(StringUtil::isNotBlank).distinct().collect(Collectors.joining("\n")));
200 return body;
201 }
202
203 private String getCsvEncoding() {
204 return fessConfig.getCsvFileEncoding();
205 }
206
207 }