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