diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java index 96c387750..3257213d0 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java @@ -22,6 +22,7 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.codelibs.core.lang.StringUtil; +import org.codelibs.core.misc.Pair; import org.codelibs.fess.Constants; import org.codelibs.fess.app.service.SearchService; import org.codelibs.fess.app.web.CrudMode; @@ -30,8 +31,8 @@ import org.codelibs.fess.entity.SearchRenderData; import org.codelibs.fess.es.client.FessEsClient; import org.codelibs.fess.exception.InvalidQueryException; import org.codelibs.fess.exception.ResultOffsetExceededException; -import org.codelibs.fess.helper.ProcessHelper; import org.codelibs.fess.helper.QueryHelper; +import org.codelibs.fess.util.ComponentUtil; import org.codelibs.fess.util.RenderDataUtil; import org.dbflute.optional.OptionalEntity; import org.elasticsearch.index.query.QueryBuilder; @@ -64,9 +65,6 @@ public class AdminSearchlistAction extends FessAdminAction { @Resource protected QueryHelper queryHelper; - @Resource - protected ProcessHelper processHelper; - @Resource protected SearchService searchService; @@ -103,7 +101,6 @@ public class AdminSearchlistAction extends FessAdminAction { super.setupHtmlData(runtime); runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameSearchlist())); - runtime.registerData("isProcessRunning", processHelper.isProcessRunning()); } // =================================================================================== @@ -192,9 +189,6 @@ public class AdminSearchlistAction extends FessAdminAction { verifyToken(() -> asListHtml()); validate(form, messages -> {}, () -> asListHtml()); final String docId = form.docId; - if (processHelper.isProcessRunning()) { - throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), () -> asListHtml()); - } try { final QueryBuilder query = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId); fessEsClient.deleteByQuery(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), query); @@ -209,9 +203,6 @@ public class AdminSearchlistAction extends FessAdminAction { public HtmlResponse deleteall(final ListForm form) { verifyToken(() -> asListHtml()); validate(form, messages -> {}, () -> asListHtml()); - if (processHelper.isProcessRunning()) { - throwValidationError(messages -> messages.addErrorsCannotDeleteDocBecauseOfRunning(GLOBAL), () -> asListHtml()); - } try { searchService.deleteByQuery(request, form); saveInfo(messages -> messages.addSuccessDeleteDocFromIndex(GLOBAL)); @@ -238,16 +229,16 @@ public class AdminSearchlistAction extends FessAdminAction { @Execute public HtmlResponse edit(final EditForm form) { validate(form, messages -> {}, () -> asListHtml()); - // TODO load + final String docId = form.docId; + getDoc(form).ifPresent(entity -> { + form.doc = entity; + form.id = (String) entity.remove(fessConfig.getIndexFieldId()); + form.version = (Long) entity.remove(fessConfig.getIndexFieldVersion()); + }).orElse(() -> { + throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, docId), () -> asListHtml()); + }); saveToken(); - if (form.crudMode.intValue() == CrudMode.EDIT) { - // back - form.crudMode = CrudMode.DETAILS; - return asListHtml(); - } else { - form.crudMode = CrudMode.EDIT; - return asEditHtml(); - } + return asEditHtml(); } @Execute @@ -277,23 +268,40 @@ public class AdminSearchlistAction extends FessAdminAction { validate(form, messages -> {}, () -> asEditHtml()); // TODO verify verifyToken(() -> asEditHtml()); - getDoc(form).ifPresent(entity -> { - try { - for (Map.Entry entry : form.doc.entrySet()) { - entity.put(entry.getKey(), entry.getValue()); - } - // TODO store does not work - fessEsClient.store(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), entity); - saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL)); - } catch (final Exception e) { - logger.error("Failed to update " + entity, e); - throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)), - () -> asEditHtml()); - } - }).orElse(() -> { - throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.id), () -> asEditHtml()); + getDoc(form).ifPresent( + entity -> { + try { + form.doc.entrySet().stream().map(e -> { + // TODO converter + return new Pair<>(e.getKey(), e.getValue()); + }).forEach(p -> entity.put(p.getFirst(), p.getSecond())); + + final String newId = ComponentUtil.getCrawlingInfoHelper().generateId(entity); + String oldId = null; + if (newId.equals(form.id)) { + entity.put(fessConfig.getIndexFieldId(), form.id); + } else { + oldId = form.id; + entity.put(fessConfig.getIndexFieldId(), newId); + } + entity.put(fessConfig.getIndexFieldVersion(), form.version); + + final String index = fessConfig.getIndexDocumentUpdateIndex(); + final String type = fessConfig.getIndexDocumentType(); + fessEsClient.store(index, type, entity); + if (oldId != null) { + fessEsClient.delete(index, type, oldId, form.version); + } + saveInfo(messages -> messages.addSuccessCrudUpdateCrudTable(GLOBAL)); + } catch (final Exception e) { + logger.error("Failed to update " + entity, e); + throwValidationError(messages -> messages.addErrorsCrudFailedToUpdateCrudTable(GLOBAL, buildThrowableMessage(e)), + () -> asEditHtml()); + } + }).orElse(() -> { + throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, form.docId), () -> asEditHtml()); }); - return redirect(getClass()); + return redirectWith(getClass(), moreUrl("search").params("q", form.q)); } // =================================================================================== @@ -314,17 +322,9 @@ public class AdminSearchlistAction extends FessAdminAction { return OptionalEntity.empty(); case CrudMode.EDIT: if (form instanceof EditForm) { - final String docId = ((EditForm) form).id; - if (processHelper.isProcessRunning()) { - break; - } - try { - final QueryBuilder query = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId); - return fessEsClient.getDocumentByQuery(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), - query); - } catch (final Exception e) { - break; - } + final String docId = ((EditForm) form).docId; + final QueryBuilder query = QueryBuilders.termQuery(fessConfig.getIndexFieldDocId(), docId); + return fessEsClient.getDocumentByQuery(fessConfig.getIndexDocumentUpdateIndex(), fessConfig.getIndexDocumentType(), query); } break; default: diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/CreateForm.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/CreateForm.java index a399e7a67..9c4b2e3f3 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/CreateForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/CreateForm.java @@ -29,6 +29,8 @@ public class CreateForm { public Map doc; + public String q; + public void initialize() { } } diff --git a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/EditForm.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/EditForm.java index eeb2a79fa..40e7db8b5 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/searchlist/EditForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/EditForm.java @@ -23,11 +23,12 @@ import org.lastaflute.web.validation.theme.conversion.ValidateTypeFailure; */ public class EditForm extends CreateForm { - @Required public String id; @Required + public String docId; + @ValidateTypeFailure - public Integer versionNo; + public Long version; } \ No newline at end of file diff --git a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java index e8d6be724..ce0ea3d5d 100644 --- a/src/main/java/org/codelibs/fess/es/client/FessEsClient.java +++ b/src/main/java/org/codelibs/fess/es/client/FessEsClient.java @@ -678,11 +678,21 @@ public class FessEsClient implements Client { final FessConfig fessConfig = ComponentUtil.getFessConfig(); SearchResponse response = - client.prepareSearch(index).setTypes(type).setSize(sizeForDelete).setQuery(queryBuilder) - .setPreference(Constants.SEARCH_PREFERENCE_PRIMARY).execute() - .actionGet(fessConfig.getIndexScrollSearchTimeoutTimeout()); - return OptionalEntity.of(response.getHits().getAt(0).getSource()); - + client.prepareSearch(index).setTypes(type).setSize(1).setQuery(queryBuilder).addField(fessConfig.getIndexFieldId()) + .setPreference(Constants.SEARCH_PREFERENCE_PRIMARY).execute().actionGet(fessConfig.getIndexSearchTimeout()); + SearchHits hits = response.getHits(); + if (hits.getTotalHits() != 0) { + SearchHit hit = hits.getAt(0); + String id = hit.getId(); + GetResponse getResponse = + client.prepareGet(index, type, id).setPreference(Constants.SEARCH_PREFERENCE_PRIMARY).execute() + .actionGet(fessConfig.getIndexSearchTimeout()); + Map source = BeanUtil.copyMapToNewMap(getResponse.getSource()); + source.put(fessConfig.getIndexFieldId(), id); + source.put(fessConfig.getIndexFieldVersion(), getResponse.getVersion()); + return OptionalEntity.of(source); + } + return OptionalEntity.empty(); } public List> getDocumentList(final String index, final String type, @@ -944,9 +954,9 @@ public class FessEsClient implements Client { public boolean store(final String index, final String type, final Object obj) { final FessConfig fessConfig = ComponentUtil.getFessConfig(); - final Map source = BeanUtil.copyBeanToNewMap(obj); + final Map source = obj instanceof Map ? (Map) obj : BeanUtil.copyBeanToNewMap(obj); final String id = (String) source.remove(fessConfig.getIndexFieldId()); - final Long version = (Long) source.remove("version"); + final Long version = (Long) source.remove(fessConfig.getIndexFieldVersion()); IndexResponse response; try { if (id == null) { diff --git a/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java b/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java index bd60cf814..09943a49a 100644 --- a/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java +++ b/src/main/java/org/codelibs/fess/mylasta/action/FessLabels.java @@ -563,6 +563,9 @@ public class FessLabels extends ActionMessages { /** The key of the message: Search... */ public static final String LABELS_SIDEBAR_placeholder_search = "{labels.sidebar.placeholder_search}"; + /** The key of the message: MENU */ + public static final String LABELS_SIDEBAR_MENU = "{labels.sidebar.menu}"; + /** The key of the message: Copyright(C) 2009-2016 <a href="https://github.com/codelibs">CodeLibs Project</a>. <span class="br-phone"></span>All Rights Reserved. */ public static final String LABELS_FOOTER_COPYRIGHT = "{labels.footer.copyright}"; diff --git a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java index 41ab974c6..662ed2259 100644 --- a/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java +++ b/src/main/java/org/codelibs/fess/mylasta/direction/FessConfig.java @@ -268,6 +268,9 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction /** The key of the configuration. e.g. _id */ String INDEX_FIELD_ID = "index.field.id"; + /** The key of the configuration. e.g. _version */ + String INDEX_FIELD_VERSION = "index.field.version"; + /** The key of the configuration. e.g. lang */ String INDEX_FIELD_LANG = "index.field.lang"; @@ -1788,6 +1791,13 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction */ String getIndexFieldId(); + /** + * Get the value for the key 'index.field.version'.
+ * The value is, e.g. _version
+ * @return The value of found property. (NotNull: if not found, exception but basically no way) + */ + String getIndexFieldVersion(); + /** * Get the value for the key 'index.field.lang'.
* The value is, e.g. lang
@@ -4418,6 +4428,10 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction return get(FessConfig.INDEX_FIELD_ID); } + public String getIndexFieldVersion() { + return get(FessConfig.INDEX_FIELD_VERSION); + } + public String getIndexFieldLang() { return get(FessConfig.INDEX_FIELD_LANG); } diff --git a/src/main/resources/fess_config.properties b/src/main/resources/fess_config.properties index 7701c8e95..9668ccfa0 100644 --- a/src/main/resources/fess_config.properties +++ b/src/main/resources/fess_config.properties @@ -140,6 +140,7 @@ index.field.expires=expires index.field.url=url index.field.doc_id=doc_id index.field.id=_id +index.field.version=_version index.field.lang=lang index.field.has_cache=has_cache index.field.last_modified=last_modified diff --git a/src/main/resources/fess_label.properties b/src/main/resources/fess_label.properties index 2c59844df..3eecce6ec 100644 --- a/src/main/resources/fess_label.properties +++ b/src/main/resources/fess_label.properties @@ -178,6 +178,7 @@ labels.menu_failure_url=Failure URL labels.menu_search_list=Search labels.menu_backup=Back Up labels.sidebar.placeholder_search=Search... +labels.sidebar.menu=MENU labels.footer.copyright=Copyright(C) 2009-2016 CodeLibs Project. All Rights Reserved. labels.search=Search labels.search_result_status=Results {2} - {3} of {1} for {0} diff --git a/src/main/resources/fess_label_en.properties b/src/main/resources/fess_label_en.properties index d2b15e210..cd104f44f 100644 --- a/src/main/resources/fess_label_en.properties +++ b/src/main/resources/fess_label_en.properties @@ -178,6 +178,7 @@ labels.menu_failure_url=Failure URL labels.menu_search_list=Search labels.menu_backup=Back Up labels.sidebar.placeholder_search=Search... +labels.sidebar.menu=MENU labels.footer.copyright=Copyright(C) 2009-2016 CodeLibs Project. All Rights Reserved. labels.search=Search labels.search_result_status=Results {2} - {3} of {1} for {0} diff --git a/src/main/resources/fess_label_ja.properties b/src/main/resources/fess_label_ja.properties index 289b4e867..9a2103b98 100644 --- a/src/main/resources/fess_label_ja.properties +++ b/src/main/resources/fess_label_ja.properties @@ -174,6 +174,7 @@ labels.menu_failure_url=\u969c\u5bb3URL labels.menu_search_list=\u691c\u7d22 labels.menu_backup=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7 labels.sidebar.placeholder_search=\u691c\u7d22... +labels.sidebar.menu=\u30e1\u30cb\u30e5\u30fc labels.footer.copyright=Copyright(C) 2009-2016 CodeLibs Project. All Rights Reserved. labels.search=\u691c\u7d22 labels.search_result_status={0} \u306e\u691c\u7d22\u7d50\u679c {1} \u4ef6\u4e2d {2} - {3} \u4ef6\u76ee diff --git a/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist.jsp b/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist.jsp index 393edd9bf..f1be5978b 100644 --- a/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist.jsp +++ b/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist.jsp @@ -43,7 +43,7 @@ - +
${f:h(doc.content_title)} -
+
${doc.content_description}
- - - - - - - +
+ + + + + +
diff --git a/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp b/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp index b048d015c..8b751735a 100644 --- a/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp +++ b/src/main/webapp/WEB-INF/view/admin/searchlist/admin_searchlist_edit.jsp @@ -2,8 +2,7 @@ -<la:message key="labels.admin_brand_title" /> | <la:message - key="labels.search_list_configuration" /> +<la:message key="labels.admin_brand_title" /> | <la:message key="labels.search_list_configuration" /> @@ -19,7 +18,7 @@ @@ -27,15 +26,49 @@
+ + +
-
box-successbox-warning"> +
box-successbox-warning">
- +

+ + + + + + + + + + + + + + + +

+
+ + + + + + + + + + + + + + +
@@ -46,8 +79,7 @@
- +
@@ -56,8 +88,30 @@
diff --git a/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp b/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp index 9be4dfa96..7bc0472ea 100644 --- a/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp +++ b/src/main/webapp/WEB-INF/view/common/admin/sidebar.jsp @@ -6,7 +6,7 @@