SettingsController endpoint for updating setting values
parent
03b125d099
commit
be07d07c98
|
|
@ -18,25 +18,34 @@
|
|||
*/
|
||||
package org.libreccm.ui.admin.configuration;
|
||||
|
||||
import org.libreccm.configuration.AbstractSetting;
|
||||
import org.libreccm.configuration.ConfigurationInfo;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.configuration.SettingInfo;
|
||||
import org.libreccm.configuration.SettingManager;
|
||||
import org.libreccm.core.CoreConstants;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
import org.libreccm.l10n.LocalizedTextsUtil;
|
||||
import org.libreccm.security.AuthorizationRequired;
|
||||
import org.libreccm.security.RequiresPrivilege;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.enterprise.context.RequestScoped;
|
||||
import javax.inject.Inject;
|
||||
import javax.mvc.Controller;
|
||||
import javax.mvc.Models;
|
||||
import javax.ws.rs.FormParam;
|
||||
import javax.ws.rs.GET;
|
||||
import javax.ws.rs.POST;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
|
||||
|
|
@ -58,6 +67,9 @@ public class SettingsController {
|
|||
@Inject
|
||||
private Models models;
|
||||
|
||||
@Inject
|
||||
private SettingManager settingManager;
|
||||
|
||||
@GET
|
||||
@Path("/")
|
||||
@AuthorizationRequired
|
||||
|
|
@ -77,7 +89,8 @@ public class SettingsController {
|
|||
confClass
|
||||
);
|
||||
|
||||
final LocalizedTextsUtil textUtil = globalizationHelper.getLocalizedTextsUtil(confInfo.getDescBundle());
|
||||
final LocalizedTextsUtil textUtil = globalizationHelper
|
||||
.getLocalizedTextsUtil(confInfo.getDescBundle());
|
||||
models.put(
|
||||
"confLabel",
|
||||
textUtil.getText(confInfo.getTitleKey())
|
||||
|
|
@ -119,4 +132,318 @@ public class SettingsController {
|
|||
return entry;
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("/{settingName}")
|
||||
@AuthorizationRequired
|
||||
@RequiresPrivilege(CoreConstants.PRIVILEGE_ADMIN)
|
||||
public String updateSettingValue(
|
||||
@PathParam("configurationClass") final String configurationClassName,
|
||||
@PathParam("settingName") final String settingName,
|
||||
@FormParam("settingValue") final String valueParam
|
||||
) {
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class.forName(configurationClassName);
|
||||
} catch (ClassNotFoundException ex) {
|
||||
models.put("configurationClass", configurationClassName);
|
||||
return "org/libreccm/ui/admin/configuration/configuration-class-not-found.xhtml";
|
||||
}
|
||||
final SettingInfo settingInfo = settingManager.getSettingInfo(
|
||||
confClass, settingName
|
||||
);
|
||||
|
||||
final String valueType = settingInfo.getValueType();
|
||||
if (valueType.equals(BigDecimal.class.getName())) {
|
||||
return updateBigDecimalSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(Boolean.class.getName())
|
||||
|| valueType.equals("boolean")) {
|
||||
return updateBooleanSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(Double.class.getName())
|
||||
|| valueType.equals("double")) {
|
||||
return updateDoubleSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(LocalizedString.class.getName())) {
|
||||
return updateLocalizedStringSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(Long.class.getName())
|
||||
|| valueType.equals("long")) {
|
||||
return updateLongSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(List.class.getName())) {
|
||||
return updateStringListSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(Set.class.getName())) {
|
||||
return updateStringListSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else if (valueType.equals(String.class.getName())) {
|
||||
return updateStringSetting(
|
||||
configurationClassName, settingName, valueType, valueParam
|
||||
);
|
||||
} else {
|
||||
models.put("configurationClass", configurationClassName);
|
||||
models.put("settingName", settingName);
|
||||
models.put("valueType", valueType);
|
||||
return "org/libreccm/ui/admin/configuration/unsupported-setting-type.xhtml";
|
||||
}
|
||||
}
|
||||
|
||||
private String updateBigDecimalSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final BigDecimal value;
|
||||
try {
|
||||
value = new BigDecimal(valueParam);
|
||||
} catch (NumberFormatException ex) {
|
||||
return buildInvalidTypeErrorTarget(
|
||||
configurationClassName,
|
||||
settingName,
|
||||
valueType,
|
||||
valueParam
|
||||
);
|
||||
}
|
||||
|
||||
final AbstractSetting<BigDecimal> setting = settingManager
|
||||
.findSetting(
|
||||
configurationClassName, settingName, BigDecimal.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName,
|
||||
settingName,
|
||||
valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(value);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateBooleanSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final Boolean value = Boolean.valueOf(valueParam);
|
||||
|
||||
final AbstractSetting<Boolean> setting = settingManager.findSetting(
|
||||
configurationClassName, settingName, Boolean.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName, settingName, valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(value);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateDoubleSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final Double value;
|
||||
try {
|
||||
value = Double.valueOf(valueParam);
|
||||
} catch (NumberFormatException ex) {
|
||||
return buildInvalidTypeErrorTarget(
|
||||
configurationClassName,
|
||||
settingName,
|
||||
valueType,
|
||||
valueParam
|
||||
);
|
||||
}
|
||||
|
||||
final AbstractSetting<Double> setting = settingManager.findSetting(
|
||||
configurationClassName, settingName, Double.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName, settingName, valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(value);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateLocalizedStringSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final LocalizedString value = new LocalizedString();
|
||||
final String[] lines = valueParam.split("\n");
|
||||
for (final String line : lines) {
|
||||
final String[] tokens = line.split(":");
|
||||
if (tokens.length != 2) {
|
||||
continue;
|
||||
}
|
||||
final Locale locale = new Locale(tokens[0]);
|
||||
final String localeValue = tokens[1];
|
||||
value.addValue(locale, localeValue);
|
||||
}
|
||||
|
||||
final AbstractSetting<LocalizedString> setting = settingManager
|
||||
.findSetting(
|
||||
configurationClassName, settingName, LocalizedString.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName, settingName, valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(value);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateLongSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final Long value;
|
||||
try {
|
||||
value = Long.valueOf(valueParam, 10);
|
||||
} catch (NumberFormatException ex) {
|
||||
return buildInvalidTypeErrorTarget(
|
||||
configurationClassName,
|
||||
settingName,
|
||||
valueType,
|
||||
valueParam
|
||||
);
|
||||
}
|
||||
|
||||
final AbstractSetting<Long> setting = settingManager.findSetting(
|
||||
configurationClassName, settingName, Long.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName, settingName, valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(value);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateStringListSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final String[] tokens = valueParam.split(",");
|
||||
final List<String> value = Arrays.asList(tokens);
|
||||
|
||||
final AbstractSetting<List> setting = settingManager.findSetting(
|
||||
configurationClassName, settingName, List.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName, settingName, valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(value);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String updateStringSetting(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
final AbstractSetting<String> setting = settingManager.findSetting(
|
||||
configurationClassName, settingName, String.class
|
||||
);
|
||||
|
||||
if (setting == null) {
|
||||
return buildSettingNotFoundErrorTarget(
|
||||
configurationClassName, settingName, valueType
|
||||
);
|
||||
} else {
|
||||
setting.setValue(valueParam);
|
||||
settingManager.saveSetting(setting);
|
||||
return buildRedirectAfterUpdateSettingTarget(
|
||||
configurationClassName
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
private String buildInvalidTypeErrorTarget(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType,
|
||||
final String valueParam
|
||||
) {
|
||||
models.put("configurationClass", configurationClassName);
|
||||
models.put("settingName", settingName);
|
||||
models.put("valueType", valueType);
|
||||
models.put("valueParam", valueParam);
|
||||
return "org/libreccm/ui/admin/configuration/invalid-setting-value.xhtml";
|
||||
}
|
||||
|
||||
private String buildSettingNotFoundErrorTarget(
|
||||
final String configurationClassName,
|
||||
final String settingName,
|
||||
final String valueType
|
||||
) {
|
||||
models.put("configurationClass", configurationClassName);
|
||||
models.put("settingName", settingName);
|
||||
models.put("valueType", valueType);
|
||||
return "org/libreccm/ui/admin/configuration/setting-not-found.xhtml";
|
||||
}
|
||||
|
||||
private String buildRedirectAfterUpdateSettingTarget(
|
||||
final String configurationClassName
|
||||
) {
|
||||
return String.format(
|
||||
"redirect:configuration/%s", configurationClassName
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
|
||||
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
|
||||
<ui:param name="activePage" value="configuration" />
|
||||
<ui:param name="title"
|
||||
value="#{AdminMessages('configuration.class.not_found.title')}" />
|
||||
|
||||
<ui:define name="breadcrumb">
|
||||
<ui:define name="breadcrumb">
|
||||
<li class="breadcrumb-item active">
|
||||
#{AdminMessages['configuration.label']}
|
||||
</li>
|
||||
</ui:define>
|
||||
</ui:define>
|
||||
|
||||
<ui:define name="panel">
|
||||
<div class="alert alert-warning" role="alert">
|
||||
#{AdminMessages.getMessage('configuration.class.not_found.message', [configurationClass])}
|
||||
</div>
|
||||
</ui:define>
|
||||
|
||||
</ui:composition>
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
|
||||
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
|
||||
<ui:param name="activePage" value="configuration" />
|
||||
<ui:param name="title"
|
||||
value="#{AdminMessages('configuration.setting.invalid_type.title')}" />
|
||||
|
||||
<ui:define name="breadcrumb">
|
||||
<ui:define name="breadcrumb">
|
||||
<li class="breadcrumb-item active">
|
||||
#{AdminMessages['configuration.label']}
|
||||
</li>
|
||||
</ui:define>
|
||||
</ui:define>
|
||||
|
||||
<ui:define name="panel">
|
||||
<div class="alert alert-warning" role="alert">
|
||||
#{AdminMessages.getMessage('configuration.setting.invalid_type.message', [configurationClass, settingName, valueType, valueParam])}
|
||||
</div>
|
||||
</ui:define>
|
||||
|
||||
</ui:composition>
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,31 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
|
||||
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
|
||||
<ui:param name="activePage" value="configuration" />
|
||||
<ui:param name="title"
|
||||
value="#{AdminMessages('configuration.setting.not_found.title')}" />
|
||||
|
||||
<ui:define name="breadcrumb">
|
||||
<ui:define name="breadcrumb">
|
||||
<li class="breadcrumb-item active">
|
||||
#{AdminMessages['configuration.label']}
|
||||
</li>
|
||||
</ui:define>
|
||||
</ui:define>
|
||||
|
||||
<ui:define name="panel">
|
||||
<div class="alert alert-warning" role="alert">
|
||||
#{AdminMessages.getMessage('configuration.setting.not_found.message', [configurationClass, settingName, valueType])}
|
||||
</div>
|
||||
</ui:define>
|
||||
|
||||
</ui:composition>
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml"
|
||||
xmlns:c="http://xmlns.jcp.org/jsp/jstl/core"
|
||||
xmlns:h="http://xmlns.jcp.org/jsf/html"
|
||||
xmlns:ui="http://xmlns.jcp.org/jsf/facelets">
|
||||
<ui:composition template="/WEB-INF/views/org/libreccm/ui/admin/ccm-admin.xhtml">
|
||||
<ui:param name="activePage" value="configuration" />
|
||||
<ui:param name="title"
|
||||
value="#{AdminMessages('configuration.setting.type_unsupported.title')}" />
|
||||
|
||||
<ui:define name="breadcrumb">
|
||||
<ui:define name="breadcrumb">
|
||||
<li class="breadcrumb-item active">
|
||||
#{AdminMessages['configuration.label']}
|
||||
</li>
|
||||
</ui:define>
|
||||
</ui:define>
|
||||
|
||||
<ui:define name="panel">
|
||||
<div class="alert alert-warning" role="alert">
|
||||
#{AdminMessages.getMessage('configuration.setting.type_unsupported.message', [configurationClass, settingName, valueType])}
|
||||
</div>
|
||||
</ui:define>
|
||||
|
||||
</ui:composition>
|
||||
|
||||
|
||||
</html>
|
||||
|
||||
|
||||
|
|
@ -225,3 +225,11 @@ configuration.settings.setting.dialog.title=Edit setting {0}
|
|||
configuration.settings.setting.dialog.close=Cancel
|
||||
configuration.settings.setting.dialog.save=Save
|
||||
configuration.settings.setting.dialog.unsupported_type=Sorry, settings of type "{0}" are not supported yet.
|
||||
configuration.class.not_found.title=Configuration class not found
|
||||
configuration.class.not_found.message=Configuration class {0} not found
|
||||
configuration.setting.type_unsupported.title=Unsupported type of setting
|
||||
configuration.setting.type_unsupported.message=Type {2} of setting {1} from configuration class {0} is not supported
|
||||
configuration.setting.invalid_type.title=Invalid type of value
|
||||
configuration.setting.invalid_type.message=Setting {1} of configuration class {0} is of type {2} but the value {3} can be converted into this type
|
||||
configuration.setting.not_found.title=Setting not found
|
||||
configuration.setting.not_found.message=Setting {1} of type {2} not found in configuration class {0}
|
||||
|
|
|
|||
|
|
@ -225,3 +225,11 @@ configuration.settings.setting.dialog.title=Einstellung {0} bearbeiten
|
|||
configuration.settings.setting.dialog.close=Abbrechen
|
||||
configuration.settings.setting.dialog.save=Speichern
|
||||
configuration.settings.setting.dialog.unsupported_type=Leider werden Einstellunge vom Typ "{0}" noch nicht unterst\u00fctzt.
|
||||
configuration.class.not_found.title=Konfiguration nicht gefunden
|
||||
configuration.class.not_found.message=Konfiguration {0} nicht gefunden
|
||||
configuration.setting.type_unsupported.title=Typ der Einstellung nicht unterst\u00fctzt
|
||||
configuration.setting.type_unsupported.message=Einstellung {1} aus Konfiguration {0} ist vom Typ {3}, dieser wird aber nicht unterst\u00fctzt
|
||||
configuration.setting.invalid_type.title=Invalid type of value
|
||||
configuration.setting.invalid_type.message=Einstellung {1} der Konfigurations-Klasse {0} ist vom Typ {2}, der angegebene Wert {3} kann aber nicht in diesen Typ konvertiert werden
|
||||
configuration.setting.not_found.title=Einstellung nicht gefunden
|
||||
configuration.setting.not_found.message=Keine Einstellung {1} vom Typ {3} in Konfiguration {0} gefunden
|
||||
|
|
|
|||
Loading…
Reference in New Issue