diff --git a/pom.xml b/pom.xml index d8846f48c..9512f4bc4 100644 --- a/pom.xml +++ b/pom.xml @@ -95,14 +95,12 @@ org/codelibs/fess/app/web/admin/WizardAction.java - org/codelibs/fess/app/web/admin/SearchListForm.java org/codelibs/fess/app/web/admin/dict/UserDictForm.java org/codelibs/fess/app/web/admin/dict/SynonymForm.java org/codelibs/fess/app/web/admin/dict/UserDictAction.java org/codelibs/fess/app/web/admin/dict/SynonymAction.java org/codelibs/fess/app/web/admin/DocumentAction.java org/codelibs/fess/app/web/admin/DictForm.java - org/codelibs/fess/app/web/admin/SearchListAction.java org/codelibs/fess/app/web/admin/DocumentForm.java org/codelibs/fess/app/web/admin/DataForm.java org/codelibs/fess/app/web/admin/IndexAction.java diff --git a/src/main/java/org/codelibs/fess/app/web/admin/SearchListAction.java b/src/main/java/org/codelibs/fess/app/web/admin/SearchListAction.java deleted file mode 100644 index 5e3a67237..000000000 --- a/src/main/java/org/codelibs/fess/app/web/admin/SearchListAction.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright 2009-2015 the 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. - */ - -package org.codelibs.fess.app.web.admin; - -import java.beans.Beans; -import java.io.Serializable; -import java.text.NumberFormat; -import java.util.List; -import java.util.Map; - -import javax.annotation.Resource; -import javax.servlet.http.HttpServletRequest; - -import org.codelibs.core.beans.util.BeanUtil; -import org.codelibs.core.lang.StringUtil; -import org.codelibs.core.misc.DynamicProperties; -import org.codelibs.fess.Constants; -import org.codelibs.fess.InvalidQueryException; -import org.codelibs.fess.ResultOffsetExceededException; -import org.codelibs.fess.annotation.Token; -import org.codelibs.fess.client.FessEsClient; -import org.codelibs.fess.client.FessEsClient.SearchConditionBuilder; -import org.codelibs.fess.crud.util.SAStrutsUtil; -import org.codelibs.fess.exception.SSCActionMessagesException; -import org.codelibs.fess.helper.FieldHelper; -import org.codelibs.fess.helper.JobHelper; -import org.codelibs.fess.helper.QueryHelper; -import org.codelibs.fess.helper.SystemHelper; -import org.codelibs.fess.util.QueryResponseList; -import org.elasticsearch.index.query.QueryBuilder; -import org.elasticsearch.index.query.QueryBuilders; -import org.lastaflute.taglib.function.LaFunctions; -import org.lastaflute.web.util.LaRequestUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class SearchListAction implements Serializable { - private static final Logger logger = LoggerFactory.getLogger(SearchListAction.class); - - private static final long serialVersionUID = 1L; - - //@ActionForm - @Resource - protected SearchListForm searchListForm; - - @Resource - protected FessEsClient fessEsClient; - - @Resource - protected DynamicProperties crawlerProperties; - - @Resource - protected HttpServletRequest request; - - @Resource - protected SystemHelper systemHelper; - - @Resource - protected FieldHelper fieldHelper; - - @Resource - protected QueryHelper queryHelper; - - @Resource - protected JobHelper jobHelper; - - public List> documentItems; - - public String pageSize; - - public String currentPageNumber; - - public String allRecordCount; - - public String allPageCount; - - public boolean existNextPage; - - public boolean existPrevPage; - - public String currentStartRecordNumber; - - public String currentEndRecordNumber; - - public List pageNumberList; - - public String execTime; - - public String getHelpLink() { - return systemHelper.getHelpLink("searchList"); - } - - //@Execute(validator = false) - public String index() { - return "index.jsp"; - } - - protected String doSearch() { - - if (StringUtil.isBlank(searchListForm.query)) { - // redirect to index page - searchListForm.query = null; - return "index?redirect=true"; - } - - doSearchInternal(); - - return "index.jsp"; - } - - private String doSearchInternal() { - final String query = searchListForm.query; - - // init pager - if (StringUtil.isBlank(searchListForm.start)) { - searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT); - } else { - try { - Long.parseLong(searchListForm.start); - } catch (final NumberFormatException e) { - searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT); - } - } - if (StringUtil.isBlank(searchListForm.num)) { - searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); - } else { - try { - final int num = Integer.parseInt(searchListForm.num); - if (num > 100) { - // max page size - searchListForm.num = "100"; - } - } catch (final NumberFormatException e) { - searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); - } - } - - final int offset = Integer.parseInt(searchListForm.start); - final int size = Integer.parseInt(searchListForm.num); - try { - documentItems = - fessEsClient.getDocumentList(fieldHelper.docIndex, fieldHelper.docType, searchRequestBuilder -> { - return SearchConditionBuilder.builder(searchRequestBuilder).administrativeAccess().offset(offset).size(size) - .responseFields(queryHelper.getResponseFields()).build(); - }); - } catch (final InvalidQueryException e) { - if (logger.isDebugEnabled()) { - logger.debug(e.getMessage(), e); - } - throw new SSCActionMessagesException(e, e.getMessageCode()); - } catch (final ResultOffsetExceededException e) { - if (logger.isDebugEnabled()) { - logger.debug(e.getMessage(), e); - } - throw new SSCActionMessagesException(e, "errors.result_size_exceeded"); - } - final QueryResponseList queryResponseList = (QueryResponseList) documentItems; - final NumberFormat nf = NumberFormat.getInstance(LaRequestUtil.getRequest().getLocale()); - nf.setMaximumIntegerDigits(2); - nf.setMaximumFractionDigits(2); - try { - execTime = nf.format((double) queryResponseList.getExecTime() / 1000); - } catch (final Exception e) {} - - BeanUtil.copyBeanToBean(documentItems, this, option -> option.include("pageSize", "currentPageNumber", "allRecordCount", - "allPageCount", "existNextPage", "existPrevPage", "currentStartRecordNumber", "currentEndRecordNumber", "pageNumberList")); - - return query; - } - - //@Execute(validator = false) - public String search() { - return doSearch(); - } - - //@Execute(validator = false) - public String prev() { - return doMove(-1); - } - - //@Execute(validator = false) - public String next() { - return doMove(1); - } - - //@Execute(validator = false) - public String move() { - return doMove(0); - } - - protected String doMove(final int move) { - int size = Constants.DEFAULT_PAGE_SIZE; - if (StringUtil.isBlank(searchListForm.num)) { - searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); - } else { - try { - size = Integer.parseInt(searchListForm.num); - } catch (final NumberFormatException e) { - searchListForm.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); - } - } - - if (StringUtil.isBlank(searchListForm.pn)) { - searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT); - } else { - Integer pageNumber = Integer.parseInt(searchListForm.pn); - if (pageNumber != null && pageNumber > 0) { - pageNumber = pageNumber + move; - if (pageNumber < 1) { - pageNumber = 1; - } - searchListForm.start = String.valueOf((pageNumber - 1) * size); - } else { - searchListForm.start = String.valueOf(Constants.DEFAULT_START_COUNT); - } - } - - return doSearch(); - } - - @Token(save = true, validate = false) - //@Execute(validator = true, input = "index") - public String confirmDelete() { - return "confirmDelete.jsp"; - } - - @Token(save = false, validate = true) - //@Execute(validator = true, input = "index") - public String delete() { - return deleteByQuery(searchListForm.docId); - } - - private String deleteByQuery(final String docId) { - if (jobHelper.isCrawlProcessRunning()) { - throw new SSCActionMessagesException("errors.failed_to_start_solr_process_because_of_running"); - } - final Thread thread = new Thread(() -> { - if (!jobHelper.isCrawlProcessRunning()) { - final long time = System.currentTimeMillis(); - try { - final QueryBuilder query = QueryBuilders.termQuery(fieldHelper.docIdField, docId); - fessEsClient.deleteByQuery(fieldHelper.docIndex, fieldHelper.docType, query); - if (logger.isInfoEnabled()) { - logger.info("[EXEC TIME] index cleanup time: " + (System.currentTimeMillis() - time) + "ms"); - } - } catch (final Exception e) { - logger.error("Failed to delete index (query=" + fieldHelper.docIdField + ":" + docId + ").", e); - } - } else { - if (logger.isInfoEnabled()) { - logger.info("could not start index cleanup process" + " because of running solr process."); - } - } - }); - thread.start(); - SAStrutsUtil.addSessionMessage("success.delete_solr_index"); - return "search?query=" + LaFunctions.u(searchListForm.query) + "&redirect=true"; - } - - public boolean isSolrProcessRunning() { - return jobHelper.isCrawlProcessRunning(); - } -} \ No newline at end of file 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 new file mode 100644 index 000000000..6c2cfe0fc --- /dev/null +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/AdminSearchlistAction.java @@ -0,0 +1,264 @@ +/* + * Copyright 2009-2015 the 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. + */ + +package org.codelibs.fess.app.web.admin.searchlist; + +import java.text.NumberFormat; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.codelibs.core.lang.StringUtil; +import org.codelibs.fess.Constants; +import org.codelibs.fess.InvalidQueryException; +import org.codelibs.fess.ResultOffsetExceededException; +import org.codelibs.fess.annotation.Token; +import org.codelibs.fess.app.web.base.FessAdminAction; +import org.codelibs.fess.client.FessEsClient; +import org.codelibs.fess.client.FessEsClient.SearchConditionBuilder; +import org.codelibs.fess.helper.FieldHelper; +import org.codelibs.fess.helper.JobHelper; +import org.codelibs.fess.helper.QueryHelper; +import org.codelibs.fess.helper.SystemHelper; +import org.codelibs.fess.util.QueryResponseList; +import org.elasticsearch.index.query.QueryBuilder; +import org.elasticsearch.index.query.QueryBuilders; +import org.lastaflute.taglib.function.LaFunctions; +import org.lastaflute.web.Execute; +import org.lastaflute.web.callback.ActionRuntime; +import org.lastaflute.web.response.HtmlResponse; +import org.lastaflute.web.response.render.RenderData; +import org.lastaflute.web.util.LaRequestUtil; + +/** + * @author codelibs + * @author Keiichi Watanabe + */ +public class AdminSearchlistAction extends FessAdminAction { + + // =================================================================================== + // Attribute + // ========= + @Resource + private SystemHelper systemHelper; + + @Resource + protected FessEsClient fessEsClient; + @Resource + protected FieldHelper fieldHelper; + @Resource + protected QueryHelper queryHelper; + + @Resource + protected JobHelper jobHelper; + + public List> documentItems; + + public String pageSize; + + public String currentPageNumber; + + public String allRecordCount; + + public String allPageCount; + + public boolean existNextPage; + + public boolean existPrevPage; + + public String currentStartRecordNumber; + + public String currentEndRecordNumber; + + public List pageNumberList; + + public String execTime; + + // =================================================================================== + // Hook + // ====== + @Override + protected void setupHtmlData(final ActionRuntime runtime) { + super.setupHtmlData(runtime); + + runtime.registerData("helpLink", systemHelper.getHelpLink("searchList")); + } + + // =================================================================================== + // Search Execute + // ============== + @Execute + public HtmlResponse index(final SearchListForm form) { + return asHtml(path_AdminSearchlist_IndexJsp); + } + + protected HtmlResponse doSearch(final SearchListForm form) { + + if (StringUtil.isBlank(form.query)) { + // redirect to index page + form.query = null; + return redirect(getClass()); + } + return asHtml(path_AdminSearchlist_IndexJsp).renderWith(data -> { + doSearchInternal(data, form); + }); + } + + private void doSearchInternal(final RenderData data, final SearchListForm form) { + final String query = form.query; + + // init pager + if (StringUtil.isBlank(form.start)) { + form.start = String.valueOf(Constants.DEFAULT_START_COUNT); + } else { + try { + Long.parseLong(form.start); + } catch (final NumberFormatException e) { + form.start = String.valueOf(Constants.DEFAULT_START_COUNT); + } + } + if (StringUtil.isBlank(form.num)) { + form.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); + } else { + try { + final int num = Integer.parseInt(form.num); + if (num > 100) { + // max page size + form.num = "100"; + } + } catch (final NumberFormatException e) { + form.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); + } + } + + final int offset = Integer.parseInt(form.start); + final int size = Integer.parseInt(form.num); + + try { + documentItems = + fessEsClient.getDocumentList(fieldHelper.docIndex, fieldHelper.docType, searchRequestBuilder -> { + return SearchConditionBuilder.builder(searchRequestBuilder).administrativeAccess().offset(offset).size(size) + .responseFields(queryHelper.getResponseFields()).build(); + }); + } catch (final InvalidQueryException e) { + // TODO Log + } catch (final ResultOffsetExceededException e) { + // TODO Log + } + final QueryResponseList queryResponseList = (QueryResponseList) documentItems; + final NumberFormat nf = NumberFormat.getInstance(LaRequestUtil.getRequest().getLocale()); + nf.setMaximumIntegerDigits(2); + nf.setMaximumFractionDigits(2); + try { + String execTime = nf.format((double) queryResponseList.getExecTime() / 1000); + } catch (final Exception e) {} + + copyBeanToBean(documentItems, this, option -> option.include("pageSize", "currentPageNumber", "allRecordCount", "allPageCount", + "existNextPage", "existPrevPage", "currentStartRecordNumber", "currentEndRecordNumber", "pageNumberList")); + } + + //@Execute(validator = false) + public HtmlResponse search(final SearchListForm form) { + return doSearch(form); + } + + //@Execute(validator = false) + public HtmlResponse prev(final SearchListForm form) { + return doMove(form, -1); + } + + //@Execute(validator = false) + public HtmlResponse next(final SearchListForm form) { + return doMove(form, 1); + } + + //@Execute(validator = false) + public HtmlResponse move(final SearchListForm form) { + return doMove(form, 0); + } + + protected HtmlResponse doMove(final SearchListForm form, final int move) { + int size = Constants.DEFAULT_PAGE_SIZE; + if (StringUtil.isBlank(form.num)) { + form.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); + } else { + try { + size = Integer.parseInt(form.num); + } catch (final NumberFormatException e) { + form.num = String.valueOf(Constants.DEFAULT_PAGE_SIZE); + } + } + + if (StringUtil.isBlank(form.pn)) { + form.start = String.valueOf(Constants.DEFAULT_START_COUNT); + } else { + Integer pageNumber = Integer.parseInt(form.pn); + if (pageNumber != null && pageNumber > 0) { + pageNumber = pageNumber + move; + if (pageNumber < 1) { + pageNumber = 1; + } + form.start = String.valueOf((pageNumber - 1) * size); + } else { + form.start = String.valueOf(Constants.DEFAULT_START_COUNT); + } + } + + return doSearch(form); + } + + // ----------------------------------------------------- + // Confirm + // ------- + @Execute + public HtmlResponse confirmDelete(final SearchListForm form) { + return asHtml(path_AdminSearchlist_ConfirmDeleteJsp); + } + + @Token(save = false, validate = true) + //@Execute(validator = true, input = "index") + public HtmlResponse delete(final SearchListForm form) { + return deleteByQuery(form); + } + + private HtmlResponse deleteByQuery(final SearchListForm form) { + final String docId = form.docId; + if (jobHelper.isCrawlProcessRunning()) { + // TODO Error + } + final Thread thread = new Thread(() -> { + if (!jobHelper.isCrawlProcessRunning()) { + final long time = System.currentTimeMillis(); + try { + final QueryBuilder query = QueryBuilders.termQuery(fieldHelper.docIdField, docId); + fessEsClient.deleteByQuery(fieldHelper.docIndex, fieldHelper.docType, query); + } catch (final Exception e) { + // TODO Log + } + } + } ); + thread.start(); + saveInfo(messages -> messages.addSuccessDeleteSolrIndex(GLOBAL)); + final String contextPath = LaRequestUtil.getRequest().getContextPath(); + return newHtmlResponseAsRediect(contextPath + "/search/?query=" + LaFunctions.u(form.query)); + } + + public boolean isSolrProcessRunning() { + return jobHelper.isCrawlProcessRunning(); + } + +} diff --git a/src/main/java/org/codelibs/fess/app/web/admin/SearchListForm.java b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/SearchListForm.java similarity index 91% rename from src/main/java/org/codelibs/fess/app/web/admin/SearchListForm.java rename to src/main/java/org/codelibs/fess/app/web/admin/searchlist/SearchListForm.java index 72ea3dfac..852696a13 100644 --- a/src/main/java/org/codelibs/fess/app/web/admin/SearchListForm.java +++ b/src/main/java/org/codelibs/fess/app/web/admin/searchlist/SearchListForm.java @@ -14,10 +14,14 @@ * governing permissions and limitations under the License. */ -package org.codelibs.fess.app.web.admin; +package org.codelibs.fess.app.web.admin.searchlist; import java.io.Serializable; +/** + * @author codelibs + * @author Keiichi Watanabe + */ public class SearchListForm implements Serializable { private static final long serialVersionUID = 1L; @@ -39,5 +43,4 @@ public class SearchListForm implements Serializable { //@Required(target = "confirmDelete") public String url; - } diff --git a/src/main/webapp/WEB-INF/view/admin/searchlist/index.jsp b/src/main/webapp/WEB-INF/view/admin/searchlist/index.jsp index 6d3e1763b..7df3dff8a 100644 --- a/src/main/webapp/WEB-INF/view/admin/searchlist/index.jsp +++ b/src/main/webapp/WEB-INF/view/admin/searchlist/index.jsp @@ -37,7 +37,7 @@

- +
" name="search" /> @@ -79,7 +79,7 @@

- +
    @@ -107,7 +107,7 @@
- +
- + @@ -175,4 +175,3 @@ - diff --git a/src/main/webapp/WEB-INF/view/common/admin2/sidebar.jsp b/src/main/webapp/WEB-INF/view/common/admin2/sidebar.jsp index 7f8fb1930..802373630 100644 --- a/src/main/webapp/WEB-INF/view/common/admin2/sidebar.jsp +++ b/src/main/webapp/WEB-INF/view/common/admin2/sidebar.jsp @@ -221,10 +221,10 @@ -
  • class="active"> +
  • class="active"> -
  • +