/*
* Copyright 2012-2017 CodeLibs Project and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.codelibs.fess.app.web.admin.general;
import static org.codelibs.core.stream.StreamUtil.stream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
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.app.web.base.FessAdminAction;
import org.codelibs.fess.mylasta.direction.FessConfig;
import org.codelibs.fess.mylasta.mail.TestmailPostcard;
import org.codelibs.fess.util.ComponentUtil;
import org.lastaflute.core.mail.Postbox;
import org.lastaflute.web.Execute;
import org.lastaflute.web.response.HtmlResponse;
import org.lastaflute.web.ruts.process.ActionRuntime;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* @author shinsuke
* @author Shunji Makino
*/
public class AdminGeneralAction extends FessAdminAction {
private static final String DUMMY_PASSWORD = "**********";
private static final Logger logger = LoggerFactory.getLogger(AdminGeneralAction.class);
// ===================================================================================
// Attribute
// =========
@Resource
protected DynamicProperties systemProperties;
// ===================================================================================
// Hook
// ======
@Override
protected void setupHtmlData(final ActionRuntime runtime) {
super.setupHtmlData(runtime);
runtime.registerData("helpLink", systemHelper.getHelpLink(fessConfig.getOnlineHelpNameGeneral()));
runtime.registerData("dayItems", getDayItems());
}
// ===================================================================================
//
@Execute
public HtmlResponse index() {
saveToken();
return asHtml(path_AdminGeneral_AdminGeneralJsp).useForm(EditForm.class, setup -> {
setup.setup(form -> {
updateForm(fessConfig, form);
});
});
}
@Execute
public HtmlResponse sendmail(final MailForm form) {
validate(form, messages -> {}, () -> {
return asHtml(path_AdminGeneral_AdminGeneralJsp);
});
final String[] toAddresses = form.notificationTo.split(",");
final Map<String, Object> dataMap = new HashMap<>();
dataMap.put("hostname", systemHelper.getHostname());
final FessConfig fessConfig = ComponentUtil.getFessConfig();
final Postbox postbox = ComponentUtil.getComponent(Postbox.class);
try {
TestmailPostcard.droppedInto(postbox, postcard -> {
postcard.setFrom(fessConfig.getMailFromAddress(), fessConfig.getMailFromName());
postcard.addReplyTo(fessConfig.getMailReturnPath());
stream(toAddresses).of(stream -> stream.forEach(address -> {
postcard.addTo(address);
}));
BeanUtil.copyMapToBean(dataMap, postcard);
});
saveInfo(messages -> messages.addSuccessSendTestmail(GLOBAL));
updateProperty(Constants.NOTIFICATION_TO_PROPERTY, form.notificationTo);
systemProperties.store();
} catch (final Exception e) {
logger.warn("Failed to send a test mail.", e);
saveError(messages -> messages.addErrorsFailedToSendTestmail(GLOBAL));
}
return redirectByParam(AdminGeneralAction.class, "notificationTo", form.notificationTo);
}
@Execute
public HtmlResponse update(final EditForm form) {
validate(form, messages -> {}, () -> {
return asHtml(path_AdminGeneral_AdminGeneralJsp);
});
verifyToken(() -> {
return asHtml(path_AdminGeneral_AdminGeneralJsp);
});
updateConfig(fessConfig, form);
saveInfo(messages -> messages.addSuccessUpdateCrawlerParams(GLOBAL));
return redirect(getClass());
}
public static void updateConfig(final FessConfig fessConfig, final EditForm form) {
fessConfig.setLoginRequired(Constants.ON.equalsIgnoreCase(form.loginRequired));
fessConfig.setResultCollapsed(Constants.ON.equalsIgnoreCase(form.resultCollapsed));
fessConfig.setLoginLinkEnabled(Constants.ON.equalsIgnoreCase(form.loginLink));
fessConfig.setThumbnailEnabled(Constants.ON.equalsIgnoreCase(form.thumbnail));
fessConfig.setIncrementalCrawling(Constants.ON.equalsIgnoreCase(form.incrementalCrawling));
fessConfig.setDayForCleanup(form.dayForCleanup);
fessConfig.setCrawlingThreadCount(form.crawlingThreadCount);
fessConfig.setSearchLog(Constants.ON.equalsIgnoreCase(form.searchLog));
fessConfig.setUserInfo(Constants.ON.equalsIgnoreCase(form.userInfo));
fessConfig.setUserFavorite(Constants.ON.equalsIgnoreCase(form.userFavorite));
fessConfig.setWebApiJson(Constants.ON.equalsIgnoreCase(form.webApiJson));
fessConfig.setDefaultLabelValue(form.defaultLabelValue);
fessConfig.setDefaultSortValue(form.defaultSortValue);
fessConfig.setAppendQueryParameter(Constants.ON.equalsIgnoreCase(form.appendQueryParameter));
fessConfig.setIgnoreFailureType(form.ignoreFailureType);
fessConfig.setFailureCountThreshold(form.failureCountThreshold);
fessConfig.setWebApiPopularWord(Constants.ON.equalsIgnoreCase(form.popularWord));
fessConfig.setCsvFileEncoding(form.csvFileEncoding);
fessConfig.setPurgeSearchLogDay(form.purgeSearchLogDay);
fessConfig.setPurgeJobLogDay(form.purgeJobLogDay);
fessConfig.setPurgeUserInfoDay(form.purgeUserInfoDay);
fessConfig.setPurgeByBots(form.purgeByBots);
fessConfig.setNotificationTo(form.notificationTo);
fessConfig.setSuggestSearchLog(Constants.ON.equalsIgnoreCase(form.suggestSearchLog));
fessConfig.setSuggestDocuments(Constants.ON.equalsIgnoreCase(form.suggestDocuments));
fessConfig.setPurgeSuggestSearchLogDay(form.purgeSuggestSearchLogDay);
fessConfig.setLdapProviderUrl(form.ldapProviderUrl);
fessConfig.setLdapSecurityPrincipal(form.ldapSecurityPrincipal);
fessConfig.setLdapAdminSecurityPrincipal(form.ldapAdminSecurityPrincipal);
if (form.ldapAdminSecurityCredentials != null && StringUtil.isNotBlank(form.ldapAdminSecurityCredentials.replace("*", " "))) {
fessConfig.setLdapAdminSecurityCredentials(form.ldapAdminSecurityCredentials);
}
fessConfig.setLdapBaseDn(form.ldapBaseDn);
fessConfig.setLdapAccountFilter(form.ldapAccountFilter);
fessConfig.setLdapMemberofAttribute(form.ldapMemberofAttribute);
fessConfig.setNotificationLogin(form.notificationLogin);
fessConfig.setNotificationSearchTop(form.notificationSearchTop);
fessConfig.storeSystemProperties();
ComponentUtil.getLdapManager().updateConfig();
}
public static void updateForm(final FessConfig fessConfig, final EditForm form) {
form.loginRequired = fessConfig.isLoginRequired() ? Constants.TRUE : Constants.FALSE;
form.resultCollapsed = fessConfig.isResultCollapsed() ? Constants.TRUE : Constants.FALSE;
form.loginLink = fessConfig.isLoginLinkEnabled() ? Constants.TRUE : Constants.FALSE;
form.thumbnail = fessConfig.isThumbnailEnabled() ? Constants.TRUE : Constants.FALSE;
form.incrementalCrawling = fessConfig.isIncrementalCrawling() ? Constants.TRUE : Constants.FALSE;
form.dayForCleanup = fessConfig.getDayForCleanup();
form.crawlingThreadCount = fessConfig.getCrawlingThreadCount();
form.searchLog = fessConfig.isSearchLog() ? Constants.TRUE : Constants.FALSE;
form.userInfo = fessConfig.isUserInfo() ? Constants.TRUE : Constants.FALSE;
form.userFavorite = fessConfig.isUserFavorite() ? Constants.TRUE : Constants.FALSE;
form.webApiJson = fessConfig.isWebApiJson() ? Constants.TRUE : Constants.FALSE;
form.defaultLabelValue = fessConfig.getDefaultLabelValue();
form.defaultSortValue = fessConfig.getDefaultSortValue();
form.appendQueryParameter = fessConfig.isAppendQueryParameter() ? Constants.TRUE : Constants.FALSE;
form.ignoreFailureType = fessConfig.getIgnoreFailureType();
form.failureCountThreshold = fessConfig.getFailureCountThreshold();
form.popularWord = fessConfig.isWebApiPopularWord() ? Constants.TRUE : Constants.FALSE;
form.csvFileEncoding = fessConfig.getCsvFileEncoding();
form.purgeSearchLogDay = fessConfig.getPurgeSearchLogDay();
form.purgeJobLogDay = fessConfig.getPurgeJobLogDay();
form.purgeUserInfoDay = fessConfig.getPurgeUserInfoDay();
form.purgeByBots = fessConfig.getPurgeByBots();
form.notificationTo = fessConfig.getNotificationTo();
form.suggestSearchLog = fessConfig.isSuggestSearchLog() ? Constants.TRUE : Constants.FALSE;
form.suggestDocuments = fessConfig.isSuggestDocuments() ? Constants.TRUE : Constants.FALSE;
form.purgeSuggestSearchLogDay = fessConfig.getPurgeSuggestSearchLogDay();
form.ldapProviderUrl = fessConfig.getLdapProviderUrl();
form.ldapSecurityPrincipal = fessConfig.getLdapSecurityPrincipal();
form.ldapAdminSecurityPrincipal = fessConfig.getLdapAdminSecurityPrincipal();
form.ldapAdminSecurityCredentials = DUMMY_PASSWORD;//fessConfig.getLdapAdminSecurityCredentials();
form.ldapBaseDn = fessConfig.getLdapBaseDn();
form.ldapAccountFilter = fessConfig.getLdapAccountFilter();
form.ldapMemberofAttribute = fessConfig.getLdapMemberofAttribute();
form.notificationLogin = fessConfig.getNotificationLogin();
form.notificationSearchTop = fessConfig.getNotificationSearchTop();
}
private void updateProperty(final String key, final String value) {
systemProperties.setProperty(key, value == null ? StringUtil.EMPTY : value);
}
private List<String> getDayItems() {
final List<String> items = new ArrayList<>();
for (int i = 0; i < 32; i++) {
items.add(Integer.toString(i));
}
for (int i = 40; i < 370; i += 10) {
items.add(Integer.toString(i));
}
items.add(Integer.toString(365));
return items;
}
}