This commit is contained in:
Shinsuke Sugaya 2015-11-07 06:51:42 +09:00
commit 0ce4323508
49 changed files with 699 additions and 413 deletions

1
.gitignore vendored
View file

@ -20,3 +20,4 @@
.idea
.DS_Store
/plugins/
/tomcat.8080/

12
pom.xml
View file

@ -434,6 +434,18 @@
<version>56.1</version>
</dependency>
<!-- suggest library -->
<dependency>
<groupId>org.codelibs.fess</groupId>
<artifactId>fess-suggest</artifactId>
<version>2.0.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.codelibs</groupId>
<artifactId>lucene-analyzers-kuromoji-ipadic-neologd</artifactId>
<version>4.10.4-20150501</version>
</dependency>
<!-- fileupload -->
<dependency>
<!-- TODO remove? -->

View file

@ -504,7 +504,7 @@ public class JsonApiManager extends BaseApiManager {
}
protected void writeJsonResponse(final int status, final String body, final String errMsg) {
public static void writeJsonResponse(final int status, final String body, final String errMsg) {
final String callback = LaRequestUtil.getRequest().getParameter("callback");
final boolean isJsonp = StringUtil.isNotBlank(callback);
@ -538,11 +538,11 @@ public class JsonApiManager extends BaseApiManager {
}
protected String escapeCallbackName(final String callbackName) {
protected static String escapeCallbackName(final String callbackName) {
return "/**/" + callbackName.replaceAll("[^0-9a-zA-Z_\\$\\.]", StringUtil.EMPTY);
}
protected String escapeJson(final Object obj) {
protected static String escapeJson(final Object obj) {
if (obj == null) {
return "null";
}
@ -583,7 +583,7 @@ public class JsonApiManager extends BaseApiManager {
return buf.toString();
}
protected String escapeJsonString(final String str) {
protected static String escapeJsonString(final String str) {
final StringWriter out = new StringWriter(str.length() * 2);
int sz;
@ -653,7 +653,7 @@ public class JsonApiManager extends BaseApiManager {
return out.toString();
}
private String hex(final char ch) {
private static String hex(final char ch) {
return Integer.toHexString(ch).toUpperCase();
}

View file

@ -22,7 +22,15 @@ import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.lang.StringUtils;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.api.BaseApiManager;
import org.codelibs.fess.api.json.JsonApiManager;
import org.codelibs.fess.helper.SuggestHelper;
import org.codelibs.fess.suggest.entity.SuggestItem;
import org.codelibs.fess.suggest.request.suggest.SuggestRequestBuilder;
import org.codelibs.fess.suggest.request.suggest.SuggestResponse;
import org.codelibs.fess.util.ComponentUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -34,16 +42,143 @@ public class SuggestApiManager extends BaseApiManager {
}
@Override
public boolean matches(final HttpServletRequest request) {
return false; // TODO remove
// final String servletPath = request.getServletPath();
// return servletPath.startsWith(pathPrefix);
public boolean matches(HttpServletRequest request) {
final String servletPath = request.getServletPath();
return servletPath.startsWith(pathPrefix);
}
@Override
public void process(final HttpServletRequest request, final HttpServletResponse response, final FilterChain chain) throws IOException,
ServletException {
throw new UnsupportedOperationException("TODO");
public void process(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
int status = 0;
String errMsg = StringUtil.EMPTY;
final StringBuilder buf = new StringBuilder(255);
try {
final RequestParameter parameter = RequestParameter.parse(request);
final SuggestHelper suggestHelper = ComponentUtil.getSuggestHelper();
final SuggestRequestBuilder builder = suggestHelper.suggester().suggest();
builder.setQuery(parameter.getQuery());
for (final String field : parameter.getFields()) {
builder.addField(field);
}
builder.setSize(parameter.getNum());
final SuggestResponse suggestResponse = builder.execute().getResponse();
buf.append("\"result\":{");
buf.append("\"index\":\"").append(suggestResponse.getIndex()).append('\"');
buf.append(",\"took\":\"").append(suggestResponse.getTookMs()).append('\"');
buf.append(",\"total\":\"").append(suggestResponse.getTotal()).append('\"');
buf.append(",\"num\":\"").append(suggestResponse.getNum()).append('\"');
if (!suggestResponse.getItems().isEmpty()) {
buf.append(",\"hits\":[");
boolean first = true;
for (final SuggestItem item : suggestResponse.getItems()) {
if (!first) {
buf.append(',');
}
first = false;
buf.append("{\"text\":\"").append(item.getText()).append('\"');
buf.append(",\"tags\":[");
for (int i = 0; i < item.getTags().length; i++) {
if (i > 0) {
buf.append(',');
}
buf.append('\"').append(item.getTags()[i]).append('\"');
}
buf.append(']');
buf.append(",\"roles\":[");
for (int i = 0; i < item.getRoles().length; i++) {
if (i > 0) {
buf.append(',');
}
buf.append('\"').append(item.getRoles()[i]).append('\"');
}
buf.append(']');
buf.append(",\"fields\":[");
for (int i = 0; i < item.getFields().length; i++) {
if (i > 0) {
buf.append(',');
}
buf.append('\"').append(item.getFields()[i]).append('\"');
}
buf.append(']');
buf.append('}');
}
buf.append(']');
}
buf.append('}');
} catch (final Exception e) {
status = 1;
errMsg = e.getMessage();
if (errMsg == null) {
errMsg = e.getClass().getName();
}
if (logger.isDebugEnabled()) {
logger.debug("Failed to process a suggest request.", e);
}
}
JsonApiManager.writeJsonResponse(status, buf.toString(), errMsg);
}
protected static class RequestParameter {
private final String query;
private final String[] fields;
private final int num;
protected RequestParameter(final String query, final String[] fields, final int num) {
this.query = query;
this.fields = fields;
this.num = num;
}
protected static RequestParameter parse(final HttpServletRequest request) {
final String query = request.getParameter("query");
final String fieldsStr = request.getParameter("fields");
final String[] fields;
if (StringUtils.isNotBlank(fieldsStr)) {
fields = fieldsStr.split(",");
} else {
fields = new String[0];
}
final String numStr = request.getParameter("num");
final int num;
if (StringUtils.isNotBlank(numStr) && StringUtils.isNumeric(numStr)) {
num = Integer.parseInt(numStr);
} else {
num = 10;
}
return new RequestParameter(query, fields, num);
}
protected String getQuery() {
return query;
}
protected String[] getFields() {
return fields;
}
protected int getNum() {
return num;
}
}
}

View file

@ -39,6 +39,7 @@ import org.codelibs.fess.helper.SystemHelper;
import org.codelibs.fess.util.ComponentUtil;
import org.dbflute.cbean.result.ListResultBean;
import org.dbflute.cbean.result.PagingResultBean;
import org.dbflute.optional.OptionalEntity;
import org.lastaflute.di.core.SingletonLaContainer;
public class FailureUrlService implements Serializable {
@ -71,17 +72,8 @@ public class FailureUrlService implements Serializable {
return failureUrlList;
}
public FailureUrl getFailureUrl(final Map<String, String> keys) {
final FailureUrl failureUrl = failureUrlBhv.selectEntity(cb -> {
cb.query().docMeta().setId_Equal(keys.get("id"));
setupEntityCondition(cb, keys);
}).orElse(null);
if (failureUrl == null) {
// TODO exception?
return null;
}
return failureUrl;
public OptionalEntity<FailureUrl> getFailureUrl(final String id) {
return failureUrlBhv.selectByPK(id);
}
public void store(final FailureUrl failureUrl) {

View file

@ -29,6 +29,7 @@ import org.codelibs.fess.es.config.exbhv.JobLogBhv;
import org.codelibs.fess.es.config.exentity.JobLog;
import org.codelibs.fess.util.ComponentUtil;
import org.dbflute.cbean.result.PagingResultBean;
import org.dbflute.optional.OptionalEntity;
public class JobLogService implements Serializable {
@ -57,17 +58,8 @@ public class JobLogService implements Serializable {
return jobLogList;
}
public JobLog getJobLog(final Map<String, String> keys) {
final JobLog jobLog = jobLogBhv.selectEntity(cb -> {
cb.query().docMeta().setId_Equal(keys.get("id"));
setupEntityCondition(cb, keys);
}).orElse(null);//TODO
if (jobLog == null) {
// TODO exception?
return null;
}
return jobLog;
public OptionalEntity<JobLog> getJobLog(final String id) {
return jobLogBhv.selectByPK(id);
}
public void store(final JobLog jobLog) {

View file

@ -195,7 +195,7 @@ public class AdminBoostdocumentruleAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
boostDocumentRuleService.getBoostDocumentRule(id).ifPresent(entity -> {

View file

@ -137,10 +137,10 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
}
// -----------------------------------------------------
// Confirm
// Details
// -------
@Execute
public HtmlResponse confirmpage(final int crudMode, final String id) {
public HtmlResponse details(final int crudMode, final String id) {
verifyCrudMode(crudMode, CrudMode.DETAILS);
return asHtml(path_AdminCrawlingsession_DetailsJsp).useForm(EditForm.class, op -> {
op.setup(form -> {
@ -163,7 +163,7 @@ public class AdminCrawlingsessionAction extends FessAdminAction {
// -------------
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toIndexHtml());
final String id = form.id;
crawlingSessionService.getCrawlingSession(id).alwaysPresent(entity -> {

View file

@ -290,7 +290,7 @@ public class AdminDictKuromojiAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
kuromojiService.getKuromojiItem(form.dictId, form.id).ifPresent(entity -> {
kuromojiService.delete(form.dictId, entity);

View file

@ -323,7 +323,7 @@ public class AdminDictSynonymAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
synonymService.getSynonymItem(form.dictId, form.id).ifPresent(entity -> {
synonymService.delete(form.dictId, entity);

View file

@ -15,21 +15,19 @@
*/
package org.codelibs.fess.app.web.admin.failureurl;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.codelibs.fess.Constants;
import org.codelibs.fess.app.pager.FailureUrlPager;
import org.codelibs.fess.app.service.FailureUrlService;
import org.codelibs.fess.app.web.CrudMode;
import org.codelibs.fess.app.web.base.FessAdminAction;
import org.codelibs.fess.es.config.exentity.FailureUrl;
import org.codelibs.fess.helper.SystemHelper;
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.validation.VaErrorHook;
/**
* @author codelibs
@ -60,14 +58,14 @@ public class AdminFailureurlAction extends FessAdminAction {
// Search Execute
// ==============
@Execute
public HtmlResponse index(final FailureUrlSearchForm form) {
public HtmlResponse index(final SearchForm form) {
return asHtml(path_AdminFailureurl_IndexJsp).renderWith(data -> {
searchPaging(data, form);
});
}
@Execute
public HtmlResponse list(final Integer pageNumber, final FailureUrlSearchForm form) {
public HtmlResponse list(final Integer pageNumber, final SearchForm form) {
failureUrlPager.setCurrentPageNumber(pageNumber);
return asHtml(path_AdminFailureurl_IndexJsp).renderWith(data -> {
searchPaging(data, form);
@ -75,15 +73,15 @@ public class AdminFailureurlAction extends FessAdminAction {
}
@Execute
public HtmlResponse search(final FailureUrlSearchForm form) {
copyBeanToBean(form.searchParams, failureUrlPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
public HtmlResponse search(final SearchForm form) {
copyBeanToBean(form, failureUrlPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
return asHtml(path_AdminFailureurl_IndexJsp).renderWith(data -> {
searchPaging(data, form);
});
}
@Execute
public HtmlResponse reset(final FailureUrlSearchForm form) {
public HtmlResponse reset(final SearchForm form) {
failureUrlPager.clear();
return asHtml(path_AdminFailureurl_IndexJsp).renderWith(data -> {
searchPaging(data, form);
@ -91,30 +89,37 @@ public class AdminFailureurlAction extends FessAdminAction {
}
@Execute
public HtmlResponse back(final FailureUrlSearchForm form) {
public HtmlResponse back(final SearchForm form) {
return asHtml(path_AdminFailureurl_IndexJsp).renderWith(data -> {
searchPaging(data, form);
});
}
protected void searchPaging(final RenderData data, final FailureUrlSearchForm form) {
protected void searchPaging(final RenderData data, final SearchForm form) {
data.register("failureUrlItems", failureUrlService.getFailureUrlList(failureUrlPager)); // page navi
// restore from pager
copyBeanToBean(failureUrlPager, form.searchParams, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
copyBeanToBean(failureUrlPager, form, op -> op.include("id"));
}
// -----------------------------------------------------
// Confirm
// Details
// -------
@Execute
public HtmlResponse confirmpage(final int crudMode, final String id, final FailureUrlEditForm form) {
// TODO
// form.crudMode = crudMode;
// form.id = id;
// verifyCrudMode(form, CrudMode.CONFIRM);
loadFailureUrl(form);
return asHtml(path_AdminFailureurl_DetailsJsp);
public HtmlResponse details(final int crudMode, final String id) {
verifyCrudMode(crudMode, CrudMode.DETAILS);
return asHtml(path_AdminFailureurl_DetailsJsp).useForm(EditForm.class, op -> {
op.setup(form -> {
failureUrlService.getFailureUrl(id).ifPresent(entity -> {
copyBeanToBean(entity, form, copyOp -> {
copyOp.excludeNull();
});
form.crudMode = crudMode;
}).orElse(() -> {
throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
});
});
});
}
// -----------------------------------------------------
@ -122,40 +127,39 @@ public class AdminFailureurlAction extends FessAdminAction {
// -------------
@Execute
public HtmlResponse delete(final FailureUrlEditForm form) {
// TODO verifyCrudMode(form, CrudMode.DELETE);
failureUrlService.delete(getFailureUrl(form));
saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toIndexHtml());
String id = form.id;
failureUrlService.getFailureUrl(id).alwaysPresent(entity -> {
failureUrlService.delete(entity);
saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
});
return redirect(getClass());
}
@Execute
public HtmlResponse deleteall(final FailureUrlEditForm form) {
public HtmlResponse deleteall(final EditForm form) {
validate(form, messages -> {}, toIndexHtml());
failureUrlService.deleteAll(failureUrlPager);
saveInfo(messages -> messages.addSuccessFailureUrlDeleteAll(GLOBAL));
return redirect(getClass());
}
// ===================================================================================
// Assist Logic
// Small Helper
// ============
protected void loadFailureUrl(final FailureUrlEditForm form) {
copyBeanToBean(getFailureUrl(form), form, op -> op.exclude("crudMode"));
}
protected FailureUrl getFailureUrl(final FailureUrlEditForm form) {
final FailureUrl failureUrl = failureUrlService.getFailureUrl(createKeyMap(form));
if (failureUrl == null) {
// TODO
protected void verifyCrudMode(final int crudMode, final int expectedMode) {
if (crudMode != expectedMode) {
throwValidationError(messages -> {
messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
}, toIndexHtml());
}
return failureUrl;
}
protected Map<String, String> createKeyMap(final FailureUrlEditForm form) {
final Map<String, String> keys = new HashMap<String, String>();
keys.put("id", form.id);
return keys;
protected VaErrorHook toIndexHtml() {
return () -> {
return asHtml(path_AdminJoblog_IndexJsp);
};
}
}

View file

@ -19,11 +19,16 @@ import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Size;
import org.lastaflute.web.validation.Required;
/**
* @author codelibs
* @author Keiichi Watanabe
*/
public class FailureUrlEditForm implements Serializable {
public class EditForm implements Serializable {
private static final long serialVersionUID = 1L;
@ -31,12 +36,12 @@ public class FailureUrlEditForm implements Serializable {
public String fileConfigName;
//@Digits(integer=10, fraction=0)
@Digits(integer = 10, fraction = 0)
public String pageNumber;
public Map<String, String> searchParams = new HashMap<String, String>();
//@Digits(integer=10, fraction=0)
@Digits(integer = 10, fraction = 0)
// TODO necessary?
public int crudMode;
@ -44,29 +49,28 @@ public class FailureUrlEditForm implements Serializable {
return pageNumber;
}
//@Required(target = "confirmfromupdate,update,delete")
//@Maxbytelength(maxbytelength = 1000)
@Required
@Size(max = 1000)
public String id;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
@Required
public String url;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
@Required
public String threadName;
public String errorName;
public String errorLog;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
//@Digits(integer=10, fraction=0)
@Required
@Digits(integer = 10, fraction = 0)
public String errorCount;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
//@DateType(datePattern = Constants.DEFAULT_DATETIME_FORMAT)
@Required
public String lastAccessTime;
//@Maxbytelength(maxbytelength = 1000)
@Size(max = 1000)
public String configId;
public void initialize() {
@ -80,4 +84,4 @@ public class FailureUrlEditForm implements Serializable {
configId = null;
}
}
}

View file

@ -23,9 +23,11 @@ import java.util.Map;
* @author codelibs
* @author Keiichi Watanabe
*/
public class FailureUrlSearchForm implements Serializable {
public class SearchForm implements Serializable {
private static final long serialVersionUID = 1L;
public String id;
public Map<String, String> searchParams = new HashMap<String, String>();
}
}

View file

@ -217,7 +217,7 @@ public class AdminFileauthenticationAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
fileAuthenticationService.getFileAuthentication(id).ifPresent(entity -> {

View file

@ -200,7 +200,7 @@ public class AdminGroupAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
groupService.getGroup(id).ifPresent(entity -> {

View file

@ -15,9 +15,6 @@
*/
package org.codelibs.fess.app.web.admin.joblog;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.codelibs.fess.Constants;
@ -25,7 +22,6 @@ import org.codelibs.fess.app.pager.JobLogPager;
import org.codelibs.fess.app.service.JobLogService;
import org.codelibs.fess.app.web.CrudMode;
import org.codelibs.fess.app.web.base.FessAdminAction;
import org.codelibs.fess.es.config.exentity.JobLog;
import org.codelibs.fess.helper.SystemHelper;
import org.lastaflute.web.Execute;
import org.lastaflute.web.callback.ActionRuntime;
@ -63,14 +59,14 @@ public class AdminJoblogAction extends FessAdminAction {
// Search Execute
// ==============
@Execute
public HtmlResponse index(final JobLogSearchForm form) {
public HtmlResponse index(final SearchForm form) {
return asHtml(path_AdminJoblog_IndexJsp).renderWith(data -> {
searchPaging(data, form);
});
}
@Execute
public HtmlResponse list(final Integer pageNumber, final JobLogSearchForm form) {
public HtmlResponse list(final Integer pageNumber, final SearchForm form) {
jobLogPager.setCurrentPageNumber(pageNumber);
return asHtml(path_AdminJoblog_IndexJsp).renderWith(data -> {
searchPaging(data, form);
@ -78,15 +74,15 @@ public class AdminJoblogAction extends FessAdminAction {
}
@Execute
public HtmlResponse search(final JobLogSearchForm form) {
copyBeanToBean(form.searchParams, jobLogPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
public HtmlResponse search(final SearchForm form) {
copyBeanToBean(form, jobLogPager, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
return asHtml(path_AdminJoblog_IndexJsp).renderWith(data -> {
searchPaging(data, form);
});
}
@Execute
public HtmlResponse reset(final JobLogSearchForm form) {
public HtmlResponse reset(final SearchForm form) {
jobLogPager.clear();
return asHtml(path_AdminJoblog_IndexJsp).renderWith(data -> {
searchPaging(data, form);
@ -94,17 +90,17 @@ public class AdminJoblogAction extends FessAdminAction {
}
@Execute
public HtmlResponse back(final JobLogSearchForm form) {
public HtmlResponse back(final SearchForm form) {
return asHtml(path_AdminJoblog_IndexJsp).renderWith(data -> {
searchPaging(data, form);
});
}
protected void searchPaging(final RenderData data, final JobLogSearchForm form) {
protected void searchPaging(final RenderData data, final SearchForm form) {
data.register("jobLogItems", jobLogService.getJobLogList(jobLogPager)); // page navi
// restore from pager
copyBeanToBean(jobLogPager, form.searchParams, op -> op.exclude(Constants.PAGER_CONVERSION_RULE));
copyBeanToBean(jobLogPager, form, op -> op.include("id"));
}
// ===================================================================================
@ -114,69 +110,81 @@ public class AdminJoblogAction extends FessAdminAction {
// Entry Page
// ----------
@Execute(token = TxToken.SAVE)
public HtmlResponse deletepage(final int crudMode, final String id, final JobLogEditForm form) {
form.crudMode = crudMode;
form.id = id;
verifyCrudMode(form, CrudMode.DELETE);
loadJobLog(form);
return asHtml(path_AdminJoblog_DetailsJsp);
public HtmlResponse deletepage(final int crudMode, final String id) {
verifyCrudMode(crudMode, CrudMode.DELETE);
return asHtml(path_AdminJoblog_DetailsJsp).useForm(EditForm.class, op -> {
op.setup(form -> {
jobLogService.getJobLog(id).ifPresent(entity -> {
copyBeanToBean(entity, form, copyOp -> {
copyOp.excludeNull();
});
}).orElse(() -> {
throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
});
form.crudMode = crudMode;
});
});
}
@Execute(token = TxToken.SAVE)
public HtmlResponse deletefromconfirm(final JobLogEditForm form) {
public HtmlResponse deletefromconfirm(final EditForm form) {
form.crudMode = CrudMode.DELETE;
loadJobLog(form);
validate(form, messages -> {}, toIndexHtml());
String id = form.id;
jobLogService.getJobLog(id).ifPresent(entity -> {
copyBeanToBean(entity, form, op -> {});
}).orElse(() -> {
throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
});
return asHtml(path_AdminJoblog_DetailsJsp);
}
// -----------------------------------------------------
// Confirm
// Details
// -------
@Execute
public HtmlResponse confirmpage(final int crudMode, final String id, final JobLogEditForm form) {
form.crudMode = crudMode;
form.id = id;
verifyCrudMode(form, CrudMode.DETAILS);
loadJobLog(form);
return asHtml(path_AdminJoblog_DetailsJsp);
public HtmlResponse details(final int crudMode, final String id) {
verifyCrudMode(crudMode, CrudMode.DETAILS);
return asHtml(path_AdminJoblog_DetailsJsp).useForm(EditForm.class, op -> {
op.setup(form -> {
jobLogService.getJobLog(id).ifPresent(entity -> {
copyBeanToBean(entity, form, copyOp -> {
copyOp.excludeNull();
});
form.crudMode = crudMode;
}).orElse(() -> {
throwValidationError(messages -> messages.addErrorsCrudCouldNotFindCrudTable(GLOBAL, id), toIndexHtml());
});
});
});
}
// -----------------------------------------------------
// Actually Crud
// -------------
@Execute
public HtmlResponse delete(final JobLogEditForm form) {
verifyCrudMode(form, CrudMode.DELETE);
jobLogService.delete(getJobLog(form));
saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toIndexHtml());
String id = form.id;
jobLogService.getJobLog(id).alwaysPresent(entity -> {
jobLogService.delete(entity);
saveInfo(messages -> messages.addSuccessCrudDeleteCrudTable(GLOBAL));
});
return redirect(getClass());
}
// ===================================================================================
// Assist Logic
// ============
protected void loadJobLog(final JobLogEditForm form) {
copyBeanToBean(getJobLog(form), form, op -> op.exclude("crudMode"));
}
protected JobLog getJobLog(final JobLogEditForm form) {
final JobLog jobLog = jobLogService.getJobLog(createKeyMap(form));
return jobLog;
}
protected Map<String, String> createKeyMap(final JobLogEditForm form) {
final Map<String, String> keys = new HashMap<String, String>();
keys.put("id", form.id);
return keys;
}
// ===================================================================================
// Small Helper
// ============
protected void verifyCrudMode(final JobLogEditForm form, final int expectedMode) {
if (form.crudMode != expectedMode) {
protected void verifyCrudMode(final int crudMode, final int expectedMode) {
if (crudMode != expectedMode) {
throwValidationError(messages -> {
messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(form.crudMode));
messages.addErrorsCrudInvalidMode(GLOBAL, String.valueOf(expectedMode), String.valueOf(crudMode));
}, toIndexHtml());
}
}

View file

@ -17,42 +17,44 @@ package org.codelibs.fess.app.web.admin.joblog;
import java.io.Serializable;
import javax.validation.constraints.Digits;
import org.lastaflute.web.validation.Required;
/**
* @author codelibs
* @author Shunji Makino
*/
public class JobLogEditForm implements Serializable {
public class EditForm implements Serializable {
private static final long serialVersionUID = 1L;
//@Digits(integer=10, fraction=0)
@Digits(integer = 10, fraction = 0)
public int crudMode;
//@Required(target = "confirmfromupdate,update,delete")
//@Digits(integer=19, fraction=0)
@Required
@Digits(integer = 19, fraction = 0)
public String id;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
@Required
public String jobName;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
@Required
public String jobStatus;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
@Required
public String target;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
@Required
public String scriptType;
public String scriptData;
public String scriptResult;
//@Required(target = "confirmfromcreate,create,confirmfromupdate,update,delete")
//@DateType(datePattern = Constants.DEFAULT_DATETIME_FORMAT)
@Required
public String startTime;
//@DateType(datePattern = Constants.DEFAULT_DATETIME_FORMAT)
public String endTime;
public void initialize() {
@ -66,4 +68,4 @@ public class JobLogEditForm implements Serializable {
startTime = null;
endTime = null;
}
}
}

View file

@ -16,16 +16,14 @@
package org.codelibs.fess.app.web.admin.joblog;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* @author codelibs
* @author Shunji Makino
*/
public class JobLogSearchForm implements Serializable {
public class SearchForm implements Serializable {
private static final long serialVersionUID = 1L;
public Map<String, String> searchParams = new HashMap<String, String>();
}
public String id;
}

View file

@ -196,7 +196,7 @@ public class AdminOverlappinghostAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
overlappingHostService.getOverlappingHost(id).ifPresent(entity -> {

View file

@ -197,7 +197,7 @@ public class AdminPathmappingAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
pathMappingService.getPathMapping(id).ifPresent(entity -> {

View file

@ -219,7 +219,7 @@ public class AdminRequestheaderAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
requestHeaderService.getRequestHeader(id).ifPresent(entity -> {

View file

@ -200,7 +200,7 @@ public class AdminRoleAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
roleService.getRole(id).ifPresent(entity -> {

View file

@ -196,7 +196,7 @@ public class AdminRoletypeAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
roleTypeService.getRoleType(id).ifPresent(entity -> {

View file

@ -200,7 +200,7 @@ public class AdminScheduledjobAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
scheduledJobService.getScheduledJob(id).ifPresent(entity -> {

View file

@ -245,7 +245,7 @@ public class AdminSuggestbadwordAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
suggestBadWordService.getSuggestBadWord(id).ifPresent(entity -> {

View file

@ -245,7 +245,7 @@ public class AdminSuggestelevatewordAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
suggestElevateWordService.getSuggestElevateWord(id).ifPresent(entity -> {

View file

@ -230,7 +230,7 @@ public class AdminUserAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
userService.getUser(id).ifPresent(entity -> {

View file

@ -218,7 +218,7 @@ public class AdminWebauthenticationAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
webAuthenticationService.getWebAuthentication(id).ifPresent(entity -> {

View file

@ -209,7 +209,7 @@ public class AdminWebconfigAction extends FessAdminAction {
@Execute
public HtmlResponse delete(final EditForm form) {
verifyCrudMode(form.crudMode, CrudMode.DELETE);
verifyCrudMode(form.crudMode, CrudMode.DETAILS);
validate(form, messages -> {}, toEditHtml());
final String id = form.id;
webConfigService.getWebConfig(id).ifPresent(entity -> {

View file

@ -41,12 +41,19 @@ public class QueryContext {
private final Set<String> highlightedQuerySet = new HashSet<>();
private final Map<String, List<String>> fieldLogMap = new HashMap<>();
private Map<String, List<String>> fieldLogMap;
public QueryContext(final String queryString) {
this.queryString = queryString;
LaRequestUtil.getOptionalRequest().ifPresent(request -> {
request.setAttribute(Constants.HIGHLIGHT_QUERIES, highlightedQuerySet);
@SuppressWarnings("unchecked")
final Map<String, List<String>> existFieldLogMap = (Map<String, List<String>>) request.getAttribute(Constants.FIELD_LOGS);
if (existFieldLogMap != null) {
fieldLogMap = existFieldLogMap;
} else {
fieldLogMap = new HashMap<>();
}
request.setAttribute(Constants.FIELD_LOGS, fieldLogMap);
});
}

View file

@ -190,6 +190,8 @@ public class SearchLogHelper {
if (!searchLogList.isEmpty()) {
storeSearchLogList(searchLogList);
final SuggestHelper suggestHelper = ComponentUtil.getSuggestHelper();
suggestHelper.indexFromSearchLog(searchLogList);
}
}

View file

@ -15,7 +15,6 @@
*/
package org.codelibs.fess.helper;
import java.io.File;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
@ -25,9 +24,13 @@ import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import org.codelibs.core.lang.StringUtil;
import org.codelibs.fess.es.client.FessEsClient;
import org.codelibs.fess.es.config.exbhv.SuggestBadWordBhv;
import org.codelibs.fess.es.config.exbhv.SuggestElevateWordBhv;
import org.codelibs.fess.es.config.exentity.SuggestBadWord;
import org.codelibs.fess.es.log.exentity.SearchFieldLog;
import org.codelibs.fess.es.log.exentity.SearchLog;
import org.codelibs.fess.suggest.Suggester;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ -40,34 +43,68 @@ public class SuggestHelper {
@Resource
protected SuggestBadWordBhv suggestBadWordBhv;
public String badwordFileDir = "./solr/core1/conf/";
@Resource
protected FessEsClient fessEsClient;
@Resource
protected FieldHelper fieldHelper;
public String[] contentFieldNames = { "_default" };
public String[] tagFieldNames = { "label" };
public String[] roleFieldNames = { "role" };
private static final String TEXT_SEP = " ";
protected Suggester suggester;
@PostConstruct
public void init() {
final Thread th = new Thread(() -> {
// TODO replace with Elasticsearch
/*
while (true) {
final PingResponse response = searchService.ping();
final int status = response.getStatus();
if (status == 0) {
if (logger.isInfoEnabled()) {
logger.info("Solr server was availabled. Refresh suggest words.");
}
refreshWords();
break;
}
try {
Thread.sleep(1 * 1000);
} catch (final InterruptedException e) {
//ignore
}
}
*/
});
fessEsClient.admin().cluster().prepareHealth().setWaitForYellowStatus().execute().actionGet();
suggester = Suggester.builder().build(fessEsClient, fieldHelper.docIndex);
suggester.createIndexIfNothing();
});
th.start();
}
public Suggester suggester() {
return suggester;
}
public void indexFromSearchLog(final List<SearchLog> searchLogList) {
for (final SearchLog searchLog : searchLogList) {
// TODO if(getHitCount == 0) continue;
final StringBuilder sb = new StringBuilder();
final List<String> fields = new ArrayList<>();
final List<String> tags = new ArrayList<>();
final List<String> roles = new ArrayList<>();
for (final SearchFieldLog searchFieldLog : searchLog.getSearchFieldLogList()) {
final String name = searchFieldLog.getName();
if (isContentField(name)) {
if (sb.length() > 0) {
sb.append(TEXT_SEP);
}
sb.append(searchFieldLog.getValue());
fields.add(name);
} else if (isTagField(name)) {
tags.add(searchFieldLog.getValue());
} else if (isRoleField(name)) {
roles.add(searchFieldLog.getValue());
}
}
if (sb.length() > 0) {
suggester.indexer().indexFromSearchWord(sb.toString(), fields.toArray(new String[fields.size()]),
tags.toArray(new String[tags.size()]), roles.toArray(new String[roles.size()]), 1);
}
}
suggester.refresh();
}
public void refreshWords() {
deleteAllBadWord();
storeAllElevateWords();
@ -143,6 +180,7 @@ public class SuggestHelper {
// suggestService.commit();
}
/*
public void updateSolrBadwordFile() {
suggestBadWordBhv.selectList(cb -> {
cb.query().matchAll();
@ -179,4 +217,32 @@ public class SuggestHelper {
// }
// }
}
*/
protected boolean isContentField(final String field) {
for (final String contentField : contentFieldNames) {
if (contentField.equals(field)) {
return true;
}
}
return false;
}
protected boolean isTagField(final String field) {
for (final String tagField : tagFieldNames) {
if (tagField.equals(field)) {
return true;
}
}
return false;
}
protected boolean isRoleField(final String field) {
for (final String roleField : roleFieldNames) {
if (roleField.equals(field)) {
return true;
}
}
return false;
}
}

View file

@ -2501,8 +2501,14 @@ public class FessLabels extends ActionMessages {
/** The key of the message: Last Access */
public static final String LABELS_failure_url_last_access_time = "{labels.failure_url_last_access_time}";
/** The key of the message: Confirm */
public static final String LABELS_failure_url_link_confirm = "{labels.failure_url_link_confirm}";
/** The key of the message: List */
public static final String LABELS_failure_url_link_list = "{labels.failure_url_link_list}";
/** The key of the message: Details */
public static final String LABELS_failure_url_link_details = "{labels.failure_url_link_details}";
/** The key of the message: Delete */
public static final String LABELS_failure_url_link_delete = "{labels.failure_url_link_delete}";
/** The key of the message: Delete All */
public static final String LABELS_failure_url_delete_all_link = "{labels.failure_url_delete_all_link}";
@ -2517,7 +2523,7 @@ public class FessLabels extends ActionMessages {
public static final String LABELS_failure_url_error_count = "{labels.failure_url_error_count}";
/** The key of the message: Failure URL Details */
public static final String LABELS_failure_url_title_confirm = "{labels.failure_url_title_confirm}";
public static final String LABELS_failure_url_title_details = "{labels.failure_url_title_details}";
/** The key of the message: ID */
public static final String LABELS_failure_url_id = "{labels.failure_url_id}";
@ -2971,11 +2977,11 @@ public class FessLabels extends ActionMessages {
/** The key of the message: Job Log List */
public static final String LABELS_joblog_title_list = "{labels.joblog_title_list}";
/** The key of the message: Delete All */
public static final String LABELS_joblog_delete_all_link = "{labels.joblog_delete_all_link}";
/** The key of the message: Delete */
public static final String LABELS_joblog_delete_link = "{labels.joblog_delete_link}";
/** The key of the message: Do you really want to delete all? */
public static final String LABELS_joblog_delete_all_confirmation = "{labels.joblog_delete_all_confirmation}";
/** The key of the message: Do you really want to delete? */
public static final String LABELS_joblog_delete_confirmation = "{labels.joblog_delete_confirmation}";
/** The key of the message: Dictionary List */
public static final String LABELS_dict_configuration = "{labels.dict_configuration}";

View file

@ -41,6 +41,7 @@ import org.codelibs.fess.helper.PathMappingHelper;
import org.codelibs.fess.helper.QueryHelper;
import org.codelibs.fess.helper.SambaHelper;
import org.codelibs.fess.helper.SearchLogHelper;
import org.codelibs.fess.helper.SuggestHelper;
import org.codelibs.fess.helper.SystemHelper;
import org.codelibs.fess.helper.UserAgentHelper;
import org.codelibs.fess.helper.UserInfoHelper;
@ -280,4 +281,7 @@ public final class ComponentUtil {
return SingletonLaContainerFactory.getContainer().hasComponentDef(QUERY_HELPER);
}
public static SuggestHelper getSuggestHelper() {
return getComponent(SuggestHelper.class);
}
}

View file

@ -240,7 +240,4 @@
<arg>"Mozilla/5.0 (compatible; Fess/" + org.codelibs.fess.Constants.FESS_VERSION + "; +http://fess.codelibs.org/bot.html)"</arg>
</component>
<component name="suggestHelper" class="org.codelibs.fess.helper.SuggestHelper">
</component>
</components>

View file

@ -144,4 +144,6 @@
<property name="roleSeparator">","</property>
-->
</component>
<component name="suggestHelper" class="org.codelibs.fess.helper.SuggestHelper">
</component>
</components>

View file

@ -852,12 +852,14 @@ labels.failure_url_search_error_count=Error Count
labels.failure_url_search_error_name=Type
labels.failure_url_url=URL
labels.failure_url_last_access_time=Last Access
labels.failure_url_link_confirm=Confirm
labels.failure_url_link_list=List
labels.failure_url_link_details=Details
labels.failure_url_link_delete=Delete
labels.failure_url_delete_all_link=Delete All
labels.failure_url_delete_all_confirmation=Do you really want to delete all?
labels.failure_url_delete_all_cancel=Cancel
labels.failure_url_error_count=Error Count
labels.failure_url_title_confirm=Failure URL Details
labels.failure_url_title_details=Failure URL Details
labels.failure_url_id=ID
labels.failure_url_thread_name=Thread Name
labels.failure_url_error_name=Type
@ -1012,8 +1014,8 @@ labels.joblog_target=Target
labels.joblog_title_confirm=Confirm Job Log
labels.joblog_title_details=Job Log Details
labels.joblog_title_list=Job Log List
labels.joblog_delete_all_link=Delete All
labels.joblog_delete_all_confirmation=Do you really want to delete all?
labels.joblog_delete_link=Delete
labels.joblog_delete_confirmation=Do you really want to delete?
labels.dict_configuration=Dictionary List
labels.dict_list_title=Dictionary List
labels.dict_list_link=Dictionaries

View file

@ -56,6 +56,7 @@
<div class="form-group">
<button type="submit" class="btn btn-primary" name="search"
value="<la:message key="labels.crawling_session_search" />">
<i class="fa fa-search"></i>
<la:message key="labels.crawling_session_search" />
</button>
<button type="submit" class="btn btn-secondary" name="reset"
@ -66,131 +67,128 @@
</la:form>
</div>
</div>
<div class="data-wrapper">
<%-- List --%>
<c:if test="${crawlingSessionPager.allRecordCount == 0}">
<div class="row top10">
<div class="col-sm-12">
<p class="callout callout-info">
<la:message key="labels.list_could_not_find_crud_table" />
</p>
</div>
<%-- List --%>
<c:if test="${crawlingSessionPager.allRecordCount == 0}">
<div class="row top10">
<div class="col-sm-12">
<p class="callout callout-info">
<la:message key="labels.list_could_not_find_crud_table" />
</p>
</div>
</c:if>
<c:if test="${crawlingSessionPager.allRecordCount > 0}">
<div class="row">
<div class="col-sm-12">
<table class="table table-bordered table-striped dataTable">
<thead>
<tr>
<th><la:message
key="labels.crawling_session_session_id" /></th>
<th><la:message
key="labels.crawling_session_created_time" /></th>
</div>
</c:if>
<c:if test="${crawlingSessionPager.allRecordCount > 0}">
<div class="row top10">
<div class="col-sm-12">
<table class="table table-bordered table-striped dataTable">
<thead>
<tr>
<th><la:message
key="labels.crawling_session_session_id" /></th>
<th><la:message
key="labels.crawling_session_created_time" /></th>
</tr>
</thead>
<tbody>
<c:forEach var="data" varStatus="s"
items="${crawlingSessionItems}">
<tr class="${s.index % 2 == 0 ? 'row1' : 'row2'}"
data-href="${contextPath}/admin/crawlingsession/details/4/${f:u(data.id)}">
<td>${f:h(data.sessionId)}</td>
<td><fmt:formatDate
value="${fe:date(data.createdTime)}"
pattern="yyyy-MM-dd'T'HH:mm:ss" /></td>
</tr>
</thead>
<tbody>
<c:forEach var="data" varStatus="s"
items="${crawlingSessionItems}">
<tr class="${s.index % 2 == 0 ? 'row1' : 'row2'}"
data-href="${contextPath}/admin/crawlingsession/details/4/${f:u(data.id)}">
<td>${f:h(data.sessionId)}</td>
<td><fmt:formatDate
value="${fe:date(data.createdTime)}"
pattern="yyyy-MM-dd'T'HH:mm:ss" /></td>
</tr>
</c:forEach>
</tbody>
</table>
</div>
</div>
<%-- Paging Info --%>
<div class="row">
<div class="col-sm-5">
<span><la:message
key="labels.pagination_page_guide_msg"
arg0="${f:h(crawlingSessionPager.currentPageNumber)}"
arg1="${f:h(crawlingSessionPager.allPageCount)}"
arg2="${f:h(crawlingSessionPager.allRecordCount)}" /></span>
</div>
<div class="col-sm-7">
<%-- Paging Navigation --%>
<ul class="pagination pagination-sm no-margin pull-right">
<c:if test="${crawlingSessionPager.existPrePage}">
<li class="prev"><la:link
href="list/${crawlingSessionPager.currentPageNumber - 1}">
<la:message key="labels.crud_link_prev_page" />
</la:link></li>
</c:if>
<c:if test="${!crawlingSessionPager.existPrePage}">
<li class="prev disabled"><a href="#"><la:message
key="labels.crud_link_prev_page" /></a></li>
</c:if>
<c:forEach var="p" varStatus="s"
items="${crawlingSessionPager.pageNumberList}">
<li
<c:if test="${p == crawlingSessionPager.currentPageNumber}">class="active"</c:if>><la:link
href="list/${p}">${p}</la:link></li>
</c:forEach>
<c:if test="${crawlingSessionPager.existNextPage}">
<li class="next"><la:link
href="list/${crawlingSessionPager.currentPageNumber + 1}">
<la:message key="labels.crud_link_next_page" />
</la:link></li>
</c:if>
<c:if test="${!crawlingSessionPager.existNextPage}">
<li class="next disabled"><a href="#"><la:message
key="labels.crud_link_next_page" /></a></li>
</c:if>
</ul>
</div>
</tbody>
</table>
</div>
<div class="row">
<div class="col-sm-12 center">
<button type="button" class="btn btn-danger"
data-toggle="modal" data-target="#confirmToDeleteAll">
<la:message key="labels.crawling_session_delete_all_link" />
</button>
</div>
<div class="modal modal-danger fade" id="confirmToDeleteAll"
tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">
<la:message
key="labels.crawling_session_delete_all_link" />
</h4>
</div>
<div class="modal-body">
<p>
<la:message
key="labels.crawling_session_delete_all_confirmation" />
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline pull-left"
data-dismiss="modal">
<la:message
key="labels.crawling_session_delete_all_cancel" />
</button>
<la:link href="deleteall" styleClass="btn btn-outline"
data-dismiss="modal">
<la:message
key="labels.crawling_session_delete_all_link" />
</la:link>
</div>
</div>
<%-- Paging Info --%>
<div class="row">
<div class="col-sm-5">
<span><la:message
key="labels.pagination_page_guide_msg"
arg0="${f:h(crawlingSessionPager.currentPageNumber)}"
arg1="${f:h(crawlingSessionPager.allPageCount)}"
arg2="${f:h(crawlingSessionPager.allRecordCount)}" /></span>
</div>
<div class="col-sm-7">
<%-- Paging Navigation --%>
<ul class="pagination pagination-sm no-margin pull-right">
<c:if test="${crawlingSessionPager.existPrePage}">
<li class="prev"><la:link
href="list/${crawlingSessionPager.currentPageNumber - 1}">
<la:message key="labels.crud_link_prev_page" />
</la:link></li>
</c:if>
<c:if test="${!crawlingSessionPager.existPrePage}">
<li class="prev disabled"><a href="#"><la:message
key="labels.crud_link_prev_page" /></a></li>
</c:if>
<c:forEach var="p" varStatus="s"
items="${crawlingSessionPager.pageNumberList}">
<li
<c:if test="${p == crawlingSessionPager.currentPageNumber}">class="active"</c:if>><la:link
href="list/${p}">${p}</la:link></li>
</c:forEach>
<c:if test="${crawlingSessionPager.existNextPage}">
<li class="next"><la:link
href="list/${crawlingSessionPager.currentPageNumber + 1}">
<la:message key="labels.crud_link_next_page" />
</la:link></li>
</c:if>
<c:if test="${!crawlingSessionPager.existNextPage}">
<li class="next disabled"><a href="#"><la:message
key="labels.crud_link_next_page" /></a></li>
</c:if>
</ul>
</div>
</div>
<div class="row">
<div class="col-sm-12 center">
<button type="button" class="btn btn-danger"
data-toggle="modal" data-target="#confirmToDeleteAll">
<i class="fa fa-trash"></i>
<la:message key="labels.crawling_session_delete_all_link" />
</button>
</div>
<div class="modal modal-danger fade" id="confirmToDeleteAll"
tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">
<la:message key="labels.crawling_session_delete_all_link" />
</h4>
</div>
<div class="modal-body">
<p>
<la:message
key="labels.crawling_session_delete_all_confirmation" />
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline pull-left"
data-dismiss="modal">
<la:message
key="labels.crawling_session_delete_all_cancel" />
</button>
<la:link href="deleteall" styleClass="btn btn-outline"
data-dismiss="modal">
<i class="fa fa-trash"></i>
<la:message key="labels.crawling_session_delete_all_link" />
</la:link>
</div>
</div>
</div>
</div>
</c:if>
</div>
<!-- /.data-wrapper -->
</div>
</c:if>
</div>
<!-- /.box-body -->
</div>

View file

@ -31,10 +31,7 @@
<la:hidden property="crudMode" />
<c:if test="${crudMode==2 || crudMode==3 || crudMode==4}">
<la:hidden property="id" />
<la:hidden property="versionNo" />
</c:if>
<la:hidden property="createdBy" />
<la:hidden property="createdTime" />
<div class="row">
<div class="col-md-12">
<div
@ -52,7 +49,7 @@
<la:message key="labels.failure_url_link_delete" />
</c:if>
<c:if test="${crudMode == 4}">
<la:message key="labels.failure_url_link_confirm" />
<la:message key="labels.failure_url_link_details" />
</c:if>
</h3>
<div class="btn-group pull-right">
@ -146,11 +143,44 @@
value="<la:message key="labels.crud_button_back" />">
<la:message key="labels.crud_button_back" />
</button>
<button type="submit" class="btn btn-danger"
name="deletefromconfirm"
<button type="button" class="btn btn-danger" name="delete"
data-toggle="modal" data-target="#confirmToDelete"
value="<la:message key="labels.crud_button_delete" />">
<la:message key="labels.crud_button_delete" />
</button>
<div class="modal modal-danger fade" id="confirmToDelete"
tabindex="-1" role="dialog">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal"
aria-label="Close">
<span aria-hidden="true">×</span>
</button>
<h4 class="modal-title">
<la:message key="labels.crud_title_delete" />
</h4>
</div>
<div class="modal-body">
<p>
<la:message key="labels.crud_delete_confirmation" />
</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-outline pull-left"
data-dismiss="modal">
<la:message key="labels.crud_button_cancel" />
</button>
<button type="submit" class="btn btn-outline btn-danger"
name="delete"
value="<la:message key="labels.crud_button_delete" />">
<i class="fa fa-trash"></i>
<la:message key="labels.crud_button_delete" />
</button>
</div>
</div>
</div>
</div>
</c:if>
</div>
</div>

View file

@ -13,10 +13,7 @@
<jsp:param name="menuCategoryType" value="log" />
<jsp:param name="menuType" value="failureUrl" />
</jsp:include>
<div class="content-wrapper">
<%-- Content Header --%>
<section class="content-header">
<h1>
<la:message key="labels.failure_url_configuration" />
@ -78,6 +75,7 @@
<div class="col-sm-offset-2 col-sm-10">
<button type="submit" class="btn btn-primary" name="search"
value="<la:message key="labels.crud_button_search" />">
<i class="fa fa-search"></i>
<la:message key="labels.crud_button_search" />
</button>
<button type="reset" class="btn btn-secondary" name="reset"
@ -101,7 +99,7 @@
<c:if test="${failureUrlPager.allRecordCount > 0}">
<div class="row">
<div class="col-sm-12">
<table class="bordered-table zebra-striped dataTable">
<table class="table table-bordered table-striped dataTable">
<thead>
<tr>
<th><la:message key="labels.failure_url_url" /></th>
@ -112,15 +110,12 @@
<tbody>
<c:forEach var="data" varStatus="s"
items="${failureUrlItems}">
<tr class="${s.index % 2 == 0 ? 'row1' : 'row2'}">
<td><div style="width: 380px; overflow-x: auto;">${f:h(data.url)}</div></td>
<td>${f:h(data.lastAccessTimeForList)}</td>
<td style="overflow-x: auto;"><la:link
href="details/4/${f:u(data.id)}">
<la:message key="labels.failure_url_link_confirm" />
</la:link> <la:link href="deletepage/3/${f:u(data.id)}">
<la:message key="labels.crud_link_delete" />
</la:link></td>
<tr class="${s.index % 2 == 0 ? 'row1' : 'row2'}"
data-href="details/4/${f:u(data.id)}">
<td>${f:h(data.url)}</td>
<td><fmt:formatDate
value="${fe:date(data.lastAccessTime)}"
pattern="yyyy-MM-dd'T'HH:mm:ss" /></td>
</tr>
</c:forEach>
</tbody>
@ -219,7 +214,6 @@
</div>
</section>
</div>
<jsp:include page="/WEB-INF/view/common/admin/footer.jsp"></jsp:include>
</div>
<jsp:include page="/WEB-INF/view/common/admin/foot.jsp"></jsp:include>

View file

@ -49,7 +49,7 @@
<la:message key="labels.joblog_link_delete" />
</c:if>
<c:if test="${crudMode == 4}">
<la:message key="labels.joblog_link_confirm" />
<la:message key="labels.joblog_link_details" />
</c:if>
</h3>
<div class="btn-group pull-right">

View file

@ -76,10 +76,13 @@
</c:if> <c:if test="${data.endTime==null}">
<la:message key="labels.none" />
</c:if></td>
<td style="overflow-x: auto;"><la:link
<td><la:link styleClass="btn btn-xs btn-primary"
href="details/4/${f:u(data.id)}">
<i class="fa fa-check"></i>
<la:message key="labels.joblog_link_details" />
</la:link> <la:link href="deletepage/3/${f:u(data.id)}">
</la:link> <la:link styleClass="btn btn-xs btn-danger"
href="deletepage/3/${f:u(data.id)}">
<i class="fa fa-trash"></i>
<la:message key="labels.joblog_link_delete" />
</la:link></td>
</tr>

View file

@ -107,6 +107,20 @@
<!-- /.box-body -->
<div class="box-footer">
<jsp:include page="/WEB-INF/view/common/admin/crud/buttons.jsp"></jsp:include>
<c:if test="${running}">
<button type="submit" class="btn btn-danger" name="stop"
value="<la:message key="labels.scheduledjob_button_stop" />">
<i class="fa fa-stop"></i>
<la:message key="labels.scheduledjob_button_stop" />
</button>
</c:if>
<c:if test="${!running}">
<button type="submit" class="btn btn-success" name="start"
value="<la:message key="labels.scheduledjob_button_start" />">
<i class="fa fa-play-circle"></i>
<la:message key="labels.scheduledjob_button_start" />
</button>
</c:if>
</div>
<!-- /.box-footer -->
</div>

View file

@ -13,10 +13,7 @@
<jsp:param name="menuCategoryType" value="log" />
<jsp:param name="menuType" value="searchList" />
</jsp:include>
<div class="content-wrapper">
<%-- Content Header --%>
<section class="content-header">
<h1>
<la:message key="labels.search_list_configuration" />
@ -27,7 +24,6 @@
</la:link></li>
</ol>
</section>
<section class="content">
<div class="row">
<div class="col-xs-12">
@ -57,6 +53,7 @@
<div class="form-group">
<button type="submit" class="btn btn-primary" name="search"
value="<la:message key="labels.search"/>">
<i class="fa fa-search"></i>
<la:message key="labels.search" />
</button>
</div>
@ -124,8 +121,7 @@
<%-- TODO: doc_id --%>
<la:hidden property="docId"
value="${f:u(doc.doc_id)}" />
<la:hidden property="query"
value="${f:u(query)}" />
<la:hidden property="query" value="${f:u(query)}" />
<button type="submit"
class="btn btn-outline btn-danger">
<i class="fa fa-trash"></i>

View file

@ -2,33 +2,40 @@
<c:if test="${crudMode == 1}">
<button type="submit" class="btn" name="list"
value="<la:message key="labels.crud_button_back" />">
<i class="fa fa-arrow-circle-left"></i>
<la:message key="labels.crud_button_back" />
</button>
<button type="submit" class="btn btn-success" name="create"
value="<la:message key="labels.crud_button_create" />">
<i class="fa fa-plus"></i>
<la:message key="labels.crud_button_create" />
</button>
</c:if>
<c:if test="${crudMode == 2}">
<button type="submit" class="btn" name="edit" value="back">
<i class="fa fa-arrow-circle-left"></i>
<la:message key="labels.crud_button_back" />
</button>
<button type="submit" class="btn btn-warning" name="update"
value="<la:message key="labels.crud_button_update" />">
<i class="fa fa-pencil"></i>
<la:message key="labels.crud_button_update" />
</button>
</c:if>
<c:if test="${crudMode == 4}">
<button type="submit" class="btn" name="list" value="back">
<i class="fa fa-arrow-circle-left"></i>
<la:message key="labels.crud_button_back" />
</button>
<button type="submit" class="btn btn-warning" name="edit"
value="<la:message key="labels.crud_button_edit" />">
<i class="fa fa-pencil"></i>
<la:message key="labels.crud_button_edit" />
</button>
<button type="button" class="btn btn-danger" name="delete"
data-toggle="modal" data-target="#confirmToDelete"
value="<la:message key="labels.crud_button_delete" />">
<i class="fa fa-trash"></i>
<la:message key="labels.crud_button_delete" />
</button>
<div class="modal modal-danger fade" id="confirmToDelete" tabindex="-1"
@ -57,6 +64,7 @@
<button type="submit" class="btn btn-outline btn-danger"
name="delete"
value="<la:message key="labels.crud_button_delete" />">
<i class="fa fa-trash"></i>
<la:message key="labels.crud_button_delete" />
</button>
</div>

View file

@ -20,11 +20,13 @@
<c:choose>
<c:when test="${crudMode == null}">
<la:link href="createnew" styleClass="btn btn-success btn-xs">
<i class="fa fa-plus"></i>
<la:message key="labels.web_crawling_link_create_new" />
</la:link>
</c:when>
<c:otherwise>
<la:link href="/admin/webconfig" styleClass="btn btn-primary btn-xs">
<i class="fa fa-th-list"></i>
<la:message key="labels.crud_link_list" />
</la:link>
</c:otherwise>

View file

@ -20,8 +20,8 @@ $(function(){
$('#contentQuery').suggestor( {
ajaxinfo: {
url: contextPath + '/suggest', // TODO rename
fn: 'keyword',
url: contextPath + '/suggest',
fn: '_default',
num: 10
},
boxCssInfo: {

View file

@ -173,8 +173,8 @@ $(function(){
$('#query').suggestor( {
ajaxinfo: {
url: contextPath + '/json',
fn: 'content',
url: contextPath + '/suggest',
fn: '_default',
num: 10
},
boxCssInfo: {

View file

@ -1,7 +1,7 @@
;(function($){
$.fn.suggestor = function(setting) {
var $boxElement;
var $textArea;
var inputText = "";
@ -11,7 +11,7 @@ $.fn.suggestor = function(setting) {
var isMouseHover = false;
var started = false;
var interval = 5;
var settingMinTerm = 1;
var settingAjaxInfo;
var settingAdjustWidthVal;
@ -19,15 +19,15 @@ $.fn.suggestor = function(setting) {
var listSelectedCssInfo;
var listDeselectedCssInfo;
var boxCssInfo;
var suggestingSts = false;
var suggestor = {
init: function($element, setting) {
suggestingSts = false;
$boxElement = $("<div/>");
$boxElement.addClass("suggestorBox");
//style sheet
$boxElement.css("display","none");
$boxElement.css("position","absolute");
@ -42,14 +42,14 @@ $.fn.suggestor = function(setting) {
} else {
$boxElement.css(setting.boxCssInfo);
}
$textArea = $element;
$textArea.attr("autocomplete","off");
isFocusList = false;
inputText = $textArea.val();
//設定
settingAjaxInfo = setting.ajaxinfo;
settingMinTerm = setting.minturm;
@ -57,66 +57,71 @@ $.fn.suggestor = function(setting) {
listSelectedCssInfo = setting.listSelectedCssInfo;
listDeselectedCssInfo = setting.listDeselectedCssInfo;
settingAdjustWidthVal = setting.adjustWidthVal;
boxCssInfo = setting.boxCssInfo;
$boxElement.hover(function() {
isMouseHover = true;
}, function() {
isMouseHover = false;
});
//ポジション設定
this.resize();
var suggestor = this;
$(window).resize(function() {
suggestor.resize();
});
$("body").append($boxElement);
},
suggest: function() {
suggestingSts = true;
//ポジション設定
this.resize();
var suggestor = this;
inputText = $textArea.val();
listNum = 0;
listSelNum = 0;
if(inputText.length < settingMinTerm) {
$boxElement.css("display","none");
suggestingSts = false;
return;
}
$.ajax({
url: settingAjaxInfo.url,
type:"get",
dataType: "jsonp",
cache : false,
data:{ q: $textArea.val(),
data:{ query: $textArea.val(),
fields: settingAjaxInfo.fn,
num: settingAjaxInfo.num * 2
}
}).done(function(obj) { suggestor.createAutoCompleteList(obj); }).fail(function(a,obj,b) { suggestingSts=false; return; });
},
},
createAutoCompleteList: function(obj) {
var hits = obj.hits;
if(obj.response.status != 0) {
$boxElement.css("display","none");
return;
}
var hits = obj.response.result.hits;
var suggestor = this;
var addCount = 0;
listNum = 0;
if(typeof hits !== "undefined") {
var reslist = new Array();
@ -127,11 +132,11 @@ $.fn.suggestor = function(setting) {
$olEle.css("list-style","none");
$olEle.css("padding","0");
$olEle.css("margin","2px");
for(var i=0;i<reslist.length && listNum < settingAjaxInfo.num;i++) {
var str = reslist[i];
var chkCorrectWord = true;
/*
//suggestionの子要素かチェック
var parentEle = $(reslist[i]).closest("arr");
@ -141,7 +146,7 @@ $.fn.suggestor = function(setting) {
continue;
}
*/
//すでに同じ文字が表示されてないかチェック。ゴミ抜き
if(str === $textArea.val()) {
chkCorrectWord = false;
@ -155,7 +160,7 @@ $.fn.suggestor = function(setting) {
}
}
}
if(chkCorrectWord) {
var $liEle = $("<li/>");
$liEle.html(str);
@ -203,14 +208,14 @@ $.fn.suggestor = function(setting) {
listSelNum = 0
}
});
$liEle.css("padding","2px");
$olEle.append($liEle);
listNum++;
}
}
if(listNum>0 && $textArea.val().length >= settingMinTerm) {
$boxElement.html("");
$boxElement.append($olEle);
@ -223,15 +228,15 @@ $.fn.suggestor = function(setting) {
}
//ポジション設定
this.resize();
suggestingSts = false;
},
selectlist: function(direction) {
if($boxElement.css("display") == "none") {
return;
}
if(direction == "down") {
listSelNum++;
} else if(direction == "up") {
@ -239,15 +244,15 @@ $.fn.suggestor = function(setting) {
} else {
return;
}
isFocusList = true;
if(listSelNum < 0){
listSelNum = listNum;
} else if(listSelNum > listNum) {
listSelNum = 0;
}
var a = $boxElement.children("ol").children("li");
$boxElement.children("ol").children("li").each(function(i){
if(i == (listSelNum-1)) {
@ -272,20 +277,20 @@ $.fn.suggestor = function(setting) {
if(listSelNum == 0) {
$textArea.val(inputText);
}
},
fixList: function() {
if(listSelNum > 0) {
$textArea.val($($boxElement.children("ol").children("li").get(listSelNum-1)).html());
}
inputText = $textArea.val();
isFocusList = false;
$boxElement.css("display","none");
listNum = 0;
},
resize: function() {
$boxElement.css("top",$textArea.offset().top + $textArea.height() + 6);
$boxElement.css("left",$textArea.offset().left);
@ -296,9 +301,9 @@ $.fn.suggestor = function(setting) {
}
}
}
suggestor.init($(this), setting);
$(this).keydown( function(e){
if( ((e.keyCode >= 48) && (e.keyCode <= 90))
|| ((e.keyCode >= 96) && (e.keyCode <= 105))
@ -324,7 +329,7 @@ $.fn.suggestor = function(setting) {
if(isFocusList) {
suggestor.fixList();
}
}
}
});
$(this).keyup( function(e){
if( ((e.keyCode >= 48) && (e.keyCode <= 90))
@ -350,7 +355,7 @@ $.fn.suggestor = function(setting) {
suggestor.fixList();
}
});
//テキストエリア監視
setInterval( function() {
if(interval < 5) {
@ -365,6 +370,6 @@ $.fn.suggestor = function(setting) {
}
}
}, 100);
}
})(jQuery);