浏览代码

modify searchList action

Keiichi Watanabe 9 年之前
父节点
当前提交
bc2df27c43

+ 0 - 2
pom.xml

@@ -95,14 +95,12 @@
 					<!-- TODO remove -->
 					<!-- TODO remove -->
 					<excludes>
 					<excludes>
 						<exclude>org/codelibs/fess/app/web/admin/WizardAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/WizardAction.java</exclude>
-						<exclude>org/codelibs/fess/app/web/admin/SearchListForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/UserDictForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/UserDictForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/SynonymForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/SynonymForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/UserDictAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/UserDictAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/SynonymAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/dict/SynonymAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DocumentAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DocumentAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DictForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DictForm.java</exclude>
-						<exclude>org/codelibs/fess/app/web/admin/SearchListAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DocumentForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DocumentForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DataForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/DataForm.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/IndexAction.java</exclude>
 						<exclude>org/codelibs/fess/app/web/admin/IndexAction.java</exclude>

+ 0 - 277
src/main/java/org/codelibs/fess/app/web/admin/SearchListAction.java

@@ -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<Map<String, Object>> 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<String> 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();
-    }
-}

+ 264 - 0
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<Map<String, Object>> 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<String> 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();
+    }
+
+}

+ 5 - 2
src/main/java/org/codelibs/fess/app/web/admin/SearchListForm.java → src/main/java/org/codelibs/fess/app/web/admin/searchlist/SearchListForm.java

@@ -14,10 +14,14 @@
  * governing permissions and limitations under the License.
  * 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;
 import java.io.Serializable;
 
 
+/**
+ * @author codelibs
+ * @author Keiichi Watanabe
+ */
 public class SearchListForm implements Serializable {
 public class SearchListForm implements Serializable {
 
 
     private static final long serialVersionUID = 1L;
     private static final long serialVersionUID = 1L;
@@ -39,5 +43,4 @@ public class SearchListForm implements Serializable {
 
 
     //@Required(target = "confirmDelete")
     //@Required(target = "confirmDelete")
     public String url;
     public String url;
-
 }
 }

+ 4 - 5
src/main/webapp/WEB-INF/view/admin/searchlist/index.jsp

@@ -37,7 +37,7 @@
 								<h3 class="box-title">
 								<h3 class="box-title">
 									<la:message key="labels.search_list_configuration" />
 									<la:message key="labels.search_list_configuration" />
 								</h3>
 								</h3>
-								<la:form action="search" method="get">
+								<la:form>
 									<div class="input">
 									<div class="input">
 										<la:text styleClass="query" property="query" title="Search" size="50" maxlength="1000" />
 										<la:text styleClass="query" property="query" title="Search" size="50" maxlength="1000" />
 										<input class="btn" type="submit" value="<la:message key="labels.search"/>" name="search" />
 										<input class="btn" type="submit" value="<la:message key="labels.search"/>" name="search" />
@@ -79,7 +79,7 @@
 												</c:if>
 												</c:if>
 											</p>
 											</p>
 										</div>
 										</div>
-						
+
 										<div id="result">
 										<div id="result">
 											<div>
 											<div>
 												<ol>
 												<ol>
@@ -107,7 +107,7 @@
 												</ol>
 												</ol>
 											</div>
 											</div>
 										</div>
 										</div>
-						
+
 										<div class="row center">
 										<div class="row center">
 											<div class="pagination">
 											<div class="pagination">
 												<ul>
 												<ul>
@@ -166,7 +166,7 @@
 						</div>
 						</div>
 					</div>
 					</div>
 				</div>
 				</div>
-
+</div>
 			</section>
 			</section>
 		</div>
 		</div>
 
 
@@ -175,4 +175,3 @@
 	<jsp:include page="/WEB-INF/view/common/admin2/foot.jsp"></jsp:include>
 	<jsp:include page="/WEB-INF/view/common/admin2/foot.jsp"></jsp:include>
 </body>
 </body>
 </html>
 </html>
-

+ 2 - 2
src/main/webapp/WEB-INF/view/common/admin2/sidebar.jsp

@@ -221,10 +221,10 @@
 							<span><la:message key="labels.menu.failure_url" /></span>
 							<span><la:message key="labels.menu.failure_url" /></span>
 						</la:link></li>
 						</la:link></li>
 
 
-					<li <c:if test="${param.menuType=='searchList'}">class="active"</c:if>><todo:link href="/admin/searchList/index">
+					<li <c:if test="${param.menuType=='searchList'}">class="active"</c:if>><la:link href="/admin/searchlist/index">
 							<i class='fa fa-angle-right'></i>
 							<i class='fa fa-angle-right'></i>
 							<span><la:message key="labels.menu.search_list" /></span>
 							<span><la:message key="labels.menu.search_list" /></span>
-						</todo:link></li>
+						</la:link></li>
 
 
 				</ul>
 				</ul>
 			</li>
 			</li>