/*
* Copyright (c) 2010-2015 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.evolveum.midpoint.web.page.admin.configuration;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.evolveum.midpoint.web.application.Url;
import com.evolveum.midpoint.web.page.admin.configuration.component.*;
import com.evolveum.midpoint.web.page.admin.configuration.dto.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.tabs.AbstractTab;
import org.apache.wicket.extensions.markup.html.tabs.ITab;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.util.string.StringValue;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.delta.DiffUtil;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.logging.LoggingUtils;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.application.AuthorizationAction;
import com.evolveum.midpoint.web.application.PageDescriptor;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.AjaxSubmitButton;
import com.evolveum.midpoint.web.component.TabbedPanel;
import com.evolveum.midpoint.web.component.form.Form;
import com.evolveum.midpoint.web.page.error.PageError;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
/**
* @author lazyman
*/
@PageDescriptor(
urls = {
@Url(mountUrl = "/admin/config", matchUrlForSecurity = "/admin/config"),
@Url(mountUrl = "/admin/config/system"),
},
action = {
@AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL,
label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL,
description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION),
@AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CONFIGURATION_SYSTEM_CONFIG_URL,
label = "PageSystemConfiguration.auth.configSystemConfiguration.label",
description = "PageSystemConfiguration.auth.configSystemConfiguration.description")
})
public class PageSystemConfiguration extends PageAdminConfiguration {
public static final String SELECTED_TAB_INDEX = "tab";
public static final int CONFIGURATION_TAB_BASIC = 0;
public static final int CONFIGURATION_TAB_NOTIFICATION = 1;
public static final int CONFIGURATION_TAB_LOGGING = 2;
public static final int CONFIGURATION_TAB_PROFILING = 3;
public static final int CONFIGURATION_TAB_ADMIN_GUI = 4;
private static final Trace LOGGER = TraceManager.getTrace(PageSystemConfiguration.class);
private static final String DOT_CLASS = PageSystemConfiguration.class.getName() + ".";
private static final String TASK_GET_SYSTEM_CONFIG = DOT_CLASS + "getSystemConfiguration";
private static final String TASK_UPDATE_SYSTEM_CONFIG = DOT_CLASS + "updateSystemConfiguration";
private static final String ID_MAIN_FORM = "mainForm";
private static final String ID_TAB_PANEL = "tabPanel";
private static final String ID_CANCEL = "cancel";
private static final String ID_SAVE = "save";
public static final String ROOT_APPENDER_INHERITANCE_CHOICE = "(Inherit root)";
private LoggingConfigPanel loggingConfigPanel;
private ProfilingConfigPanel profilingConfigPanel;
private SystemConfigPanel systemConfigPanel;
private AdminGuiConfigPanel adminGuiConfigPanel;
private NotificationConfigPanel notificationConfigPanel;
private LoadableModel<SystemConfigurationDto> model;
private boolean initialized;
public PageSystemConfiguration() {
this(null);
}
public PageSystemConfiguration(PageParameters parameters) {
super(parameters);
model = new LoadableModel<SystemConfigurationDto>(false) {
@Override
protected SystemConfigurationDto load() {
return loadSystemConfiguration();
}
};
initLayout();
}
private SystemConfigurationDto loadSystemConfiguration() {
Task task = createSimpleTask(TASK_GET_SYSTEM_CONFIG);
OperationResult result = new OperationResult(TASK_GET_SYSTEM_CONFIG);
Collection<SelectorOptions<GetOperationOptions>> options = SelectorOptions.createCollection(
GetOperationOptions.createResolve(), SystemConfigurationType.F_DEFAULT_USER_TEMPLATE,
SystemConfigurationType.F_GLOBAL_PASSWORD_POLICY);
SystemConfigurationDto dto = null;
try {
PrismObject<SystemConfigurationType> systemConfig = WebModelServiceUtils.loadObject(
SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), options,
this, task, result);
dto = new SystemConfigurationDto(systemConfig);
result.recordSuccess();
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load system configuration", ex);
result.recordFatalError("Couldn't load system configuration.", ex);
}
// what do you do with null? many components depends on this not to be
// null :)
if (!WebComponentUtil.isSuccessOrHandledError(result) || dto == null) {
showResult(result, false);
throw getRestartResponseException(PageError.class);
}
return dto;
}
private void initLayout() {
Form mainForm = new Form(ID_MAIN_FORM, true);
add(mainForm);
List<ITab> tabs = new ArrayList<>();
tabs.add(new AbstractTab(createStringResource("pageSystemConfiguration.system.title")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
systemConfigPanel = new SystemConfigPanel(panelId, model);
return systemConfigPanel;
}
});
tabs.add(new AbstractTab(createStringResource("pageSystemConfiguration.notifications.title")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
notificationConfigPanel = new NotificationConfigPanel(panelId,
new PropertyModel<NotificationConfigurationDto>(model, "notificationConfig"));
return notificationConfigPanel;
}
});
tabs.add(new AbstractTab(createStringResource("pageSystemConfiguration.logging.title")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
loggingConfigPanel = new LoggingConfigPanel(panelId,
new PropertyModel<LoggingDto>(model, "loggingConfig"));
return loggingConfigPanel;
}
});
tabs.add(new AbstractTab(createStringResource("pageSystemConfiguration.profiling.title")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
profilingConfigPanel = new ProfilingConfigPanel(panelId,
new PropertyModel<ProfilingDto>(model, "profilingDto"), PageSystemConfiguration.this);
return profilingConfigPanel;
}
});
tabs.add(new AbstractTab(createStringResource("pageSystemConfiguration.adminGui.title")) {
@Override
public WebMarkupContainer getPanel(String panelId) {
adminGuiConfigPanel = new AdminGuiConfigPanel(panelId, model);
return adminGuiConfigPanel;
}
});
TabbedPanel tabPanel = new TabbedPanel(ID_TAB_PANEL, tabs) {
@Override
protected void onTabChange(int index) {
PageParameters params = getPageParameters();
params.set(SELECTED_TAB_INDEX, index);
}
};
tabPanel.setOutputMarkupId(true);
mainForm.add(tabPanel);
initButtons(mainForm);
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
if (!initialized) {
PageParameters params = getPageParameters();
StringValue val = params.get(SELECTED_TAB_INDEX);
String value = null;
if (val != null && !val.isNull()) {
value = val.toString();
}
int index = StringUtils.isNumeric(value) ? Integer.parseInt(value) : CONFIGURATION_TAB_BASIC;
getTabPanel().setSelectedTab(index);
initialized = true;
}
}
private void initButtons(Form mainForm) {
AjaxSubmitButton save = new AjaxSubmitButton(ID_SAVE, createStringResource("PageBase.button.save")) {
@Override
protected void onSubmit(AjaxRequestTarget target,
org.apache.wicket.markup.html.form.Form<?> form) {
savePerformed(target);
}
@Override
protected void onError(AjaxRequestTarget target, org.apache.wicket.markup.html.form.Form form) {
target.add(getFeedbackPanel());
}
};
mainForm.add(save);
AjaxButton cancel = new AjaxButton(ID_CANCEL, createStringResource("PageBase.button.cancel")) {
@Override
public void onClick(AjaxRequestTarget target) {
cancelPerformed(target);
}
};
mainForm.add(cancel);
}
private TabbedPanel getTabPanel() {
return (TabbedPanel) get(createComponentPath(ID_MAIN_FORM, ID_TAB_PANEL));
}
private void savePerformed(AjaxRequestTarget target) {
OperationResult result = new OperationResult(TASK_UPDATE_SYSTEM_CONFIG);
String oid = SystemObjectsType.SYSTEM_CONFIGURATION.value();
Task task = createSimpleTask(TASK_UPDATE_SYSTEM_CONFIG);
try {
SystemConfigurationType newObject = model.getObject().getNewObject();
saveObjectPolicies(newObject);
saveAdminGui(newObject);
ObjectDelta<SystemConfigurationType> delta = DiffUtil.diff(model.getObject().getOldObject(), newObject);
delta.normalize();
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("System configuration delta:\n{}", delta.debugDump());
}
if (delta != null && !delta.isEmpty()) {
getPrismContext().adopt(delta);
getModelService().executeChanges(WebComponentUtil.createDeltaCollection(delta), null, task,
result);
}
result.computeStatusIfUnknown();
} catch (Exception e) {
result.recomputeStatus();
result.recordFatalError("Couldn't save system configuration.", e);
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't save system configuration.", e);
}
showResult(result);
target.add(getFeedbackPanel());
resetPerformed(target);
}
private void saveObjectPolicies(SystemConfigurationType systemConfig) {
if (systemConfigPanel == null) {
return;
}
List<ObjectPolicyConfigurationTypeDto> configList = systemConfigPanel.getModel().getObject()
.getObjectPolicyList();
List<ObjectPolicyConfigurationType> confList = new ArrayList<>();
ObjectPolicyConfigurationType newObjectPolicyConfig;
for (ObjectPolicyConfigurationTypeDto o : configList) {
if (o.isEmpty()){
continue;
}
newObjectPolicyConfig = new ObjectPolicyConfigurationType();
newObjectPolicyConfig.setType(o.getType());
newObjectPolicyConfig.setSubtype(o.getSubtype());
newObjectPolicyConfig.setObjectTemplateRef(o.getTemplateRef());
List<PropertyConstraintType> constraintList = new ArrayList<>();
PropertyConstraintType property;
if (o.getConstraints() != null) {
for (PropertyConstraintTypeDto c : o.getConstraints()) {
if (StringUtils.isNotEmpty(c.getPropertyPath())) {
property = new PropertyConstraintType();
property.setOidBound(c.isOidBound());
property.setPath(new ItemPathType(c.getPropertyPath()));
constraintList.add(property);
}
}
}
newObjectPolicyConfig.getPropertyConstraint().addAll(constraintList);
confList.add(newObjectPolicyConfig);
}
if (confList.isEmpty()){
if (!systemConfig.getDefaultObjectPolicyConfiguration().isEmpty()){
systemConfig.getDefaultObjectPolicyConfiguration().clear();
}
return;
}
systemConfig.getDefaultObjectPolicyConfiguration().clear();
systemConfig.getDefaultObjectPolicyConfiguration().addAll(confList);
}
private void saveAdminGui(SystemConfigurationType systemConfig) {
if (adminGuiConfigPanel == null) {
return;
}
SystemConfigurationDto linksList = adminGuiConfigPanel.getModel().getObject();
//update userDashboardLink list
systemConfig.getAdminGuiConfiguration().getUserDashboardLink().clear();
systemConfig.getAdminGuiConfiguration().getUserDashboardLink().addAll(linksList.getUserDashboardLink());
//update additionalMenu list
systemConfig.getAdminGuiConfiguration().getAdditionalMenuLink().clear();
systemConfig.getAdminGuiConfiguration().getAdditionalMenuLink().addAll(linksList.getAdditionalMenuLink());
}
private void resetPerformed(AjaxRequestTarget target) {
int index = getTabPanel().getSelectedTab();
PageParameters params = new PageParameters();
params.add(SELECTED_TAB_INDEX, index);
PageSystemConfiguration page = new PageSystemConfiguration(params);
setResponsePage(page);
}
private void cancelPerformed(AjaxRequestTarget target) {
resetPerformed(target);
}
}