Removed depcrecated package com.arsdigita.ui.admin.configuration from ccm-core
parent
50be17c101
commit
473240777a
|
|
@ -1,311 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.event.FormInitListener;
|
||||
import com.arsdigita.bebop.event.FormProcessListener;
|
||||
import com.arsdigita.bebop.event.FormSectionEvent;
|
||||
import com.arsdigita.bebop.event.FormValidationListener;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.apache.logging.log4j.util.Strings;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* An abstract base class for a form for editing settings with a single value.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
* @param <T>
|
||||
*/
|
||||
public abstract class AbstractSettingFormSingleValue<T> extends Form {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
AbstractSettingFormSingleValue.class);
|
||||
|
||||
private static final String VALUE_FIELD = "valueField";
|
||||
|
||||
private final SaveCancelSection saveCancelSection;
|
||||
|
||||
/**
|
||||
* Constructor, initialises the form and the supporting widgets.
|
||||
*
|
||||
* @param configurationTab The configuration tab in which the form is shown.
|
||||
* @param selectedConf Parameter containing the selected configuration
|
||||
* class.
|
||||
* @param selectedSetting Parameter containing the selected setting.
|
||||
*/
|
||||
public AbstractSettingFormSingleValue(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super("settingFormSingleValue", new BoxPanel(BoxPanel.VERTICAL));
|
||||
|
||||
add(new SettingFormHeader(configurationTab,
|
||||
selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
add(new SettingFormCurrentValuePanel(selectedConf, selectedSetting));
|
||||
|
||||
final TextField valueField = new TextField(VALUE_FIELD);
|
||||
valueField.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.edit.new_value", ADMIN_BUNDLE));
|
||||
add(valueField);
|
||||
|
||||
saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection);
|
||||
|
||||
addInitListener(new InitListener(selectedConf,
|
||||
selectedSetting,
|
||||
valueField));
|
||||
|
||||
addValidationListener(new ValidationListener());
|
||||
|
||||
addProcessListener(new ProcessListener(configurationTab,
|
||||
selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a string to the value type of the setting. Must be overwritten
|
||||
* by the none abstract sub classes.
|
||||
*
|
||||
* @param valueData The data to convert.
|
||||
*
|
||||
* @return The converted data.
|
||||
*/
|
||||
abstract T convertValue(final String valueData);
|
||||
|
||||
/**
|
||||
* {@link FormInitListener} for the form. Loads the current value of the
|
||||
* setting from the database and puts it into the input field.
|
||||
*/
|
||||
private class InitListener implements FormInitListener {
|
||||
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
private final TextField valueField;
|
||||
|
||||
public InitListener(
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting,
|
||||
final TextField valueField) {
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
this.valueField = valueField;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void init(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
final Object value;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
value = field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn("Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value == null) {
|
||||
valueField.setValue(state, "");
|
||||
} else {
|
||||
valueField.setValue(state, value.toString());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link FormValidationListener} which checks if the value provided by the
|
||||
* user can be converted into the type of the setting.
|
||||
*
|
||||
*/
|
||||
private class ValidationListener implements FormValidationListener {
|
||||
|
||||
@Override
|
||||
public void validate(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final FormData data = event.getFormData();
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (saveCancelSection.getSaveButton().isSelected(state)) {
|
||||
final String valueData = data.getString(VALUE_FIELD);
|
||||
if (Strings.isBlank(valueData)) {
|
||||
data.addError(VALUE_FIELD,
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.error.blank",
|
||||
ADMIN_BUNDLE));
|
||||
}
|
||||
try {
|
||||
final T value = convertValue(valueData);
|
||||
LOGGER.debug("New value {} is a valid BigDecimal.", value);
|
||||
} catch (NumberFormatException ex) {
|
||||
data.addError(
|
||||
VALUE_FIELD,
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.error.incorrect_format",
|
||||
ADMIN_BUNDLE));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* {@link FormProcessListener} to store the new value of the setting
|
||||
* in the database.
|
||||
*/
|
||||
private class ProcessListener implements FormProcessListener {
|
||||
|
||||
private final ConfigurationTab configurationTab;
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
|
||||
public ProcessListener(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
this.configurationTab = configurationTab;
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void process(final FormSectionEvent event)
|
||||
throws FormProcessException {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (saveCancelSection.getSaveButton().isSelected(state)) {
|
||||
final FormData data = event.getFormData();
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final String settingName = selectedSetting.getSelectedKey(state);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
final Field field;
|
||||
try {
|
||||
field = confClass.getDeclaredField(settingName);
|
||||
field.setAccessible(true);
|
||||
} catch (NoSuchFieldException | SecurityException ex) {
|
||||
LOGGER.error("Failed to retrieve field \"{}\" "
|
||||
+ "from configuration class \"{}\".",
|
||||
settingName,
|
||||
confClass.getName());
|
||||
LOGGER.error(ex);
|
||||
throw new FormProcessException(
|
||||
String.format(
|
||||
"Failed to retrieve field \"%s\" "
|
||||
+ "from configuration class \"%s\".",
|
||||
settingName,
|
||||
confClass.getName()),
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.failed_to_set_value",
|
||||
ADMIN_BUNDLE),
|
||||
ex);
|
||||
}
|
||||
|
||||
final String valueData = data.getString(VALUE_FIELD);
|
||||
|
||||
final T value = convertValue(valueData);
|
||||
|
||||
try {
|
||||
field.set(config, value);
|
||||
confManager.saveConfiguration(config);
|
||||
configurationTab.hideSettingForms(state);
|
||||
} catch (IllegalArgumentException | IllegalAccessException ex) {
|
||||
LOGGER.error("Failed to change value of field \"{}\" "
|
||||
+ "of configuration class \"{}\".",
|
||||
settingName,
|
||||
confClass.getName());
|
||||
LOGGER.error(ex);
|
||||
throw new FormProcessException(
|
||||
String.format(
|
||||
"Failed to change value of field \"%s\" "
|
||||
+ "of configuration class \"%s\".",
|
||||
settingName,
|
||||
confClass.getName()),
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.failed_to_set_value",
|
||||
ADMIN_BUNDLE),
|
||||
ex);
|
||||
}
|
||||
}
|
||||
|
||||
configurationTab.hideSettingForms(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,576 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.Page;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SegmentedPanel;
|
||||
import com.arsdigita.bebop.form.Submit;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.parameters.StringParameter;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.toolbox.ui.LayoutPanel;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationInfo;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* Tab for the admin application containing the UI to manage the settings in the
|
||||
* various configuration classes.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ConfigurationTab extends LayoutPanel {
|
||||
|
||||
private static final String CONF_CLASSES_FILTER = "confClassesFilter";
|
||||
|
||||
/**
|
||||
* Parameter for the selected configuration.
|
||||
*/
|
||||
private final StringParameter selectedConfParam;
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
|
||||
/**
|
||||
* Parameter for the selected setting.
|
||||
*/
|
||||
private final StringParameter selectedSettingParam;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
|
||||
/**
|
||||
* Parameter for the selected value of multi-value settings.
|
||||
*/
|
||||
private final StringParameter selectedValueParam;
|
||||
private final ParameterSingleSelectionModel<String> selectedValue;
|
||||
|
||||
/**
|
||||
* Heading of the table of configurations.
|
||||
*/
|
||||
private final Label confClassesFilterHeading;
|
||||
/**
|
||||
* Form for filtering the table of configurations.
|
||||
*/
|
||||
private final Form confClassesFilterForm;
|
||||
/**
|
||||
* The table which lists all available configurations.
|
||||
*/
|
||||
private final ConfigurationsTable configurationsTable;
|
||||
|
||||
/**
|
||||
* Link to go back to the listing of configurations.
|
||||
*/
|
||||
private final ActionLink configurationBackLink;
|
||||
/**
|
||||
* Heading for the list of settings of a configuration.
|
||||
*/
|
||||
private final Label configurationHeading;
|
||||
/**
|
||||
* The table which lists a settings of configuration.
|
||||
*/
|
||||
private final ConfigurationTable configurationTable;
|
||||
|
||||
/**
|
||||
* The form for editing a setting of the type {@code boolean}.
|
||||
*/
|
||||
private final SettingFormBoolean settingFormBoolean;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code long}.
|
||||
*/
|
||||
private final SettingFormLong settingFormLong;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code double}.
|
||||
*/
|
||||
private final SettingFormDouble settingFormDouble;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code BigDecimal}.
|
||||
*/
|
||||
private final SettingFormBigDecimal settingFormBigDecimal;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code String}.
|
||||
*/
|
||||
private final SettingFormString settingFormString;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code LocalizedString}.
|
||||
*/
|
||||
private final SettingEditorLocalizedString settingEditorLocalizedString;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code List<String>}.
|
||||
*/
|
||||
private final SettingEditorStringList settingEditorStringList;
|
||||
/**
|
||||
* The form for editing a setting of the type {@code Set<String>}.
|
||||
*/
|
||||
private final SettingEditorEnum settingEditorEnum;
|
||||
|
||||
/**
|
||||
* Initialises the parameters, widgets and forms.
|
||||
*/
|
||||
public ConfigurationTab() {
|
||||
super();
|
||||
|
||||
setClassAttr("sidebarNavPanel");
|
||||
|
||||
selectedConfParam = new StringParameter("selectedConfiguration");
|
||||
selectedConf = new ParameterSingleSelectionModel<>(selectedConfParam);
|
||||
|
||||
selectedSettingParam = new StringParameter("selectedSetting");
|
||||
selectedSetting = new ParameterSingleSelectionModel<>(
|
||||
selectedSettingParam);
|
||||
|
||||
selectedValueParam = new StringParameter("selectedValue");
|
||||
selectedValue = new ParameterSingleSelectionModel<>(selectedValueParam);
|
||||
|
||||
final SegmentedPanel left = new SegmentedPanel();
|
||||
|
||||
confClassesFilterHeading = new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.classes.filter.heading", ADMIN_BUNDLE));
|
||||
|
||||
confClassesFilterForm = new Form("confClassesForm");
|
||||
final TextField confClassesFilter = new TextField(CONF_CLASSES_FILTER);
|
||||
confClassesFilterForm.add(confClassesFilter);
|
||||
confClassesFilterForm.add(new Submit(new GlobalizedMessage(
|
||||
"ui.admin.configuration.classes.filter.submit", ADMIN_BUNDLE)));
|
||||
final ActionLink clearLink = new ActionLink(new GlobalizedMessage(
|
||||
"ui.admin.configuration.classes.filter.clear", ADMIN_BUNDLE));
|
||||
clearLink.addActionListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
confClassesFilter.setValue(state, null);
|
||||
});
|
||||
confClassesFilterForm.add(clearLink);
|
||||
left.addSegment(confClassesFilterHeading, confClassesFilterForm);
|
||||
|
||||
setLeft(left);
|
||||
|
||||
final BoxPanel body = new BoxPanel(BoxPanel.VERTICAL);
|
||||
configurationsTable = new ConfigurationsTable(
|
||||
this, selectedConf, confClassesFilter);
|
||||
body.add(configurationsTable);
|
||||
|
||||
configurationBackLink = new ActionLink(new GlobalizedMessage(
|
||||
"ui.admin.configuration.back_to_configurations",
|
||||
ADMIN_BUNDLE));
|
||||
configurationBackLink.addActionListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
hideConfiguration(state);
|
||||
});
|
||||
body.add(configurationBackLink);
|
||||
configurationHeading = new Label(e -> {
|
||||
//This print listener includes the (localised title) of the selected
|
||||
//configuration in the heading
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(
|
||||
String.format("Configuration class \"%s\" not found.",
|
||||
selectedConf.getSelectedKey(state)),
|
||||
ex);
|
||||
}
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final ConfigurationInfo confInfo = confManager.getConfigurationInfo(
|
||||
confClass);
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil.findBean(
|
||||
GlobalizationHelper.class);
|
||||
final Label target = (Label) e.getTarget();
|
||||
final String confTitle = confInfo.getTitle(globalizationHelper
|
||||
.getNegotiatedLocale());
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.editing_configuration",
|
||||
ADMIN_BUNDLE,
|
||||
new String[]{confTitle}));
|
||||
});
|
||||
configurationHeading.setClassAttr("heading");
|
||||
body.add(configurationHeading);
|
||||
configurationTable = new ConfigurationTable(this,
|
||||
selectedConf,
|
||||
selectedSetting);
|
||||
body.add(configurationTable);
|
||||
|
||||
settingFormBoolean = new SettingFormBoolean(this,
|
||||
selectedConf,
|
||||
selectedSetting);
|
||||
body.add(settingFormBoolean);
|
||||
|
||||
settingFormLong = new SettingFormLong(this,
|
||||
selectedConf,
|
||||
selectedSetting);
|
||||
body.add(settingFormLong);
|
||||
|
||||
settingFormDouble = new SettingFormDouble(this,
|
||||
selectedConf,
|
||||
selectedSetting);
|
||||
body.add(settingFormDouble);
|
||||
|
||||
settingFormBigDecimal = new SettingFormBigDecimal(this,
|
||||
selectedConf,
|
||||
selectedSetting);
|
||||
body.add(settingFormBigDecimal);
|
||||
|
||||
settingFormString = new SettingFormString(this,
|
||||
selectedConf,
|
||||
selectedSetting);
|
||||
body.add(settingFormString);
|
||||
|
||||
settingEditorLocalizedString = new SettingEditorLocalizedString(
|
||||
this, selectedConf, selectedSetting, selectedValue);
|
||||
body.add(settingEditorLocalizedString);
|
||||
|
||||
settingEditorStringList = new SettingEditorStringList(
|
||||
this, selectedConf, selectedSetting, selectedValue);
|
||||
body.add(settingEditorStringList);
|
||||
|
||||
settingEditorEnum = new SettingEditorEnum(
|
||||
this, selectedConf, selectedSetting, selectedValue);
|
||||
body.add(settingEditorEnum);
|
||||
|
||||
setBody(body);
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers all forms and widgets in the page for visibility management and
|
||||
* registers all parameters. The method is called by Bebop when the tab is
|
||||
* rendered.
|
||||
*
|
||||
* @param page The page which this tab is part of.
|
||||
*/
|
||||
@Override
|
||||
public void register(final Page page) {
|
||||
super.register(page);
|
||||
|
||||
page.addGlobalStateParam(selectedConfParam);
|
||||
page.addGlobalStateParam(selectedSettingParam);
|
||||
page.addGlobalStateParam(selectedValueParam);
|
||||
|
||||
page.setVisibleDefault(confClassesFilterHeading, true);
|
||||
page.setVisibleDefault(confClassesFilterForm, true);
|
||||
page.setVisibleDefault(configurationsTable, true);
|
||||
|
||||
page.setVisibleDefault(configurationBackLink, false);
|
||||
page.setVisibleDefault(configurationHeading, false);
|
||||
page.setVisibleDefault(configurationTable, false);
|
||||
|
||||
page.setVisibleDefault(settingFormBoolean, false);
|
||||
page.setVisibleDefault(settingFormLong, false);
|
||||
page.setVisibleDefault(settingFormDouble, false);
|
||||
page.setVisibleDefault(settingFormBigDecimal, false);
|
||||
page.setVisibleDefault(settingFormString, false);
|
||||
page.setVisibleDefault(settingEditorLocalizedString, false);
|
||||
page.setVisibleDefault(settingEditorStringList, false);
|
||||
page.setVisibleDefault(settingEditorEnum, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #configurationsTable} and hides all other widgets and
|
||||
* forms.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showConfigurationsTable(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, true);
|
||||
confClassesFilterForm.setVisible(state, true);
|
||||
configurationsTable.setVisible(state, true);
|
||||
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides the {@link #configurationsTable} and its supporting widgets.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void hideConfigurationsTable(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #configurationTable} which lists all settings of a
|
||||
* configuration.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showConfiguration(final PageState state) {
|
||||
hideConfigurationsTable(state);
|
||||
hideSettingForms(state);
|
||||
|
||||
configurationBackLink.setVisible(state, true);
|
||||
configurationHeading.setVisible(state, true);
|
||||
configurationTable.setVisible(state, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides the configuration table and resets the {@link #selectedConf}
|
||||
* parameter.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void hideConfiguration(final PageState state) {
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
selectedConf.clearSelection(state);
|
||||
|
||||
showConfigurationsTable(state);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingFormBigDecimal}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showBigDecimalSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, true);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingFormBoolean}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showBooleanSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, true);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingFormDouble}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showDoubleSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, true);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingEditorEnum}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showEnumSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the {@link #settingEditorLocalizedString}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showLocalizedStringSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, true);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingFormLong}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showLongSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, true);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingEditorStringList}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showStringListSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, true);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Shows the {@link #settingFormString}.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void showStringSettingForm(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, false);
|
||||
configurationHeading.setVisible(state, false);
|
||||
configurationTable.setVisible(state, false);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, true);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hides all settings forms/editors and resets the {@link #selectedSetting}
|
||||
* and {@link #selectedValue} parameters.
|
||||
*
|
||||
* @param state The current {@link PageState}.
|
||||
*/
|
||||
protected void hideSettingForms(final PageState state) {
|
||||
confClassesFilterHeading.setVisible(state, false);
|
||||
confClassesFilterForm.setVisible(state, false);
|
||||
configurationsTable.setVisible(state, false);
|
||||
|
||||
configurationBackLink.setVisible(state, true);
|
||||
configurationHeading.setVisible(state, true);
|
||||
configurationTable.setVisible(state, true);
|
||||
|
||||
settingFormBoolean.setVisible(state, false);
|
||||
settingFormLong.setVisible(state, false);
|
||||
settingFormDouble.setVisible(state, false);
|
||||
settingFormBigDecimal.setVisible(state, false);
|
||||
settingFormString.setVisible(state, false);
|
||||
settingEditorLocalizedString.setVisible(state, false);
|
||||
settingEditorStringList.setVisible(state, false);
|
||||
settingEditorEnum.setVisible(state, false);
|
||||
|
||||
selectedSetting.clearSelection(state);
|
||||
selectedValue.clearSelection(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,352 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.configuration.SettingInfo;
|
||||
import org.libreccm.configuration.SettingManager;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* This table lists all settings of a configuration class. The table shows the
|
||||
* current value and the description of each setting. If there is localised
|
||||
* label for the setting this label is used, otherwise the name of the setting
|
||||
* is used.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ConfigurationTable extends Table {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
ConfigurationTable.class);
|
||||
|
||||
private static final int COL_SETTING_LABEL = 0;
|
||||
private static final int COL_SETTING_VALUE = 1;
|
||||
private static final int COL_SETTING_DESC = 2;
|
||||
private static final int COL_EDIT_SETTING = 3;
|
||||
|
||||
private ParameterSingleSelectionModel<String> selectedConf;
|
||||
private ParameterSingleSelectionModel<String> selectedSetting;
|
||||
|
||||
public ConfigurationTable(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super();
|
||||
|
||||
setIdAttr("configurationTable");
|
||||
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
|
||||
setEmptyView(new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.none", ADMIN_BUNDLE)));
|
||||
|
||||
final TableColumnModel columnModel = getColumnModel();
|
||||
columnModel.add(new TableColumn(
|
||||
COL_SETTING_LABEL,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.table.col_setting_label.header",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_SETTING_VALUE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.table.col_setting_value.header",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_SETTING_DESC,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.table.col_setting_desc.header",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_EDIT_SETTING,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.table.col_edit_setting.header",
|
||||
ADMIN_BUNDLE))));
|
||||
|
||||
columnModel.get(COL_EDIT_SETTING).setCellRenderer(
|
||||
new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
return new ControlLink((Component) value);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (event.getColumn() == COL_EDIT_SETTING) {
|
||||
final String settingName = (String) event.getRowKey();
|
||||
selectedSetting.setSelectedKey(state, settingName);
|
||||
|
||||
switch (getTypeOfSelectedSetting(state)) {
|
||||
case "boolean":
|
||||
LOGGER.debug("Setting is of type boolean");
|
||||
configurationTab.showBooleanSettingForm(state);
|
||||
break;
|
||||
case "long":
|
||||
LOGGER.debug("Setting is of type long");
|
||||
configurationTab.showLongSettingForm(state);
|
||||
break;
|
||||
case "double":
|
||||
LOGGER.debug("Setting is of type double");
|
||||
configurationTab.showDoubleSettingForm(state);
|
||||
break;
|
||||
case "java.math.BigDecimal":
|
||||
LOGGER.debug("Setting is of type BigDecimal");
|
||||
configurationTab.showBigDecimalSettingForm(state);
|
||||
break;
|
||||
case "org.libreccm.l10n.LocalizedString":
|
||||
LOGGER.debug("Setting is of type LocalizedString");
|
||||
configurationTab.showLocalizedStringSettingForm(
|
||||
state);
|
||||
break;
|
||||
case "java.lang.String":
|
||||
LOGGER.debug("Setting is of type String");
|
||||
configurationTab.showStringSettingForm(state);
|
||||
break;
|
||||
case "java.util.Set":
|
||||
LOGGER.debug("Setting is of type Enum");
|
||||
configurationTab.showEnumSettingForm(state);
|
||||
break;
|
||||
case "java.util.List":
|
||||
LOGGER.debug("Setting is of type List");
|
||||
configurationTab.showStringListSettingForm(state);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException(String.format(
|
||||
"Unknown setting type \"%s\".",
|
||||
getTypeOfSelectedSetting(state)));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
setModelBuilder(new ConfigurationTableModelBuilder());
|
||||
}
|
||||
|
||||
private String getTypeOfSelectedSetting(final PageState state) {
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
LOGGER.error("Configuration class '{}' not found.",
|
||||
selectedConf.getSelectedKey(state));
|
||||
throw new UncheckedWrapperException(String.format(
|
||||
"Configuration class '%s not found'",
|
||||
selectedConf.getSelectedKey(state)), ex);
|
||||
}
|
||||
|
||||
final SettingManager settingManager = CdiUtil.createCdiUtil().findBean(
|
||||
SettingManager.class);
|
||||
final SettingInfo info = settingManager.getSettingInfo(confClass,
|
||||
selectedSetting.
|
||||
getSelectedKey(
|
||||
state));
|
||||
|
||||
return info.getValueType();
|
||||
|
||||
}
|
||||
|
||||
private class ConfigurationTableModelBuilder
|
||||
extends LockableImpl implements TableModelBuilder {
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table, final PageState state) {
|
||||
final ConfigurationManager confManager = CdiUtil.createCdiUtil()
|
||||
.findBean(ConfigurationManager.class);
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
LOGGER.error("Configuration class '{}' not found.",
|
||||
selectedConf.getSelectedKey(state));
|
||||
throw new UncheckedWrapperException(String.format(
|
||||
"Configuration class '%s not found'",
|
||||
selectedConf.getSelectedKey(state)), ex);
|
||||
}
|
||||
|
||||
final Object configuration = confManager
|
||||
.findConfiguration(confClass);
|
||||
|
||||
return new ConfigurationTableModel(configuration, state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ConfigurationTableModel implements TableModel {
|
||||
|
||||
private final Object configuration;
|
||||
|
||||
private final ConfigurationManager confManager;
|
||||
private final SettingManager settingManager;
|
||||
private final GlobalizationHelper globalizationHelper;
|
||||
|
||||
private final List<String> settings;
|
||||
private int index = -1;
|
||||
|
||||
public ConfigurationTableModel(final Object configuration,
|
||||
final PageState state) {
|
||||
this.configuration = configuration;
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
confManager = cdiUtil.findBean(ConfigurationManager.class);
|
||||
settingManager = cdiUtil.findBean(SettingManager.class);
|
||||
globalizationHelper = cdiUtil.findBean(GlobalizationHelper.class);
|
||||
|
||||
settings = settingManager.getAllSettings(configuration.getClass());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
index++;
|
||||
return index < settings.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
final String setting = settings.get(index);
|
||||
final SettingInfo settingInfo = settingManager.getSettingInfo(
|
||||
configuration.getClass(), setting);
|
||||
|
||||
switch (columnIndex) {
|
||||
case COL_SETTING_LABEL:
|
||||
return settingInfo.getLabel(globalizationHelper
|
||||
.getNegotiatedLocale());
|
||||
case COL_SETTING_VALUE: {
|
||||
try {
|
||||
final Field field = configuration.getClass().
|
||||
getDeclaredField(setting);
|
||||
field.setAccessible(true);
|
||||
return buildValueColumn(settingInfo,
|
||||
field.get(configuration));
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException ex) {
|
||||
LOGGER.error("Failed to read value from configuration.",
|
||||
ex);
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.read_error",
|
||||
ADMIN_BUNDLE));
|
||||
}
|
||||
}
|
||||
case COL_SETTING_DESC:
|
||||
return settingInfo.getDescription(globalizationHelper
|
||||
.getNegotiatedLocale());
|
||||
case COL_EDIT_SETTING:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.settings.edit", ADMIN_BUNDLE));
|
||||
default:
|
||||
throw new IllegalArgumentException("Illegal column index");
|
||||
}
|
||||
}
|
||||
|
||||
private String buildValueColumn(final SettingInfo settingInfo,
|
||||
final Object settingValue) {
|
||||
switch (settingInfo.getValueType()) {
|
||||
case "java.util.List": {
|
||||
@SuppressWarnings("unchecked")
|
||||
final List<String> value = (List<String>) settingValue;
|
||||
return String.join(", ", value);
|
||||
}
|
||||
case "java.util.Set": {
|
||||
@SuppressWarnings("unchecked")
|
||||
final Set<String> value = (Set<String>) settingValue;
|
||||
return String.join(", ", value);
|
||||
}
|
||||
case "org.libreccm.l10n.LocalizedString": {
|
||||
final LocalizedString value = (LocalizedString) settingValue;
|
||||
final List<String> entries = new ArrayList<>();
|
||||
value.getValues().entrySet().forEach(e -> {
|
||||
entries.add(String.format("%s: %s",
|
||||
e.getKey(),
|
||||
e.getValue()));
|
||||
});
|
||||
|
||||
return String.join("; ", entries);
|
||||
}
|
||||
default: {
|
||||
return Objects.toString(settingValue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex
|
||||
) {
|
||||
return settings.get(index);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,228 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
|
||||
import org.apache.logging.log4j.util.Strings;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationInfo;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.SortedSet;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* This table lists all available configuration classes together with their
|
||||
* descriptions (if any). If there is localised title for the configuration this
|
||||
* title is used, otherwise the fully qualified name of the configuration is
|
||||
* used.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class ConfigurationsTable extends Table {
|
||||
|
||||
private static final int COL_TITLE = 0;
|
||||
private static final int COL_DESC = 1;
|
||||
|
||||
public ConfigurationsTable(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final TextField confClassesFilter) {
|
||||
|
||||
super();
|
||||
|
||||
setIdAttr("configurationsTable");
|
||||
|
||||
setEmptyView(new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.configurations.none", ADMIN_BUNDLE)));
|
||||
|
||||
final TableColumnModel columnModel = getColumnModel();
|
||||
columnModel.add(new TableColumn(
|
||||
COL_TITLE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.configurations.table.name",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_DESC,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.configurations.table.desc",
|
||||
ADMIN_BUNDLE))));
|
||||
|
||||
columnModel.get(COL_TITLE).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
return new ControlLink((String) value);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
if (event.getColumn() == COL_TITLE) {
|
||||
final String confClassName = (String) event.getRowKey();
|
||||
selectedConf.setSelectedKey(state, confClassName);
|
||||
|
||||
configurationTab.showConfiguration(state);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
setModelBuilder(new ConfigurationsTableModelBuilder(confClassesFilter));
|
||||
}
|
||||
|
||||
private class ConfigurationsTableModelBuilder
|
||||
extends LockableImpl implements TableModelBuilder {
|
||||
|
||||
private final TextField confClassesFilter;
|
||||
|
||||
public ConfigurationsTableModelBuilder(
|
||||
final TextField confClassesField) {
|
||||
|
||||
this.confClassesFilter = confClassesField;
|
||||
}
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
|
||||
return new ConfigurationsTableModel(confClassesFilter, state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ConfigurationsTableModel implements TableModel {
|
||||
|
||||
private final List<Class<?>> configurations;
|
||||
private int index = -1;
|
||||
private final ConfigurationManager confManager;
|
||||
private final Locale negoiatedLocale;
|
||||
|
||||
public ConfigurationsTableModel(final TextField confClassesFilter,
|
||||
final PageState state) {
|
||||
final String filterTerm = (String) confClassesFilter
|
||||
.getValue(state);
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
confManager = cdiUtil.findBean(ConfigurationManager.class);
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil.findBean(
|
||||
GlobalizationHelper.class);
|
||||
negoiatedLocale = globalizationHelper.getNegotiatedLocale();
|
||||
final SortedSet<Class<?>> confs = confManager
|
||||
.findAllConfigurations();
|
||||
configurations = confs.stream()
|
||||
.filter(c -> {
|
||||
final ConfigurationInfo info = confManager
|
||||
.getConfigurationInfo(c);
|
||||
// return c.getName().startsWith(filterTerm);
|
||||
if (filterTerm == null || filterTerm.isEmpty()) {
|
||||
return true;
|
||||
} else {
|
||||
return info.getTitle(negoiatedLocale).startsWith(
|
||||
filterTerm);
|
||||
}
|
||||
})
|
||||
.collect(Collectors.toCollection(ArrayList::new));
|
||||
configurations.sort((c1, c2) -> {
|
||||
// return c1.getName().compareTo(c2.getName());
|
||||
final ConfigurationInfo info1 = confManager
|
||||
.getConfigurationInfo(c1);
|
||||
final ConfigurationInfo info2 = confManager
|
||||
.getConfigurationInfo(c2);
|
||||
|
||||
return info1.getTitle(negoiatedLocale)
|
||||
.compareTo(info2.getTitle(negoiatedLocale));
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 2;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
index++;
|
||||
return index < configurations.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
final ConfigurationInfo info = confManager.getConfigurationInfo(
|
||||
configurations.get(index));
|
||||
switch (columnIndex) {
|
||||
case COL_TITLE:
|
||||
if (Strings.isBlank(info.getTitle(negoiatedLocale))) {
|
||||
return configurations.get(index).getSimpleName();
|
||||
} else {
|
||||
return info.getTitle(negoiatedLocale);
|
||||
}
|
||||
case COL_DESC:
|
||||
return info.getDescription(negoiatedLocale);
|
||||
default:
|
||||
throw new IllegalArgumentException("Illegal column index");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return configurations.get(index).getName();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,433 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.configuration.EnumSetting;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* Editor for {@link EnumSetting}s. The editor consists of the usual header (see
|
||||
* {@link SettingFormHeader}) which is used by all setting forms/editors, a
|
||||
* table which displays all current values together with links for editing and
|
||||
* deleting the values and a form for adding and editing values.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingEditorEnum extends BoxPanel {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
SettingEditorEnum.class);
|
||||
|
||||
private static final int COL_VALUE = 0;
|
||||
private static final int COL_EDIT = 1;
|
||||
private static final int COL_DEL = 2;
|
||||
|
||||
private final ConfigurationTab configurationTab;
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
private final ParameterSingleSelectionModel<String> selectedValue;
|
||||
|
||||
public SettingEditorEnum(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting,
|
||||
final ParameterSingleSelectionModel<String> selectedValue) {
|
||||
|
||||
super(BoxPanel.VERTICAL);
|
||||
|
||||
this.configurationTab = configurationTab;
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
this.selectedValue = selectedValue;
|
||||
|
||||
add(new SettingFormHeader(configurationTab,
|
||||
selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
add(new ValuesTable());
|
||||
|
||||
add(new ValueForm());
|
||||
}
|
||||
|
||||
private class ValuesTable extends Table {
|
||||
|
||||
public ValuesTable() {
|
||||
|
||||
super();
|
||||
|
||||
setIdAttr("enumValues");
|
||||
|
||||
setEmptyView(new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.no_values", ADMIN_BUNDLE)));
|
||||
|
||||
final TableColumnModel columnModel = getColumnModel();
|
||||
columnModel.add(new TableColumn(
|
||||
COL_VALUE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.col_value",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_EDIT,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.col_edit",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_DEL,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.col_del",
|
||||
ADMIN_BUNDLE))));
|
||||
|
||||
columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
return new ControlLink((Component) value);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
columnModel.get(COL_DEL).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
if (value == null) {
|
||||
return new Text("");
|
||||
} else {
|
||||
final ControlLink link = new ControlLink(
|
||||
(Component) value);
|
||||
link.setConfirmation(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.del_confirm",
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
return link;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final Set<String> values;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
values = (Set<String>) field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
switch (event.getColumn()) {
|
||||
case COL_EDIT: {
|
||||
selectedValue.setSelectedKey(state, event
|
||||
.getRowKey());
|
||||
|
||||
break;
|
||||
}
|
||||
case COL_DEL: {
|
||||
values.remove(event.getRowKey());
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Notthing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
setModelBuilder(new ValuesTableModelBuilder());
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTableModelBuilder
|
||||
extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
|
||||
return new ValuesTableModel(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTableModel implements TableModel {
|
||||
|
||||
private final List<String> values;
|
||||
private int index = -1;
|
||||
|
||||
public ValuesTableModel(final PageState state) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
final Field field = confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final Set<String> valuesSet = (Set<String>) field.get(config);
|
||||
|
||||
values = new ArrayList<>(valuesSet);
|
||||
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn("Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 3;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
index++;
|
||||
return index < values.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
switch (columnIndex) {
|
||||
case COL_VALUE:
|
||||
return values.get(index);
|
||||
case COL_EDIT:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.value.edit",
|
||||
ADMIN_BUNDLE));
|
||||
case COL_DEL:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.value.del",
|
||||
ADMIN_BUNDLE));
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Not a valid column index");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return values.get(index);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValueForm extends Form {
|
||||
|
||||
private final String VALUE = "value";
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ValueForm() {
|
||||
|
||||
super("settingEnumValueForm");
|
||||
|
||||
final TextField valueField = new TextField(VALUE);
|
||||
valueField.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.enum.value.label",
|
||||
ADMIN_BUNDLE));
|
||||
add(valueField);
|
||||
|
||||
final SaveCancelSection saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection);
|
||||
|
||||
addInitListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
if (selectedValue.getSelectedKey(state) != null) {
|
||||
|
||||
valueField.setValue(state, selectedValue.getSelectedKey(
|
||||
state));
|
||||
}
|
||||
});
|
||||
|
||||
addProcessListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
if (saveCancelSection.getSaveButton().isSelected(state)) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final Set<String> enumSetting;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final Object value = field.get(config);
|
||||
|
||||
if (value == null) {
|
||||
enumSetting = new HashSet<>();
|
||||
confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state)).set(config,
|
||||
enumSetting);
|
||||
} else {
|
||||
enumSetting = (Set<String>) value;
|
||||
}
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final FormData data = e.getFormData();
|
||||
final String valueData = data.getString(VALUE);
|
||||
if (selectedValue.getSelectedKey(state) == null) {
|
||||
enumSetting.add(valueData);
|
||||
} else {
|
||||
final String selected = selectedValue.getSelectedKey(
|
||||
state);
|
||||
enumSetting.remove(selected);
|
||||
enumSetting.add(valueData);
|
||||
}
|
||||
confManager.saveConfiguration(config);
|
||||
}
|
||||
|
||||
selectedValue.clearSelection(state);
|
||||
valueField.setValue(state, null);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,632 +0,0 @@
|
|||
/*p
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.bebop.form.SingleSelect;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.kernel.KernelConfig;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.l10n.LocalizedString;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
import java.util.TooManyListenersException;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* Editor for {@link LocalizedStringSetting}s. The editor consists of the usual
|
||||
* header (see {@link SettingFormHeader}) which is used by all setting
|
||||
* forms/editors, a table which displays all current values together with links
|
||||
* for editing and deleting the values and a form for adding and editing values.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingEditorLocalizedString extends BoxPanel {
|
||||
|
||||
private final static Logger LOGGER = LogManager.getLogger(
|
||||
SettingEditorLocalizedString.class);
|
||||
|
||||
private static final int COL_LOCALE = 0;
|
||||
private static final int COL_VALUE = 1;
|
||||
private static final int COL_EDIT = 2;
|
||||
private static final int COL_DEL = 3;
|
||||
|
||||
private final ConfigurationTab configurationTab;
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
private final ParameterSingleSelectionModel<String> selectedValue;
|
||||
|
||||
public SettingEditorLocalizedString(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting,
|
||||
final ParameterSingleSelectionModel<String> selectedValue) {
|
||||
|
||||
super(BoxPanel.VERTICAL);
|
||||
|
||||
this.configurationTab = configurationTab;
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
this.selectedValue = selectedValue;
|
||||
|
||||
add(new SettingFormHeader(configurationTab,
|
||||
selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
add(new ValuesTable());
|
||||
|
||||
add(new ValueForm());
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTable extends Table {
|
||||
|
||||
public ValuesTable() {
|
||||
|
||||
super();
|
||||
|
||||
setIdAttr("localizedStringSettingValues");
|
||||
|
||||
setEmptyView(new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.no_values",
|
||||
ADMIN_BUNDLE)));
|
||||
|
||||
final TableColumnModel columnModel = getColumnModel();
|
||||
columnModel.add(new TableColumn(
|
||||
COL_LOCALE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.col_lang",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_VALUE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.col_value",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_EDIT,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.col_edit",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_DEL,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.col_del",
|
||||
ADMIN_BUNDLE))));
|
||||
|
||||
columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
return new ControlLink((Component) value);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
columnModel.get(COL_DEL).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
if (value == null) {
|
||||
return new Text("");
|
||||
} else {
|
||||
final ControlLink link = new ControlLink(
|
||||
(Component) value);
|
||||
link.setConfirmation(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.del_confirm",
|
||||
ADMIN_BUNDLE));
|
||||
return link;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
switch (event.getColumn()) {
|
||||
case COL_EDIT:
|
||||
selectedValue.setSelectedKey(state,
|
||||
event.getRowKey());
|
||||
break;
|
||||
case COL_DEL:
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final LocalizedString localizedStr;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final Object value = field.get(config);
|
||||
|
||||
if (value == null) {
|
||||
localizedStr = new LocalizedString();
|
||||
field.set(config, localizedStr);
|
||||
} else {
|
||||
localizedStr = (LocalizedString) value;
|
||||
}
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final Locale locale = new Locale((String) event
|
||||
.getRowKey());
|
||||
|
||||
localizedStr.removeValue(locale);
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Nothing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
setModelBuilder(new ValuesTableModelBuilder());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTableModelBuilder
|
||||
extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
|
||||
return new ValuesTableModel(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTableModel implements TableModel {
|
||||
|
||||
private final LocalizedString value;
|
||||
private final List<Locale> locales;
|
||||
private int index = -1;
|
||||
|
||||
public ValuesTableModel(final PageState state) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
value = (LocalizedString) field.get(config);
|
||||
|
||||
locales = new ArrayList<>();
|
||||
locales.addAll(value.getAvailableLocales());
|
||||
locales.sort((s1, s2) -> {
|
||||
return s1.toString().compareTo(s2.toString());
|
||||
});
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn("Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 4;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
index++;
|
||||
return index < locales.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
final Locale locale = locales.get(index);
|
||||
|
||||
switch (columnIndex) {
|
||||
case COL_LOCALE:
|
||||
return locale.toString();
|
||||
case COL_VALUE:
|
||||
return value.getValue(locale);
|
||||
case COL_EDIT:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.value.edit",
|
||||
ADMIN_BUNDLE));
|
||||
case COL_DEL:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.title.del",
|
||||
ADMIN_BUNDLE
|
||||
));
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Not a valid column index");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return locales.get(index);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValueForm extends Form {
|
||||
|
||||
private static final String LOCALE_SELECT = "localeSelect";
|
||||
private static final String VALUE = "value";
|
||||
|
||||
private final SingleSelect localeSelect;
|
||||
|
||||
public ValueForm() {
|
||||
super("settingLocalizedStringValueForm");
|
||||
|
||||
localeSelect = new SingleSelect(LOCALE_SELECT);
|
||||
localeSelect.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.locale.label",
|
||||
ADMIN_BUNDLE));
|
||||
|
||||
try {
|
||||
localeSelect.addPrintListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
if (selectedValue.getSelectedKey(state) == null) {
|
||||
final ConfigurationManager confManager = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ConfigurationManager.class);
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final LocalizedString value;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
value = (LocalizedString) field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
throw new UncheckedWrapperException(
|
||||
String.format(
|
||||
"Failed to read setting %s from configuration %s",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state)),
|
||||
ex);
|
||||
}
|
||||
|
||||
final Set<String> supportedLanguages = KernelConfig
|
||||
.getConfig().getSupportedLanguages();
|
||||
final Set<String> assignedLanguages = new HashSet<>();
|
||||
value.getAvailableLocales().forEach(l -> {
|
||||
assignedLanguages.add(l.toString());
|
||||
});
|
||||
|
||||
final SingleSelect target = (SingleSelect) e.getTarget();
|
||||
|
||||
target.clearOptions();
|
||||
|
||||
supportedLanguages.forEach(l -> {
|
||||
if (!assignedLanguages.contains(l)) {
|
||||
target.addOption(new Option(l, new Text(l)));
|
||||
}
|
||||
});
|
||||
} else {
|
||||
final SingleSelect target = (SingleSelect) e.getTarget();
|
||||
|
||||
target.clearOptions();
|
||||
|
||||
final String language = selectedValue.getSelectedKey(
|
||||
state);
|
||||
target.addOption(
|
||||
new Option(language, new Text(language)));
|
||||
}
|
||||
});
|
||||
} catch (TooManyListenersException ex) {
|
||||
//We are in big trouble...
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
add(localeSelect);
|
||||
|
||||
final TextField localizedValue = new TextField(VALUE);
|
||||
localizedValue.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.localized_string.value.label",
|
||||
ADMIN_BUNDLE));
|
||||
add(localizedValue);
|
||||
|
||||
final SaveCancelSection saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection);
|
||||
|
||||
addInitListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
if (selectedValue.getSelectedKey(state) != null) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final LocalizedString localizedStr
|
||||
= (LocalizedString) field.get(
|
||||
config);
|
||||
|
||||
final String value = localizedStr.getValue(new Locale(
|
||||
selectedValue.getSelectedKey(state)));
|
||||
|
||||
localizedValue.setValue(state, value);
|
||||
|
||||
} catch (NoSuchFieldException | SecurityException |
|
||||
IllegalAccessException | ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
addProcessListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
if (saveCancelSection.getSaveButton().isSelected(state)) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final LocalizedString localizedStr;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final Object value = field.get(config);
|
||||
|
||||
if (value == null) {
|
||||
localizedStr = new LocalizedString();
|
||||
|
||||
field.set(config, localizedStr);
|
||||
} else {
|
||||
localizedStr = (LocalizedString) value;
|
||||
}
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final FormData data = e.getFormData();
|
||||
final Locale locale = new Locale(data.getString(
|
||||
LOCALE_SELECT));
|
||||
final String valueData = data.getString(VALUE);
|
||||
localizedStr.putValue(locale, valueData);
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
}
|
||||
|
||||
selectedValue.clearSelection(state);
|
||||
localeSelect.setValue(state, null);
|
||||
localizedValue.setValue(state, null);
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isVisible(final PageState state) {
|
||||
if (super.isVisible(state)) {
|
||||
|
||||
if (selectedValue.getSelectedKey(state) == null) {
|
||||
final ConfigurationManager confManager = CdiUtil
|
||||
.createCdiUtil()
|
||||
.findBean(ConfigurationManager.class);
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final LocalizedString value;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
value = (LocalizedString) field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
throw new UncheckedWrapperException(
|
||||
String.format(
|
||||
"Failed to read setting %s from configuration %s",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state)),
|
||||
ex);
|
||||
}
|
||||
|
||||
final Set<String> supportedLanguages = KernelConfig
|
||||
.getConfig().getSupportedLanguages();
|
||||
final Set<String> assignedLanguages = new HashSet<>();
|
||||
value.getAvailableLocales().forEach(l -> {
|
||||
assignedLanguages.add(l.toString());
|
||||
});
|
||||
|
||||
return !assignedLanguages.equals(supportedLanguages);
|
||||
} else {
|
||||
return true;
|
||||
}
|
||||
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,591 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Component;
|
||||
import com.arsdigita.bebop.ControlLink;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.Table;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.bebop.event.TableActionEvent;
|
||||
import com.arsdigita.bebop.event.TableActionListener;
|
||||
import com.arsdigita.bebop.form.TextField;
|
||||
import com.arsdigita.bebop.table.TableCellRenderer;
|
||||
import com.arsdigita.bebop.table.TableColumn;
|
||||
import com.arsdigita.bebop.table.TableColumnModel;
|
||||
import com.arsdigita.bebop.table.TableModel;
|
||||
import com.arsdigita.bebop.table.TableModelBuilder;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.LockableImpl;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.configuration.EnumSetting;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* Editor for {@link EnumSetting}s. The editor consists of the usual header (see
|
||||
* {@link SettingFormHeader}) which is used by all setting forms/editors, a
|
||||
* table which displays all current values together with links for moving,
|
||||
* editing and deleting the values and a form for adding and editing values.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingEditorStringList extends BoxPanel {
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
SettingEditorStringList.class);
|
||||
|
||||
private static final int COL_VALUE = 0;
|
||||
private static final int COL_UP = 1;
|
||||
private static final int COL_DOWN = 2;
|
||||
private static final int COL_EDIT = 3;
|
||||
private static final int COL_DEL = 4;
|
||||
|
||||
private final ConfigurationTab configurationTab;
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
private final ParameterSingleSelectionModel<String> selectedValue;
|
||||
|
||||
public SettingEditorStringList(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting,
|
||||
final ParameterSingleSelectionModel<String> selectedValue) {
|
||||
|
||||
super(BoxPanel.VERTICAL);
|
||||
|
||||
this.configurationTab = configurationTab;
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
this.selectedValue = selectedValue;
|
||||
|
||||
add(new SettingFormHeader(configurationTab,
|
||||
selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
add(new ValuesTable());
|
||||
|
||||
add(new ValueForm());
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTable extends Table {
|
||||
|
||||
public ValuesTable() {
|
||||
|
||||
super();
|
||||
|
||||
setIdAttr("stringListValues");
|
||||
|
||||
setEmptyView(new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.no_values",
|
||||
ADMIN_BUNDLE)));
|
||||
|
||||
final TableColumnModel columnModel = getColumnModel();
|
||||
columnModel.add(new TableColumn(
|
||||
COL_VALUE,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.col_value",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_UP,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.col_up",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_DOWN,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.col_down",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_EDIT,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.col_edit",
|
||||
ADMIN_BUNDLE))));
|
||||
columnModel.add(new TableColumn(
|
||||
COL_DEL,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.col_delete",
|
||||
ADMIN_BUNDLE))));
|
||||
|
||||
columnModel.get(COL_UP).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
if (row > 0) {
|
||||
return new ControlLink((Component) value);
|
||||
} else {
|
||||
return new Text("");
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
columnModel.get(COL_DOWN).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final List<String> values;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
values = (List<String>) field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
if (row < values.size()) {
|
||||
return new ControlLink((Component) value);
|
||||
} else {
|
||||
return new Text("");
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
columnModel.get(COL_EDIT).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
return new ControlLink((Component) value);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
columnModel.get(COL_DEL).setCellRenderer(new TableCellRenderer() {
|
||||
|
||||
@Override
|
||||
public Component getComponent(final Table table,
|
||||
final PageState state,
|
||||
final Object value,
|
||||
final boolean isSelected,
|
||||
final Object key,
|
||||
final int row,
|
||||
final int column) {
|
||||
if (value == null) {
|
||||
return new Text("");
|
||||
} else {
|
||||
final ControlLink link = new ControlLink(
|
||||
(Component) value);
|
||||
link.setConfirmation(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.del_confirm",
|
||||
ADMIN_BUNDLE));
|
||||
return link;
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
addTableActionListener(new TableActionListener() {
|
||||
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
public void cellSelected(final TableActionEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil
|
||||
.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final List<String> values;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
values = (List<String>) field.get(config);
|
||||
} catch (NoSuchFieldException | SecurityException |
|
||||
IllegalAccessException | ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
switch (event.getColumn()) {
|
||||
case COL_UP: {
|
||||
|
||||
final int currentIndex = Integer.parseInt(
|
||||
(String) event.getRowKey());
|
||||
final int previousIndex = currentIndex - 1;
|
||||
|
||||
final String currentValue = values.get(currentIndex);
|
||||
final String previousValue = values.get(
|
||||
previousIndex);
|
||||
|
||||
values.set(previousIndex, currentValue);
|
||||
values.set(currentIndex, previousValue);
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
|
||||
break;
|
||||
}
|
||||
case COL_DOWN: {
|
||||
|
||||
final int currentIndex = Integer.parseInt(
|
||||
(String) event.getRowKey());
|
||||
final int nextIndex = currentIndex + 1;
|
||||
|
||||
final String currentValue = values.get(currentIndex);
|
||||
final String nextValue = values.get(nextIndex);
|
||||
|
||||
values.set(nextIndex, currentValue);
|
||||
values.set(currentIndex, nextValue);
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
|
||||
break;
|
||||
}
|
||||
case COL_EDIT: {
|
||||
selectedValue.setSelectedKey(state,
|
||||
event.getRowKey());
|
||||
break;
|
||||
}
|
||||
case COL_DEL: {
|
||||
values.remove(Integer.parseInt((String) event
|
||||
.getRowKey()));
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void headSelected(final TableActionEvent event) {
|
||||
//Notthing
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
setModelBuilder(new ValuesTableModelBuilder());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTableModelBuilder
|
||||
extends LockableImpl
|
||||
implements TableModelBuilder {
|
||||
|
||||
@Override
|
||||
public TableModel makeModel(final Table table,
|
||||
final PageState state) {
|
||||
table.getRowSelectionModel().clearSelection(state);
|
||||
|
||||
return new ValuesTableModel(state);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValuesTableModel implements TableModel {
|
||||
|
||||
private final List<String> values;
|
||||
private int index = -1;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ValuesTableModel(final PageState state) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
values = (List<String>) field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn("Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getColumnCount() {
|
||||
return 5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean nextRow() {
|
||||
index++;
|
||||
return index < values.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getElementAt(final int columnIndex) {
|
||||
switch (columnIndex) {
|
||||
case COL_VALUE:
|
||||
return values.get(index);
|
||||
case COL_UP:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.value.up",
|
||||
ADMIN_BUNDLE));
|
||||
case COL_DOWN:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.value.down",
|
||||
ADMIN_BUNDLE));
|
||||
case COL_EDIT:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.value.edit",
|
||||
ADMIN_BUNDLE));
|
||||
case COL_DEL:
|
||||
return new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.value.del",
|
||||
ADMIN_BUNDLE));
|
||||
default:
|
||||
throw new IllegalArgumentException(
|
||||
"Not a valid column index");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object getKeyAt(final int columnIndex) {
|
||||
return index;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class ValueForm extends Form {
|
||||
|
||||
private final String VALUE = "value";
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public ValueForm() {
|
||||
super("settingStringListValueForm");
|
||||
|
||||
final TextField valueField = new TextField(VALUE);
|
||||
valueField.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.stringlist.value.label",
|
||||
ADMIN_BUNDLE));
|
||||
add(valueField);
|
||||
|
||||
final SaveCancelSection saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection);
|
||||
|
||||
addInitListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
if (selectedValue.getSelectedKey(state) != null) {
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
try {
|
||||
@SuppressWarnings("unchecked")
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final List<String> stringList = (List<String>) field
|
||||
.get(config);
|
||||
|
||||
final String str = stringList.get(Integer.parseInt(
|
||||
selectedValue.getSelectedKey(state)));
|
||||
|
||||
valueField.setValue(state, str);
|
||||
|
||||
} catch (NoSuchFieldException | SecurityException |
|
||||
IllegalAccessException | ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
addProcessListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
|
||||
if (saveCancelSection.getSaveButton().isSelected(state)) {
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(
|
||||
confClass);
|
||||
|
||||
final List<String> stringList;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(
|
||||
selectedSetting.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
final Object value = field.get(config);
|
||||
|
||||
if (value == null) {
|
||||
stringList = new ArrayList<>();
|
||||
field.set(config, stringList);
|
||||
} else {
|
||||
stringList = (List<String>) value;
|
||||
}
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn(
|
||||
"Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final FormData data = e.getFormData();
|
||||
final String valueData = data.getString(VALUE);
|
||||
|
||||
if (selectedValue.getSelectedKey(state) == null) {
|
||||
stringList.add(valueData);
|
||||
} else {
|
||||
final int selected = Integer.parseInt(selectedValue
|
||||
.getSelectedKey(state));
|
||||
stringList.set(selected, valueData);
|
||||
}
|
||||
|
||||
confManager.saveConfiguration(config);
|
||||
}
|
||||
|
||||
selectedValue.clearSelection(state);
|
||||
valueField.setValue(state, null);
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,48 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
|
||||
import org.libreccm.configuration.BigDecimalSetting;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
|
||||
/**
|
||||
* A subclass of {@link AbstractSettingFormSingleValue} for editing the value
|
||||
* of a {@link BigDecimalSetting}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormBigDecimal
|
||||
extends AbstractSettingFormSingleValue<BigDecimal> {
|
||||
|
||||
public SettingFormBigDecimal(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
super(configurationTab, selectedConf, selectedSetting);
|
||||
}
|
||||
|
||||
@Override
|
||||
BigDecimal convertValue(final String valueData) {
|
||||
return new BigDecimal(valueData);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,193 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Form;
|
||||
import com.arsdigita.bebop.FormData;
|
||||
import com.arsdigita.bebop.FormProcessException;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.SaveCancelSection;
|
||||
import com.arsdigita.bebop.form.CheckboxGroup;
|
||||
import com.arsdigita.bebop.form.Option;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* A subclass of {@link AbstractSettingFormSingleValue} for editing the value
|
||||
* of a {@code boolean}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormBoolean extends Form {
|
||||
|
||||
private static final String VALUE_FIELD_GROUP = "valueFieldGroup";
|
||||
private static final String VALUE_FIELD = "valueField";
|
||||
|
||||
private static final Logger LOGGER = LogManager.getLogger(
|
||||
SettingFormBoolean.class);
|
||||
|
||||
public SettingFormBoolean(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super("settingFormBoolean", new BoxPanel(BoxPanel.VERTICAL));
|
||||
|
||||
add(new SettingFormHeader(configurationTab,
|
||||
selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
add(new SettingFormCurrentValuePanel(selectedConf, selectedSetting));
|
||||
|
||||
final CheckboxGroup valueFieldGroup = new CheckboxGroup(
|
||||
VALUE_FIELD_GROUP);
|
||||
valueFieldGroup.addOption(
|
||||
new Option(VALUE_FIELD,
|
||||
new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.edit.new_value",
|
||||
ADMIN_BUNDLE))));
|
||||
add(valueFieldGroup);
|
||||
|
||||
final SaveCancelSection saveCancelSection = new SaveCancelSection();
|
||||
add(saveCancelSection);
|
||||
|
||||
addInitListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
final Boolean value;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
value = (Boolean) field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException |
|
||||
ClassCastException ex) {
|
||||
LOGGER.warn("Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
return;
|
||||
}
|
||||
|
||||
if (value) {
|
||||
valueFieldGroup.setValue(state, VALUE_FIELD);
|
||||
}
|
||||
});
|
||||
|
||||
addProcessListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
if (saveCancelSection.getSaveButton().isSelected(state)) {
|
||||
final FormData data = e.getFormData();
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final String settingName = selectedSetting.getSelectedKey(state);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
final Field field;
|
||||
try {
|
||||
field = confClass.getDeclaredField(settingName);
|
||||
field.setAccessible(true);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException ex) {
|
||||
throw new FormProcessException(
|
||||
String.format(
|
||||
"Failed to retrieve field \"%s\" "
|
||||
+ "from configuration class \"%s\".",
|
||||
settingName,
|
||||
confClass.getName()),
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.failed_to_set_value",
|
||||
ADMIN_BUNDLE),
|
||||
ex);
|
||||
}
|
||||
|
||||
try {
|
||||
final String[] valueData = (String[]) data.
|
||||
get(VALUE_FIELD_GROUP);
|
||||
if (valueData != null && valueData.length > 0) {
|
||||
if (VALUE_FIELD.equals(valueData[0])) {
|
||||
field.set(config, Boolean.TRUE);
|
||||
} else {
|
||||
field.set(config, Boolean.FALSE);
|
||||
}
|
||||
} else {
|
||||
field.set(config, Boolean.FALSE);
|
||||
}
|
||||
confManager.saveConfiguration(config);
|
||||
configurationTab.hideSettingForms(state);
|
||||
} catch (IllegalArgumentException | IllegalAccessException ex) {
|
||||
LOGGER.error(ex);
|
||||
throw new FormProcessException(
|
||||
String.format(
|
||||
"Failed to change value of field \"%s\" "
|
||||
+ "of configuration class \"%s\".",
|
||||
settingName,
|
||||
confClass.getName()),
|
||||
new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.failed_to_set_value",
|
||||
ADMIN_BUNDLE),
|
||||
ex);
|
||||
}
|
||||
}
|
||||
|
||||
configurationTab.hideSettingForms(state);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,99 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.GridPanel;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* A panel which show the current value of a (single value) setting.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormCurrentValuePanel extends GridPanel {
|
||||
|
||||
private final static Logger LOGGER = LogManager.getLogger(
|
||||
SettingFormCurrentValuePanel.class);
|
||||
|
||||
public SettingFormCurrentValuePanel(
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
super(2);
|
||||
|
||||
add(new Label(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.edit.current_value",
|
||||
ADMIN_BUNDLE)));
|
||||
|
||||
add(new Text(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
final Text target = (Text) e.getTarget();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
|
||||
final Object config = confManager.findConfiguration(confClass);
|
||||
|
||||
final Object value;
|
||||
try {
|
||||
final Field field = confClass.getDeclaredField(selectedSetting
|
||||
.getSelectedKey(state));
|
||||
field.setAccessible(true);
|
||||
value = field.get(config);
|
||||
} catch (NoSuchFieldException |
|
||||
SecurityException |
|
||||
IllegalAccessException ex) {
|
||||
LOGGER.warn("Failed to read setting {} from configuration {}",
|
||||
selectedSetting.getSelectedKey(state),
|
||||
selectedConf.getSelectedKey(state));
|
||||
LOGGER.warn(ex);
|
||||
target.setText("Failed to read setting value.");
|
||||
return;
|
||||
}
|
||||
|
||||
target.setText(Objects.toString(value));
|
||||
}));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
|
||||
/**
|
||||
* A subclass of {@link AbstractSettingFormSingleValue} for editing the value
|
||||
* of a {@link DoubleSetting}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormDouble extends AbstractSettingFormSingleValue<Double> {
|
||||
|
||||
public SettingFormDouble(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super(configurationTab, selectedConf, selectedSetting);
|
||||
}
|
||||
|
||||
@Override
|
||||
Double convertValue(final String valueData) {
|
||||
return Double.parseDouble(valueData);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,173 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.ActionLink;
|
||||
import com.arsdigita.bebop.BoxPanel;
|
||||
import com.arsdigita.bebop.Label;
|
||||
import com.arsdigita.bebop.PageState;
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
import com.arsdigita.bebop.Text;
|
||||
import com.arsdigita.bebop.event.PrintEvent;
|
||||
import com.arsdigita.bebop.event.PrintListener;
|
||||
import com.arsdigita.globalization.GlobalizedMessage;
|
||||
import com.arsdigita.util.UncheckedWrapperException;
|
||||
|
||||
import org.libreccm.cdi.utils.CdiUtil;
|
||||
import org.libreccm.configuration.ConfigurationInfo;
|
||||
import org.libreccm.configuration.ConfigurationManager;
|
||||
import org.libreccm.configuration.SettingInfo;
|
||||
import org.libreccm.configuration.SettingManager;
|
||||
import org.libreccm.l10n.GlobalizationHelper;
|
||||
|
||||
import static com.arsdigita.ui.admin.AdminUiConstants.*;
|
||||
|
||||
/**
|
||||
* Header used by all setting forms/editors. The header contains a link to go
|
||||
* back to the list of settings and heading for contains the title of the
|
||||
* configuration class and the label of the setting which is edited.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormHeader extends BoxPanel {
|
||||
|
||||
public SettingFormHeader(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super(BoxPanel.VERTICAL);
|
||||
|
||||
final ActionLink backLink = new ActionLink(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.edit.back", ADMIN_BUNDLE));
|
||||
backLink.addActionListener(e -> {
|
||||
final PageState state = e.getPageState();
|
||||
configurationTab.hideSettingForms(state);
|
||||
});
|
||||
add(backLink);
|
||||
|
||||
final Label heading = new Label(new HeadingPrintListener(
|
||||
selectedConf, selectedSetting));
|
||||
heading.setClassAttr("heading");
|
||||
|
||||
add(heading);
|
||||
|
||||
final Text desc = new Text(new DescPrintListener(selectedConf,
|
||||
selectedSetting));
|
||||
|
||||
add(desc);
|
||||
}
|
||||
|
||||
private class HeadingPrintListener implements PrintListener {
|
||||
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
|
||||
public HeadingPrintListener(
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prepare(final PrintEvent event) {
|
||||
|
||||
final PageState state = event.getPageState();
|
||||
final Label target = (Label) event.getTarget();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final ConfigurationManager confManager = cdiUtil.findBean(
|
||||
ConfigurationManager.class);
|
||||
final SettingManager settingManager = cdiUtil.findBean(
|
||||
SettingManager.class);
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final ConfigurationInfo confInfo = confManager
|
||||
.getConfigurationInfo(confClass);
|
||||
final SettingInfo settingInfo = settingManager.getSettingInfo(
|
||||
confClass, selectedSetting.getSelectedKey(state));
|
||||
|
||||
final String confTitle = confInfo.getTitle(globalizationHelper
|
||||
.getNegotiatedLocale());
|
||||
final String settingLabel = settingInfo.getLabel(
|
||||
globalizationHelper.getNegotiatedLocale());
|
||||
|
||||
target.setLabel(new GlobalizedMessage(
|
||||
"ui.admin.configuration.setting.edit.heading",
|
||||
ADMIN_BUNDLE,
|
||||
new String[]{confTitle, settingLabel}));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private class DescPrintListener implements PrintListener {
|
||||
|
||||
private final ParameterSingleSelectionModel<String> selectedConf;
|
||||
private final ParameterSingleSelectionModel<String> selectedSetting;
|
||||
|
||||
public DescPrintListener(
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
this.selectedConf = selectedConf;
|
||||
this.selectedSetting = selectedSetting;
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void prepare(final PrintEvent event) {
|
||||
final PageState state = event.getPageState();
|
||||
final Text target = (Text) event.getTarget();
|
||||
|
||||
final CdiUtil cdiUtil = CdiUtil.createCdiUtil();
|
||||
final SettingManager settingManager = cdiUtil.findBean(
|
||||
SettingManager.class);
|
||||
final GlobalizationHelper globalizationHelper = cdiUtil
|
||||
.findBean(GlobalizationHelper.class);
|
||||
|
||||
final Class<?> confClass;
|
||||
try {
|
||||
confClass = Class
|
||||
.forName(selectedConf.getSelectedKey(state));
|
||||
} catch (ClassNotFoundException ex) {
|
||||
throw new UncheckedWrapperException(ex);
|
||||
}
|
||||
|
||||
final SettingInfo settingInfo = settingManager.getSettingInfo(
|
||||
confClass, selectedSetting.getSelectedKey(state));
|
||||
|
||||
target.setText(settingInfo.getDescription(globalizationHelper
|
||||
.getNegotiatedLocale()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
|
||||
/**
|
||||
* A subclass of {@link AbstractSettingFormSingleValue} for editing the value
|
||||
* of a {@link LongSetting}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormLong extends AbstractSettingFormSingleValue<Long> {
|
||||
|
||||
public SettingFormLong(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super(configurationTab, selectedConf, selectedSetting);
|
||||
}
|
||||
|
||||
@Override
|
||||
Long convertValue(final String valueData) {
|
||||
return Long.parseLong(valueData);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -1,44 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2016 LibreCCM Foundation.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||
* MA 02110-1301 USA
|
||||
*/
|
||||
package com.arsdigita.ui.admin.configuration;
|
||||
|
||||
import com.arsdigita.bebop.ParameterSingleSelectionModel;
|
||||
|
||||
/**
|
||||
* A subclass of {@link AbstractSettingFormSingleValue} for editing the value
|
||||
* of a {@link StringSetting}.
|
||||
*
|
||||
* @author <a href="mailto:jens.pelzetter@googlemail.com">Jens Pelzetter</a>
|
||||
*/
|
||||
public class SettingFormString extends AbstractSettingFormSingleValue<String> {
|
||||
|
||||
public SettingFormString(
|
||||
final ConfigurationTab configurationTab,
|
||||
final ParameterSingleSelectionModel<String> selectedConf,
|
||||
final ParameterSingleSelectionModel<String> selectedSetting) {
|
||||
|
||||
super(configurationTab, selectedConf, selectedSetting);
|
||||
}
|
||||
|
||||
@Override
|
||||
String convertValue(final String valueData) {
|
||||
return valueData;
|
||||
}
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue