diff --git a/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java b/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java index 45edc9094..603f3c03d 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/elevateword/AdminElevatewordAction.java @@ -32,6 +32,7 @@ import java.util.stream.Stream; import javax.annotation.Resource; +import org.codelibs.core.beans.util.BeanUtil; import org.codelibs.core.lang.StringUtil; import org.codelibs.fess.Constants; import org.codelibs.fess.app.pager.ElevateWordPager; @@ -43,6 +44,7 @@ import org.codelibs.fess.es.config.exentity.ElevateWord; import org.codelibs.fess.exception.FessSystemException; import org.codelibs.fess.helper.PermissionHelper; import org.codelibs.fess.helper.SuggestHelper; +import org.codelibs.fess.helper.SystemHelper; import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.RenderDataUtil; import org.dbflute.optional.OptionalEntity; @@ -333,7 +335,7 @@ public class AdminElevatewordAction extends FessAdminAction { // =================================================================================== // Assist Logic // ============ - private OptionalEntity getEntity(final CreateForm form, final String username, final long currentTime) { + public static OptionalEntity getEntity(final CreateForm form, final String username, final long currentTime) { switch (form.crudMode) { case CrudMode.CREATE: return OptionalEntity.of(new ElevateWord()).map(entity -> { @@ -343,7 +345,7 @@ public class AdminElevatewordAction extends FessAdminAction { }); case CrudMode.EDIT: if (form instanceof EditForm) { - return elevateWordService.getElevateWord(((EditForm) form).id); + return ComponentUtil.getComponent(ElevateWordService.class).getElevateWord(((EditForm) form).id); } break; default: @@ -352,7 +354,8 @@ public class AdminElevatewordAction extends FessAdminAction { return OptionalEntity.empty(); } - protected OptionalEntity getElevateWord(final CreateForm form) { + public static OptionalEntity getElevateWord(final CreateForm form) { + final SystemHelper systemHelper = ComponentUtil.getSystemHelper(); final String username = systemHelper.getUsername(); final long currentTime = systemHelper.getCurrentTimeAsLong(); @@ -360,7 +363,7 @@ public class AdminElevatewordAction extends FessAdminAction { entity -> { entity.setUpdatedBy(username); entity.setUpdatedTime(currentTime); - copyBeanToBean(form, entity, op -> op.exclude(Stream.concat(Stream.of(Constants.COMMON_CONVERSION_RULE), + BeanUtil.copyBeanToBean(form, entity, op -> op.exclude(Stream.concat(Stream.of(Constants.COMMON_CONVERSION_RULE), Stream.of(Constants.PERMISSIONS)).toArray(n -> new String[n]))); final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper(); entity.setPermissions(split(form.permissions, "\n").get( diff --git a/src/main/java/org/codelibs/fess/app/web/admin/elevateword/EditForm.java b/src/main/java/org/codelibs/fess/app/web/admin/elevateword/EditForm.java index 6d1dcf646..ad6395676 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/elevateword/EditForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/elevateword/EditForm.java @@ -37,6 +37,6 @@ public class EditForm extends CreateForm { @Required @ValidateTypeFailure - public Integer versionNo; + public Long versionNo; } diff --git a/src/main/java/org/codelibs/fess/app/web/api/admin/badword/ApiAdminBadwordAction.java b/src/main/java/org/codelibs/fess/app/web/api/admin/badword/ApiAdminBadwordAction.java index b83699d37..27a733407 100644 --- a/src/main/java/org/codelibs/fess/app/web/api/admin/badword/ApiAdminBadwordAction.java +++ b/src/main/java/org/codelibs/fess/app/web/api/admin/badword/ApiAdminBadwordAction.java @@ -35,7 +35,6 @@ import org.codelibs.fess.app.pager.BadWordPager; import org.codelibs.fess.app.service.BadWordService; import org.codelibs.fess.app.web.admin.badword.UploadForm; import org.codelibs.fess.app.web.api.ApiResult; -import org.codelibs.fess.app.web.api.admin.BaseSearchBody; import org.codelibs.fess.app.web.api.admin.FessApiAdminAction; import org.codelibs.fess.es.config.exentity.BadWord; import org.codelibs.fess.exception.FessSystemException; @@ -55,7 +54,7 @@ public class ApiAdminBadwordAction extends FessApiAdminAction { // GET /api/admin/badword // POST /api/admin/badword @Execute - public JsonResponse settings(final BaseSearchBody body) { + public JsonResponse settings(final SearchBody body) { validateApi(body, messages -> {}); final BadWordPager pager = new BadWordPager(); pager.setPageSize(body.size); @@ -68,7 +67,7 @@ public class ApiAdminBadwordAction extends FessApiAdminAction { // PUT /api/admin/badword/setting @Execute - public JsonResponse put$setting(final EditBody body) { + public JsonResponse put$setting(final CreateBody body) { validateApi(body, messages -> {}); final BadWord entity = getBadWord(body).orElseGet(() -> { throwValidationErrorApi(messages -> { diff --git a/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/ApiAdminElevatewordAction.java b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/ApiAdminElevatewordAction.java new file mode 100644 index 000000000..655e3e3ec --- /dev/null +++ b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/ApiAdminElevatewordAction.java @@ -0,0 +1,205 @@ +package org.codelibs.fess.app.web.api.admin.elevateword; + +/* + * Copyright 2012-2017 CodeLibs Project and the Others. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, + * either express or implied. See the License for the specific language + * governing permissions and limitations under the License. + */ + +import org.codelibs.core.lang.StringUtil; +import org.codelibs.fess.app.pager.ElevateWordPager; +import org.codelibs.fess.app.service.ElevateWordService; +import org.codelibs.fess.app.web.admin.elevateword.UploadForm; +import org.codelibs.fess.app.web.api.ApiResult; +import org.codelibs.fess.app.web.api.admin.FessApiAdminAction; +import org.codelibs.fess.es.config.exentity.ElevateWord; +import org.codelibs.fess.exception.FessSystemException; +import org.codelibs.fess.helper.PermissionHelper; +import org.codelibs.fess.helper.SuggestHelper; +import org.codelibs.fess.util.ComponentUtil; +import org.lastaflute.web.Execute; +import org.lastaflute.web.response.JsonResponse; +import org.lastaflute.web.response.StreamResponse; + +import javax.annotation.Resource; +import java.io.*; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.List; +import java.util.stream.Collectors; + +import static org.codelibs.core.stream.StreamUtil.stream; +import static org.codelibs.fess.app.web.admin.elevateword.AdminElevatewordAction.*; + +public class ApiAdminElevatewordAction extends FessApiAdminAction { + + @Resource + private ElevateWordService elevateWordService; + + @Resource + protected SuggestHelper suggestHelper; + + // GET /api/admin/elevateword + // POST /api/admin/elevateword + @Execute + public JsonResponse settings(final SearchBody body) { + validateApi(body, messages -> {}); + final ElevateWordPager pager = new ElevateWordPager(); + pager.setPageSize(body.size); + pager.setCurrentPageNumber(body.page); + final List list = elevateWordService.getElevateWordList(pager); + return asJson(new ApiResult.ApiConfigsResponse() + .settings(list.stream().map(entity -> createEditBody(entity)).collect(Collectors.toList())) + .total(pager.getAllRecordCount()).status(ApiResult.Status.OK).result()); + } + + // GET /api/admin/elevateword/{id} + @Execute + public JsonResponse get$setting(final String id) { + + ElevateWord entity = elevateWordService.getElevateWord(id).orElseGet(() -> { + throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id)); + return null; + }); + + final EditBody body = createEditBody(entity); + final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper(); + body.permissions = + stream(entity.getPermissions()).get( + stream -> stream.map(s -> permissionHelper.decode(s)).filter(StringUtil::isNotBlank).distinct() + .collect(Collectors.joining("\n"))); + return asJson(new ApiResult.ApiConfigResponse().setting(body).status(ApiResult.Status.OK).result()); + } + + // PUT /api/admin/elevateword/setting + @Execute + public JsonResponse put$setting(final CreateBody body) { + validateApi(body, messages -> {}); + final ElevateWord entity = getElevateWord(body).orElseGet(() -> { + throwValidationErrorApi(messages -> { + messages.addErrorsCrudFailedToCreateInstance(GLOBAL); + }); + return null; + }); + try { + elevateWordService.store(entity); + suggestHelper.addElevateWord(entity.getSuggestWord(), entity.getReading(), entity.getLabelTypeValues(), + entity.getPermissions(), entity.getBoost()); + } catch (final Exception e) { + throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToCreateCrudTable(GLOBAL, buildThrowableMessage(e))); + } + return asJson(new ApiResult.ApiUpdateResponse().id(entity.getId()).created(true).status(ApiResult.Status.OK).result()); + } + + // POST /api/admin/elevateword/setting + @Execute + public JsonResponse post$setting(final EditBody body) { + validateApi(body, messages -> {}); + final ElevateWord entity = getElevateWord(body).orElseGet(() -> { + throwValidationErrorApi(messages -> { + messages.addErrorsCrudFailedToCreateInstance(GLOBAL); + }); + return null; + }); + try { + elevateWordService.store(entity); + suggestHelper.deleteAllElevateWord(); + suggestHelper.storeAllElevateWords(); + } catch (final Exception e) { + throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e))); + } + return asJson(new ApiResult.ApiUpdateResponse().id(entity.getId()).created(true).status(ApiResult.Status.OK).result()); + } + + // DELETE /api/admin/elevateword/setting/{id} + @Execute + public JsonResponse delete$setting(final String id) { + try { + elevateWordService.getElevateWord(id).ifPresent(entity -> { + try { + elevateWordService.delete(entity); + suggestHelper.deleteElevateWord(entity.getSuggestWord()); + saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL)); + } catch (final Exception e) { + throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e))); + } + }).orElse(() -> { + throwValidationErrorApi(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id)); + }); + } catch (final Exception e) { + throwValidationErrorApi(messages -> messages.addErrorsCrudFailedToDeleteCrudTable(GLOBAL, buildThrowableMessage(e))); + } + return asJson(new ApiResult.ApiUpdateResponse().id(id).created(true).status(ApiResult.Status.OK).result()); + } + + // POST /api/admin/elevateword/upload + @Execute + public JsonResponse post$upload(final UploadForm body) { + validateApi(body, messages -> {}); + new Thread(() -> { + try (Reader reader = new BufferedReader(new InputStreamReader(body.elevateWordFile.getInputStream(), getCsvEncoding()))) { + elevateWordService.importCsv(reader); + suggestHelper.storeAllElevateWords(); + } catch (final Exception e) { + throw new FessSystemException("Failed to import data.", e); + } + }).start(); + return asJson(new ApiResult.ApiResponse().status(ApiResult.Status.OK).result()); + } + + // GET /api/admin/elevateword/download + @Execute + public StreamResponse get$download(final DownloadBody body) { + validateApi(body, messages -> {}); + return asStream("elevate.csv").contentTypeOctetStream().stream(out -> { + final Path tempFile = Files.createTempFile(null, null); + try { + try (Writer writer = new BufferedWriter(new OutputStreamWriter(Files.newOutputStream(tempFile), getCsvEncoding()))) { + elevateWordService.exportCsv(writer); + } catch (final Exception e) { + throwValidationErrorApi(messages -> messages.addErrorsFailedToDownloadElevateFile(GLOBAL)); + } + try (InputStream in = Files.newInputStream(tempFile)) { + out.write(in); + } + } finally { + Files.delete(tempFile); + } + }); + } + + protected EditBody createEditBody(final ElevateWord entity) { + final EditBody body = new EditBody(); + body.id = entity.getId(); + body.versionNo = entity.getVersionNo(); + body.createdBy = entity.getCreatedBy(); + body.createdTime = entity.getCreatedTime(); + body.suggestWord = entity.getSuggestWord(); + body.updatedBy = entity.getUpdatedBy(); + body.updatedTime = entity.getUpdatedTime(); + body.labelTypeIds = entity.getLabelTypeIds(); + final PermissionHelper permissionHelper = ComponentUtil.getPermissionHelper(); + body.permissions = + stream(entity.getPermissions()).get( + stream -> stream.map(s -> permissionHelper.decode(s)).filter(StringUtil::isNotBlank).distinct() + .collect(Collectors.joining("\n"))); + body.targetLabel = entity.getTargetLabel(); + body.reading = entity.getReading(); + return body; + } + + private String getCsvEncoding() { + return fessConfig.getCsvFileEncoding(); + } + +} diff --git a/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/CreateBody.java b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/CreateBody.java new file mode 100644 index 000000000..a5df625ba --- /dev/null +++ b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/CreateBody.java @@ -0,0 +1,6 @@ +package org.codelibs.fess.app.web.api.admin.elevateword; + +import org.codelibs.fess.app.web.admin.elevateword.CreateForm; + +public class CreateBody extends CreateForm { +} diff --git a/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/DownloadBody.java b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/DownloadBody.java new file mode 100644 index 000000000..1e8a77797 --- /dev/null +++ b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/DownloadBody.java @@ -0,0 +1,6 @@ +package org.codelibs.fess.app.web.api.admin.elevateword; + +import org.codelibs.fess.app.web.admin.elevateword.DownloadForm; + +public class DownloadBody extends DownloadForm { +} diff --git a/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/EditBody.java b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/EditBody.java new file mode 100644 index 000000000..7d0014baa --- /dev/null +++ b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/EditBody.java @@ -0,0 +1,6 @@ +package org.codelibs.fess.app.web.api.admin.elevateword; + +import org.codelibs.fess.app.web.admin.elevateword.EditForm; + +public class EditBody extends EditForm { +} diff --git a/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/SearchBody.java b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/SearchBody.java new file mode 100644 index 000000000..5c80ef74d --- /dev/null +++ b/src/main/java/org/codelibs/fess/app/web/api/admin/elevateword/SearchBody.java @@ -0,0 +1,6 @@ +package org.codelibs.fess.app.web.api.admin.elevateword; + +import org.codelibs.fess.app.web.api.admin.BaseSearchBody; + +public class SearchBody extends BaseSearchBody { +}