From b514f8d32f735951eb32951d775069d6a8f6ca2e Mon Sep 17 00:00:00 2001 From: Jens Pelzetter Date: Sat, 7 Nov 2020 17:11:55 +0100 Subject: [PATCH] CCM Admin UI: Edit configuration settings --- .../configuration/SettingManager.java | 36 ++++- .../configuration/SettingsController.java | 54 ++++++-- .../ui/admin/configuration/settings.xhtml | 130 +++++++++++++++--- 3 files changed, 187 insertions(+), 33 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java b/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java index e528915bf..753850409 100644 --- a/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java +++ b/ccm-core/src/main/java/org/libreccm/configuration/SettingManager.java @@ -22,18 +22,24 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.util.Strings; import org.libreccm.core.CoreConstants; +import org.libreccm.l10n.LocalizedString; import org.libreccm.security.AuthorizationRequired; import org.libreccm.security.RequiresPrivilege; +import java.lang.reflect.Constructor; + import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.TypedQuery; import javax.transaction.Transactional; + import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.util.ArrayList; import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; /** * @@ -163,9 +169,33 @@ public class SettingManager { settingInfo.setValueType(field.getType().getName()); try { - final Object conf = configuration.newInstance(); - settingInfo.setDefaultValue(Objects.toString(field.get(conf))); - } catch (InstantiationException | IllegalAccessException ex) { + final Constructor constructor = configuration.getConstructor(); + final Object conf = constructor.newInstance(); + final Object defaultValueObj = field.get(conf); + final String defaultValue; + if (defaultValueObj instanceof LocalizedString) { + final LocalizedString defaultValueLstr + = (LocalizedString) defaultValueObj; + defaultValue = defaultValueLstr + .getValues() + .entrySet() + .stream() + .map( + entry -> String.format( + "%s: %s", + entry.getKey().toString(), entry.getValue() + ) + ) + .collect(Collectors.joining(", ")); + } else { + defaultValue = Objects.toString(defaultValueObj); + } + settingInfo.setDefaultValue(defaultValue); + + } catch (NoSuchMethodException + | InstantiationException + | InvocationTargetException + | IllegalAccessException ex) { LOGGER.warn(String.format("Failed to create instance of \"%s\" to " + "get default values.", configuration.getName()), diff --git a/ccm-core/src/main/java/org/libreccm/ui/admin/configuration/SettingsController.java b/ccm-core/src/main/java/org/libreccm/ui/admin/configuration/SettingsController.java index 7c5a5a879..e3b06ed17 100644 --- a/ccm-core/src/main/java/org/libreccm/ui/admin/configuration/SettingsController.java +++ b/ccm-core/src/main/java/org/libreccm/ui/admin/configuration/SettingsController.java @@ -20,7 +20,6 @@ package org.libreccm.ui.admin.configuration; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.libreccm.configuration.AbstractSetting; import org.libreccm.configuration.ConfigurationInfo; import org.libreccm.configuration.ConfigurationManager; import org.libreccm.configuration.SettingInfo; @@ -35,6 +34,7 @@ import org.libreccm.security.RequiresPrivilege; import java.lang.reflect.Field; import java.math.BigDecimal; import java.util.Arrays; +import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; @@ -163,9 +163,15 @@ public class SettingsController { .getClass() .getDeclaredField(settingInfo.getName()); field.setAccessible(true); - if (field.get(configuration) instanceof LocalizedString) { - final LocalizedString localizedStr = (LocalizedString) field - .get(configuration); + final Object valueObj = field.get(configuration); + if (valueObj instanceof List) { + @SuppressWarnings("unchecked") + final List list = (List) valueObj; + value = list + .stream() + .collect(Collectors.joining("\n")); + } else if (valueObj instanceof LocalizedString) { + final LocalizedString localizedStr = (LocalizedString) valueObj; value = localizedStr .getValues() .entrySet() @@ -177,9 +183,15 @@ public class SettingsController { ) ) .sorted() - .collect(Collectors.joining(", ")); + .collect(Collectors.joining("\n")); + } else if (valueObj instanceof Set) { + @SuppressWarnings("unchecked") + final Set set = (Set) valueObj; + value = set + .stream() + .collect(Collectors.joining("\n")); } else { - value = Objects.toString(field.get(configuration)); + value = Objects.toString(valueObj); } } catch (NoSuchFieldException | IllegalAccessException | SecurityException ex) { LOGGER.error( @@ -286,7 +298,7 @@ public class SettingsController { valueParam ); } else if (valueType.equals(Set.class.getName())) { - return updateStringListSetting( + return updateStringSetSetting( configurationClassName, confClass, conf, @@ -403,7 +415,7 @@ public class SettingsController { continue; } final Locale locale = new Locale(tokens[0]); - final String localeValue = tokens[1]; + final String localeValue = tokens[1].trim(); value.addValue(locale, localeValue); } return updateSetting( @@ -452,9 +464,33 @@ public class SettingsController { final String settingName, final String valueType, final String valueParam + ) { + final String[] tokens = valueParam.split("\n"); + final List value = Arrays + .asList(tokens) + .stream() + .map(String::trim) + .collect(Collectors.toList()); + return updateSetting( + configurationClassName, + configurationClass, + configuration, + settingName, + valueType, + value + ); + } + + private String updateStringSetSetting( + final String configurationClassName, + final Class configurationClass, + final Object configuration, + final String settingName, + final String valueType, + final String valueParam ) { final String[] tokens = valueParam.split(","); - final List value = Arrays.asList(tokens); + final Set value = new HashSet<>(Arrays.asList(tokens)); return updateSetting( configurationClassName, configurationClass, diff --git a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/configuration/settings.xhtml b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/configuration/settings.xhtml index 5c244aefa..459258429 100644 --- a/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/configuration/settings.xhtml +++ b/ccm-core/src/main/resources/WEB-INF/views/org/libreccm/ui/admin/configuration/settings.xhtml @@ -57,7 +57,7 @@ - #{setting.value} +
#{setting.value}
@@ -148,7 +148,22 @@