/*
* Copyright (c) 2010-2016 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.gui.api.page;
import java.io.Serializable;
import java.util.*;
import javax.management.MBeanServer;
import javax.management.MBeanServerFactory;
import javax.management.ObjectName;
import com.evolveum.midpoint.audit.api.AuditService;
import com.evolveum.midpoint.common.SystemConfigurationHolder;
import com.evolveum.midpoint.gui.api.SubscriptionType;
import com.evolveum.midpoint.model.api.*;
import com.evolveum.midpoint.web.component.menu.*;
import com.evolveum.midpoint.web.page.admin.configuration.*;
import com.evolveum.midpoint.web.page.admin.reports.*;
import com.evolveum.midpoint.web.page.self.*;
import com.evolveum.midpoint.web.util.NewWindowNotifyingBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
import org.apache.wicket.*;
import org.apache.wicket.ajax.AbstractDefaultAjaxBehavior;
import org.apache.wicket.ajax.AjaxNewWindowNotifyingBehavior;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.devutils.debugbar.DebugBar;
import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow;
import org.apache.wicket.feedback.FeedbackMessage;
import org.apache.wicket.feedback.FeedbackMessages;
import org.apache.wicket.injection.Injector;
import org.apache.wicket.markup.head.IHeaderResponse;
import org.apache.wicket.markup.head.JavaScriptHeaderItem;
import org.apache.wicket.markup.head.OnDomReadyHeaderItem;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import org.apache.wicket.protocol.http.WebSession;
import org.apache.wicket.request.mapper.parameter.PageParameters;
import org.apache.wicket.resource.CoreLibrariesContributor;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.apache.wicket.util.string.StringValue;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import com.evolveum.midpoint.common.configuration.api.MidpointConfiguration;
import com.evolveum.midpoint.common.validator.EventHandler;
import com.evolveum.midpoint.common.validator.EventResult;
import com.evolveum.midpoint.common.validator.Validator;
import com.evolveum.midpoint.gui.api.GuiStyleConstants;
import com.evolveum.midpoint.gui.api.component.result.OpResult;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.model.api.validator.ResourceValidator;
import com.evolveum.midpoint.model.common.expression.ExpressionFactory;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.match.MatchingRuleRegistry;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.builder.QueryBuilder;
import com.evolveum.midpoint.report.api.ReportManager;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.security.api.MidPointPrincipal;
import com.evolveum.midpoint.security.api.SecurityEnforcer;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.task.api.TaskCategory;
import com.evolveum.midpoint.task.api.TaskManager;
import com.evolveum.midpoint.util.Holder;
import com.evolveum.midpoint.util.Producer;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
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.DescriptorLoader;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb;
import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageClass;
import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageInstance;
import com.evolveum.midpoint.web.component.dialog.MainPopupDialog;
import com.evolveum.midpoint.web.component.dialog.Popupable;
import com.evolveum.midpoint.web.component.menu.top.LocalePanel;
import com.evolveum.midpoint.web.component.message.FeedbackAlerts;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.PageAdmin;
import com.evolveum.midpoint.web.page.admin.PageAdminFocus;
import com.evolveum.midpoint.web.page.admin.certification.PageCertCampaigns;
import com.evolveum.midpoint.web.page.admin.certification.PageCertDecisions;
import com.evolveum.midpoint.web.page.admin.certification.PageCertDefinition;
import com.evolveum.midpoint.web.page.admin.certification.PageCertDefinitions;
import com.evolveum.midpoint.web.page.admin.home.PageDashboard;
import com.evolveum.midpoint.web.page.admin.resources.PageConnectorHosts;
import com.evolveum.midpoint.web.page.admin.resources.PageImportResource;
import com.evolveum.midpoint.web.page.admin.resources.PageResource;
import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard;
import com.evolveum.midpoint.web.page.admin.resources.PageResources;
import com.evolveum.midpoint.web.page.admin.roles.PageRole;
import com.evolveum.midpoint.web.page.admin.roles.PageRoles;
import com.evolveum.midpoint.web.page.admin.server.PageTaskAdd;
import com.evolveum.midpoint.web.page.admin.server.PageTaskEdit;
import com.evolveum.midpoint.web.page.admin.server.PageTasks;
import com.evolveum.midpoint.web.page.admin.server.PageTasksCertScheduling;
import com.evolveum.midpoint.web.page.admin.services.PageService;
import com.evolveum.midpoint.web.page.admin.services.PageServices;
import com.evolveum.midpoint.web.page.admin.users.PageOrgTree;
import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit;
import com.evolveum.midpoint.web.page.admin.users.PageUser;
import com.evolveum.midpoint.web.page.admin.users.PageUsers;
import com.evolveum.midpoint.web.page.admin.workflow.PageProcessInstancesAll;
import com.evolveum.midpoint.web.page.admin.workflow.PageProcessInstancesRequestedBy;
import com.evolveum.midpoint.web.page.admin.workflow.PageProcessInstancesRequestedFor;
import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItemsAll;
import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItemsAllocatedToMe;
import com.evolveum.midpoint.web.page.admin.workflow.PageWorkItemsClaimable;
import com.evolveum.midpoint.web.page.login.PageLogin;
import com.evolveum.midpoint.web.security.MidPointApplication;
import com.evolveum.midpoint.web.security.MidPointAuthWebSession;
import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.web.security.WebApplicationConfiguration;
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.web.util.validation.MidpointFormValidatorRegistry;
import com.evolveum.midpoint.wf.api.WorkflowManager;
import static com.evolveum.midpoint.gui.api.GuiStyleConstants.DEFAULT_BG_COLOR;
/**
* @author lazyman
* @author semancik
*/
public abstract class PageBase extends WebPage implements ModelServiceLocator {
private static final long serialVersionUID = 1L;
private static final String DOT_CLASS = PageBase.class.getName() + ".";
private static final String OPERATION_LOAD_USER = DOT_CLASS + "loadUser";
private static final String OPERATION_LOAD_WORK_ITEM_COUNT = DOT_CLASS + "loadWorkItemCount";
private static final String ID_TITLE = "title";
private static final String ID_MAIN_HEADER = "mainHeader";
private static final String ID_PAGE_TITLE_CONTAINER = "pageTitleContainer";
private static final String ID_PAGE_TITLE_REAL = "pageTitleReal";
private static final String ID_PAGE_TITLE = "pageTitle";
private static final String ID_DEBUG_PANEL = "debugPanel";
private static final String ID_VERSION = "version";
public static final String ID_FEEDBACK_CONTAINER = "feedbackContainer";
private static final String ID_FEEDBACK = "feedback";
private static final String ID_DEBUG_BAR = "debugBar";
private static final String ID_CLEAR_CACHE = "clearCssCache";
private static final String ID_SIDEBAR_MENU = "sidebarMenu";
private static final String ID_RIGHT_MENU = "rightMenu";
private static final String ID_LOCALE = "locale";
private static final String ID_MENU_TOGGLE = "menuToggle";
private static final String ID_BREADCRUMBS = "breadcrumbs";
private static final String ID_BREADCRUMB = "breadcrumb";
private static final String ID_BC_LINK = "bcLink";
private static final String ID_BC_ICON = "bcIcon";
private static final String ID_BC_NAME = "bcName";
private static final String ID_MAIN_POPUP = "mainPopup";
private static final String ID_MAIN_POPUP_BODY = "popupBody";
private static final String ID_SUBSCRIPTION_MESSAGE = "subscriptionMessage";
private static final String ID_FOOTER_CONTAINER = "footerContainer";
private static final String ID_COPYRIGHT_MESSAGE = "copyrightMessage";
private static final String ID_LOGO = "logo";
private static final String ID_CUSTOM_LOGO = "customLogo";
private static final String ID_CUSTOM_LOGO_IMG_SRC = "customLogoImgSrc";
private static final String ID_CUSTOM_LOGO_IMG_CSS = "customLogoImgCss";
private static final String ID_NAVIGATION = "navigation";
private static final String ID_DEPLOYMENT_NAME = "deploymentName";
private static final String OPERATION_GET_SYSTEM_CONFIG = DOT_CLASS + "getSystemConfiguration";
private static final String OPERATION_GET_DEPLOYMENT_INFORMATION = DOT_CLASS + "getDeploymentInformation";
private static final Trace LOGGER = TraceManager.getTrace(PageBase.class);
// Strictly speaking following fields should be transient.
// But making them transient is causing problems on some
// JVM version or tomcat configurations (MID-3357).
// It seems to be somehow related to session persistence.
// But honestly I have no idea about the real cause.
// Anyway, setting these fields to non-transient seems to
// fix it. And surprisingly it does not affect the session
// size.
@SpringBean(name = "modelController")
private ScriptingService scriptingService;
@SpringBean(name = "modelController")
private ModelService modelService;
@SpringBean(name = "modelInteractionService")
private ModelInteractionService modelInteractionService;
@SpringBean(name = "modelController")
private TaskService taskService;
@SpringBean(name = "modelDiagController")
private ModelDiagnosticService modelDiagnosticService;
@SpringBean(name = "taskManager")
private TaskManager taskManager;
@SpringBean(name = "auditService")
private AuditService auditService;
@SpringBean(name = "modelController")
private WorkflowService workflowService;
@SpringBean(name = "workflowManager")
private WorkflowManager workflowManager;
@SpringBean(name = "midpointConfiguration")
private MidpointConfiguration midpointConfiguration;
@SpringBean(name = "reportManager")
private ReportManager reportManager;
@SpringBean(name = "resourceValidator")
private ResourceValidator resourceValidator;
// @SpringBean(name = "certificationManager")
// private CertificationManager certificationManager;
@SpringBean(name = "modelController")
private AccessCertificationService certficationService;
@SpringBean(name = "accessDecisionManager")
private SecurityEnforcer securityEnforcer;
@SpringBean
private MidpointFormValidatorRegistry formValidatorRegistry;
private List<Breadcrumb> breadcrumbs;
private boolean initialized = false;
private LoadableModel<Integer> workItemCountModel;
private LoadableModel<DeploymentInformationType> deploymentInfoModel;
public PageBase(PageParameters parameters) {
super(parameters);
LOGGER.debug("Initializing page {}", this.getClass());
Injector.get().inject(this);
Validate.notNull(modelService, "Model service was not injected.");
Validate.notNull(taskManager, "Task manager was not injected.");
Validate.notNull(reportManager, "Report manager was not injected.");
MidPointAuthWebSession.getSession().setClientCustomization();
add(new NewWindowNotifyingBehavior());
initializeModel();
initLayout();
}
@Override
protected void onConfigure() {
super.onConfigure();
if (initialized) {
return;
}
initialized = true;
createBreadcrumb();
}
private void initializeModel() {
workItemCountModel = new LoadableModel<Integer>() {
private static final long serialVersionUID = 1L;
@Override
protected Integer load() {
try {
Task task = createSimpleTask(OPERATION_LOAD_WORK_ITEM_COUNT);
ObjectQuery query = QueryBuilder.queryFor(WorkItemType.class, getPrismContext())
.item(WorkItemType.F_ASSIGNEE_REF).ref(getPrincipal().getOid())
.build();
return getModelService().countContainers(WorkItemType.class, query, null, task, task.getResult());
} catch (SchemaException|SecurityViolationException e) {
LoggingUtils.logExceptionAsWarning(LOGGER, "Couldn't load work item count", e);
return null;
}
}
};
deploymentInfoModel = new LoadableModel<DeploymentInformationType>() {
private static final long serialVersionUID = 1L;
@Override
protected DeploymentInformationType load() {
return loadDeploymentInformationType();
}
};
}
public void resetWorkItemCountModel() {
if (workItemCountModel != null) {
workItemCountModel.reset();
}
}
protected void createBreadcrumb() {
BreadcrumbPageClass bc = new BreadcrumbPageClass(new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return getPageTitleModel().getObject();
}
}, this.getClass(), getPageParameters());
addBreadcrumb(bc);
}
protected void createInstanceBreadcrumb() {
BreadcrumbPageInstance bc = new BreadcrumbPageInstance(new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return getPageTitleModel().getObject();
}
}, this);
addBreadcrumb(bc);
}
public void updateBreadcrumbParameters(String key, Object value) {
List<Breadcrumb> list = getBreadcrumbs();
if (list.isEmpty()) {
return;
}
Breadcrumb bc = list.get(list.size() - 1);
PageParameters params = bc.getParameters();
if (params == null) {
return;
}
params.set(key, value);
}
public PageBase() {
this(null);
}
public MidPointApplication getMidpointApplication() {
return (MidPointApplication) getApplication();
}
public WebApplicationConfiguration getWebApplicationConfiguration() {
MidPointApplication application = getMidpointApplication();
return application.getWebApplicationConfiguration();
}
public PrismContext getPrismContext() {
return getMidpointApplication().getPrismContext();
}
public ExpressionFactory getExpressionFactory() {
return getMidpointApplication().getExpressionFactory();
}
public MatchingRuleRegistry getMatchingRuleRegistry() {
return getMidpointApplication().getMatchingRuleRegistry();
}
public TaskManager getTaskManager() {
return taskManager;
}
public WorkflowService getWorkflowService() {
return workflowService;
}
public WorkflowManager getWorkflowManager() {
return workflowManager;
}
public ResourceValidator getResourceValidator() {
return resourceValidator;
}
public ReportManager getReportManager() {
return reportManager;
}
public AuditService getAuditService() {
return auditService;
}
public AccessCertificationService getCertificationService() {
return certficationService;
}
@Override
public ModelService getModelService() {
return modelService;
}
public ScriptingService getScriptingService() {
return scriptingService;
}
public TaskService getTaskService() {
return taskService;
}
public SecurityEnforcer getSecurityEnforcer() {
return securityEnforcer;
}
@Override
public ModelInteractionService getModelInteractionService() {
return modelInteractionService;
}
protected ModelDiagnosticService getModelDiagnosticService() {
return modelDiagnosticService;
}
public MidpointFormValidatorRegistry getFormValidatorRegistry() {
return formValidatorRegistry;
}
public MidPointPrincipal getPrincipal() {
return SecurityUtils.getPrincipalUser();
}
public static StringResourceModel createStringResourceStatic(Component component, Enum e) {
String resourceKey = createEnumResourceKey(e);
return createStringResourceStatic(component, resourceKey);
}
public static String createEnumResourceKey(Enum e) {
return e.getDeclaringClass().getSimpleName() + "." + e.name();
}
public Task createAnonymousTask(String operation) {
TaskManager manager = getTaskManager();
Task task = manager.createTaskInstance(operation);
task.setChannel(SchemaConstants.CHANNEL_GUI_USER_URI);
return task;
}
public Task createSimpleTask(String operation) {
MidPointPrincipal user = SecurityUtils.getPrincipalUser();
if (user == null) {
throw new RestartResponseException(PageLogin.class);
}
return WebModelServiceUtils.createSimpleTask(operation, user.getUser().asPrismObject(), getTaskManager());
}
public MidpointConfiguration getMidpointConfiguration() {
return midpointConfiguration;
}
@Override
public void renderHead(IHeaderResponse response) {
super.renderHead(response);
// this attaches jquery.js as first header item, which is used in our
// scripts.
CoreLibrariesContributor.contribute(getApplication(), response);
// response.render(JavaScriptHeaderItem.forScript("alert(window.name);", "windowNameScript"));
}
@Override
protected void onBeforeRender() {
super.onBeforeRender();
FeedbackMessages messages = getSession().getFeedbackMessages();
for (FeedbackMessage message : messages) {
getFeedbackMessages().add(message);
}
getSession().getFeedbackMessages().clear();
}
private void initHeaderLayout(WebMarkupContainer container) {
WebMarkupContainer menuToggle = new WebMarkupContainer(ID_MENU_TOGGLE);
menuToggle.add(createUserStatusBehaviour(true));
container.add(menuToggle);
UserMenuPanel rightMenu = new UserMenuPanel(ID_RIGHT_MENU);
rightMenu.add(createUserStatusBehaviour(true));
container.add(rightMenu);
LocalePanel locale = new LocalePanel(ID_LOCALE);
locale.add(createUserStatusBehaviour(false));
container.add(locale);
}
private void initTitleLayout(WebMarkupContainer mainHeader) {
WebMarkupContainer pageTitleContainer = new WebMarkupContainer(ID_PAGE_TITLE_CONTAINER);
pageTitleContainer.add(createUserStatusBehaviour(true));
mainHeader.add(pageTitleContainer);
WebMarkupContainer pageTitle = new WebMarkupContainer(ID_PAGE_TITLE);
pageTitleContainer.add(pageTitle);
String environmentName = "";
if (deploymentInfoModel != null && deploymentInfoModel.getObject() != null &&
StringUtils.isNotEmpty(deploymentInfoModel.getObject().getName())) {
environmentName = deploymentInfoModel.getObject().getName();
}
Model<String> deploymentNameModel = new Model<String>(StringUtils.isNotEmpty(environmentName) ? environmentName + ": " : "");
Label deploymentName = new Label(ID_DEPLOYMENT_NAME, deploymentNameModel);
deploymentName.add(new VisibleEnableBehaviour(){
public boolean isVisible(){
return StringUtils.isNotEmpty(deploymentNameModel.getObject());
}
});
deploymentName.setRenderBodyOnly(true);
pageTitle.add(deploymentName);
Label pageTitleReal = new Label(ID_PAGE_TITLE_REAL, createPageTitleModel());
pageTitleReal.setRenderBodyOnly(true);
pageTitle.add(pageTitleReal);
ListView breadcrumbs = new ListView<Breadcrumb>(ID_BREADCRUMB,
new AbstractReadOnlyModel<List<Breadcrumb>>() {
private static final long serialVersionUID = 1L;
@Override
public List<Breadcrumb> getObject() {
return getBreadcrumbs();
}
}) {
@Override
protected void populateItem(ListItem<Breadcrumb> item) {
final Breadcrumb dto = item.getModelObject();
AjaxLink bcLink = new AjaxLink(ID_BC_LINK) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
redirectBackToBreadcrumb(dto);
}
};
item.add(bcLink);
bcLink.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
return dto.isUseLink();
}
});
WebMarkupContainer bcIcon = new WebMarkupContainer(ID_BC_ICON);
bcIcon.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return dto.getIcon() != null && dto.getIcon().getObject() != null;
}
});
bcIcon.add(AttributeModifier.replace("class", dto.getIcon()));
bcLink.add(bcIcon);
Label bcName = new Label(ID_BC_NAME, dto.getLabel());
bcLink.add(bcName);
item.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return dto.isVisible();
}
});
}
};
mainHeader.add(breadcrumbs);
}
private void initLayout() {
WebMarkupContainer mainHeader = new WebMarkupContainer(ID_MAIN_HEADER);
mainHeader.setOutputMarkupId(true);
add(mainHeader);
AjaxLink logo = new AjaxLink(ID_LOGO) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
Class<? extends Page> page = MidPointApplication.get().getHomePage();
setResponsePage(page);
}
};
logo.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return !isCustomLogoVisible();
}
});
mainHeader.add(logo);
AjaxLink customLogo = new AjaxLink(ID_CUSTOM_LOGO) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
//TODO may be this should lead to customerUrl ?
Class<? extends Page> page = MidPointApplication.get().getHomePage();
setResponsePage(page);
}
};
customLogo.add(new VisibleEnableBehaviour(){
@Override
public boolean isVisible(){
return isCustomLogoVisible();
}
});
mainHeader.add(customLogo);
WebMarkupContainer navigation = new WebMarkupContainer(ID_NAVIGATION);
mainHeader.add(navigation);
WebMarkupContainer customLogoImgSrc = new WebMarkupContainer(ID_CUSTOM_LOGO_IMG_SRC);
WebMarkupContainer customLogoImgCss = new WebMarkupContainer(ID_CUSTOM_LOGO_IMG_CSS);
if (deploymentInfoModel != null && deploymentInfoModel.getObject() != null &&
deploymentInfoModel.getObject().getLogo() != null){
if (StringUtils.isNotEmpty(deploymentInfoModel.getObject().getLogo().getCssClass())) {
customLogoImgCss.add(new AttributeAppender("class", deploymentInfoModel.getObject().getLogo().getCssClass()));
customLogoImgSrc.setVisible(false);
} else {
customLogoImgSrc.add(new AttributeAppender("src",
deploymentInfoModel.getObject().getLogo().getImageUrl()));
customLogoImgCss.setVisible(false);
}
mainHeader.add(new AttributeAppender("style",
"background-color: " + GuiStyleConstants.DEFAULT_BG_COLOR + "; !important;"));
}
customLogo.add(customLogoImgSrc);
customLogo.add(customLogoImgCss);
Label title = new Label(ID_TITLE, createPageTitleModel());
title.setRenderBodyOnly(true);
add(title);
initHeaderLayout(navigation);
initTitleLayout(navigation);
if (deploymentInfoModel != null && deploymentInfoModel.getObject() != null &&
StringUtils.isNotEmpty(deploymentInfoModel.getObject().getHeaderColor())) {
logo.add(new AttributeAppender("style",
"background-color: " + deploymentInfoModel.getObject().getHeaderColor() + "; !important;"));
customLogo.add(new AttributeAppender("style",
"background-color: " + deploymentInfoModel.getObject().getHeaderColor() + "; !important;"));
mainHeader.add(new AttributeAppender("style",
"background-color: " + deploymentInfoModel.getObject().getHeaderColor() + "; !important;"));
navigation.add(new AttributeAppender("style",
"background-color: " + deploymentInfoModel.getObject().getHeaderColor() + "; !important;"));
}
initDebugBarLayout();
List<SideBarMenuItem> menuItems = createMenuItems();
SideBarMenuPanel sidebarMenu = new SideBarMenuPanel(ID_SIDEBAR_MENU, new Model((Serializable) menuItems));
sidebarMenu.add(createUserStatusBehaviour(true));
add(sidebarMenu);
WebMarkupContainer footerContainer = new WebMarkupContainer(ID_FOOTER_CONTAINER);
footerContainer.setOutputMarkupId(true);
footerContainer.add(getFooterVisibleBehaviour());
add(footerContainer);
WebMarkupContainer version = new WebMarkupContainer(ID_VERSION) {
private static final long serialVersionUID = 1L;
@Deprecated
public String getDescribe() {
return PageBase.this.getDescribe();
}
};
version.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return RuntimeConfigurationType.DEVELOPMENT.equals(getApplication().getConfigurationType());
}
});
footerContainer.add(version);
WebMarkupContainer copyrightMessage = new WebMarkupContainer(ID_COPYRIGHT_MESSAGE);
copyrightMessage.add(getFooterVisibleBehaviour());
footerContainer.add(copyrightMessage);
Label subscriptionMessage = new Label(ID_SUBSCRIPTION_MESSAGE,
new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
String subscriptionId = getSubscriptionId();
if (!WebComponentUtil.isSubscriptionIdCorrect(subscriptionId)){
return " " + createStringResource("PageBase.nonActiveSubscriptionMessage").getString();
}
if (SubscriptionType.DEMO_SUBSRIPTION.getSubscriptionType().equals(subscriptionId.substring(0, 2))){
return " " + createStringResource("PageBase.demoSubscriptionMessage").getString();
}
return "";
}
});
subscriptionMessage.setOutputMarkupId(true);
subscriptionMessage.add(getFooterVisibleBehaviour());
footerContainer.add(subscriptionMessage);
WebMarkupContainer feedbackContainer = new WebMarkupContainer(ID_FEEDBACK_CONTAINER);
feedbackContainer.setOutputMarkupId(true);
add(feedbackContainer);
FeedbackAlerts feedbackList = new FeedbackAlerts(ID_FEEDBACK);
feedbackList.setOutputMarkupId(true);
feedbackContainer.add(feedbackList);
MainPopupDialog mainPopup = new MainPopupDialog(ID_MAIN_POPUP);
mainPopup.setOutputMarkupId(true);
add(mainPopup);
}
public MainPopupDialog getMainPopup() {
return (MainPopupDialog) get(ID_MAIN_POPUP);
}
public String getMainPopupBodyId() {
return ID_MAIN_POPUP_BODY;
}
public void setMainPopupTitle(IModel<String> title) {
getMainPopup().setTitle(title);
}
public void showMainPopup(Popupable popupable, AjaxRequestTarget target) {
getMainPopup().setBody(popupable);
getMainPopup().show(target);
}
public void hideMainPopup(AjaxRequestTarget target) {
getMainPopup().close(target);
}
private VisibleEnableBehaviour createUserStatusBehaviour(final boolean visibleIfLoggedIn) {
return new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return isSideMenuVisible(visibleIfLoggedIn);
}
};
}
protected boolean isSideMenuVisible(boolean visibleIfLoggedIn) {
return SecurityUtils.getPrincipalUser() != null ? visibleIfLoggedIn : !visibleIfLoggedIn;
}
private void initDebugBarLayout() {
DebugBar debugPanel = new DebugBar(ID_DEBUG_PANEL);
add(debugPanel);
WebMarkupContainer debugBar = new WebMarkupContainer(ID_DEBUG_BAR);
debugBar.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
RuntimeConfigurationType runtime = getApplication().getConfigurationType();
return RuntimeConfigurationType.DEVELOPMENT.equals(runtime);
}
});
add(debugBar);
AjaxButton clearCache = new AjaxButton(ID_CLEAR_CACHE, createStringResource("PageBase.clearCssCache")) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
clearLessJsCache(target);
}
};
debugBar.add(clearCache);
}
protected void clearLessJsCache(AjaxRequestTarget target) {
try {
ArrayList<MBeanServer> servers = MBeanServerFactory.findMBeanServer(null);
if (servers.size() > 1) {
LOGGER.info("Too many mbean servers, cache won't be cleared.");
for (MBeanServer server : servers) {
LOGGER.info(server.getDefaultDomain());
}
return;
}
MBeanServer server = servers.get(0);
ObjectName objectName = ObjectName.getInstance("wro4j-idm:type=WroConfiguration");
server.invoke(objectName, "reloadCache", new Object[] {}, new String[] {});
if (target != null) {
target.add(PageBase.this);
}
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't clear less/js cache", ex);
error("Error occurred, reason: " + ex.getMessage());
if (target != null) {
target.add(getFeedbackPanel());
}
}
}
public WebMarkupContainer getFeedbackPanel() {
return (WebMarkupContainer) get(ID_FEEDBACK_CONTAINER);
}
public SessionStorage getSessionStorage() {
MidPointAuthWebSession session = (MidPointAuthWebSession) getSession();
return session.getSessionStorage();
}
protected IModel<String> createPageTitleModel() {
String key = getClass().getSimpleName() + ".title";
return createStringResource(key);
}
public IModel<String> getPageTitleModel() {
return (IModel) get(ID_TITLE).getDefaultModel();
}
public String getString(String resourceKey, Object... objects) {
return createStringResource(resourceKey, objects).getString();
}
public StringResourceModel createStringResource(String resourceKey, Object... objects) {
return new StringResourceModel(resourceKey, this).setModel(new Model<String>()).setDefaultValue(resourceKey)
.setParameters(objects);
}
public StringResourceModel createStringResource(Enum e) {
String resourceKey = e.getDeclaringClass().getSimpleName() + "." + e.name();
return createStringResource(resourceKey);
}
@NotNull
public static StringResourceModel createStringResourceStatic(Component component, String resourceKey,
Object... objects) {
return new StringResourceModel(resourceKey, component).setModel(new Model<String>())
.setDefaultValue(resourceKey).setParameters(objects);
}
public OpResult showResult(OperationResult result, String errorMessageKey) {
return showResult(result, errorMessageKey, true);
}
public OpResult showResult(OperationResult result, boolean showSuccess) {
return showResult(result, null, showSuccess);
}
public OpResult showResult(OperationResult result) {
return showResult(result, null, true);
}
public OpResult showResult(OperationResult result, String errorMessageKey, boolean showSuccess) {
Validate.notNull(result, "Operation result must not be null.");
Validate.notNull(result.getStatus(), "Operation result status must not be null.");
OpResult opResult = OpResult.getOpResult((PageBase) getPage(), result);
opResult.determineBackgroundTaskVisibility(this);
switch (opResult.getStatus()) {
case FATAL_ERROR:
case PARTIAL_ERROR:
getSession().error(opResult);
break;
case IN_PROGRESS:
case NOT_APPLICABLE:
getSession().info(opResult);
break;
case SUCCESS:
if (!showSuccess) {
break;
}
getSession().success(opResult);
break;
case UNKNOWN:
case WARNING:
default:
getSession().warn(opResult);
}
return opResult;
}
// common result processing
protected void processResult(AjaxRequestTarget target, OperationResult result, boolean showSuccess) {
result.computeStatusIfUnknown();
if (!result.isSuccess()) {
showResult(result, showSuccess);
target.add(getFeedbackPanel());
} else {
showResult(result);
redirectBack();
}
}
public String createComponentPath(String... components) {
return StringUtils.join(components, ":");
}
/**
* It's here only because of some IDEs - it's not properly filtering
* resources during maven build. "describe" variable is not replaced.
*
* @return "unknown" instead of "git describe" for current build.
*/
@Deprecated
public String getDescribe() {
return getString("pageBase.unknownBuildNumber");
}
protected ModalWindow createModalWindow(final String id, IModel<String> title, int width, int height) {
final ModalWindow modal = new ModalWindow(id);
add(modal);
modal.setResizable(false);
modal.setTitle(title);
modal.setCookieName(PageBase.class.getSimpleName() + ((int) (Math.random() * 100)));
modal.setInitialWidth(width);
modal.setWidthUnit("px");
modal.setInitialHeight(height);
modal.setHeightUnit("px");
modal.setCloseButtonCallback(new ModalWindow.CloseButtonCallback() {
@Override
public boolean onCloseButtonClicked(AjaxRequestTarget target) {
return true;
}
});
modal.setWindowClosedCallback(new ModalWindow.WindowClosedCallback() {
@Override
public void onClose(AjaxRequestTarget target) {
modal.close(target);
}
});
modal.add(new AbstractDefaultAjaxBehavior() {
@Override
public void renderHead(Component component, IHeaderResponse response) {
response.render(OnDomReadyHeaderItem.forScript("Wicket.Window.unloadConfirmation = false;"));
response.render(JavaScriptHeaderItem
.forScript("$(document).ready(function() {\n" + " $(document).bind('keyup', function(evt) {\n"
+ " if (evt.keyCode == 27) {\n" + getCallbackScript() + "\n"
+ " evt.preventDefault();\n" + " }\n" + " });\n" + "});", id));
}
@Override
protected void respond(AjaxRequestTarget target) {
modal.close(target);
}
});
return modal;
}
// returns to previous page via restart response exception
public RestartResponseException getRestartResponseException(Class<? extends Page> defaultBackPageClass) {
return new RestartResponseException(defaultBackPageClass);
}
protected <O extends ObjectType> void validateObject(String lexicalRepresentation, final Holder<PrismObject<O>> objectHolder,
String language, boolean validateSchema, OperationResult result) {
if (language == null || PrismContext.LANG_JSON.equals(language) || PrismContext.LANG_YAML.equals(language)) {
PrismObject<O> object;
try {
object = getPrismContext().parserFor(lexicalRepresentation).language(language).parse();
object.checkConsistence();
objectHolder.setValue(object);
} catch (RuntimeException | SchemaException e) {
result.recordFatalError("Couldn't parse object: " + e.getMessage(), e);
}
return;
}
EventHandler handler = new EventHandler() {
@Override
public EventResult preMarshall(Element objectElement, Node postValidationTree,
OperationResult objectResult) {
return EventResult.cont();
}
@Override
public <T extends Objectable> EventResult postMarshall(PrismObject<T> object, Element objectElement,
OperationResult objectResult) {
objectHolder.setValue((PrismObject<O>) object);
return EventResult.cont();
}
@Override
public void handleGlobalError(OperationResult currentResult) {
}
};
Validator validator = new Validator(getPrismContext(), handler);
validator.setVerbose(true);
validator.setValidateSchema(validateSchema);
validator.validateObject(lexicalRepresentation, result);
result.computeStatus();
}
public long getItemsPerPage(UserProfileStorage.TableId tableId) {
UserProfileStorage userProfile = getSessionStorage().getUserProfile();
return userProfile.getPagingSize(tableId);
}
protected List<SideBarMenuItem> createMenuItems() {
List<SideBarMenuItem> menus = new ArrayList<>();
SideBarMenuItem menu = new SideBarMenuItem(createStringResource("PageAdmin.menu.selfService"));
menus.add(menu);
createSelfServiceMenu(menu);
menu = new SideBarMenuItem(createStringResource("PageAdmin.menu.mainNavigation"));
menus.add(menu);
List<MainMenuItem> items = menu.getItems();
menu = new SideBarMenuItem(createStringResource("PageAdmin.menu.additional"));
menus.add(menu);
createAdditionalMenu(menu);
// todo fix with visible behaviour [lazyman]
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_DASHBOARD_URL,
AuthorizationConstants.AUTZ_UI_HOME_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createHomeItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_USERS_URL,
AuthorizationConstants.AUTZ_UI_USERS_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createUsersItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ORG_STRUCT_URL,
AuthorizationConstants.AUTZ_UI_ORG_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createOrganizationsMenu());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_ROLES_URL,
AuthorizationConstants.AUTZ_UI_ROLES_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createRolesItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_SERVICES_URL,
AuthorizationConstants.AUTZ_UI_SERVICES_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createServicesItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_RESOURCES_URL,
AuthorizationConstants.AUTZ_UI_RESOURCES_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL, AuthorizationConstants.AUTZ_UI_RESOURCE_URL,
AuthorizationConstants.AUTZ_UI_RESOURCE_EDIT_URL)) {
items.add(createResourcesItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_MY_WORK_ITEMS_URL,
AuthorizationConstants.AUTZ_UI_APPROVALS_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
if (getWorkflowManager().isEnabled()) {
items.add(createWorkItemsItems());
}
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_CERTIFICATION_ALL_URL,
AuthorizationConstants.AUTZ_UI_CERTIFICATION_DEFINITIONS_URL,
AuthorizationConstants.AUTZ_UI_CERTIFICATION_NEW_DEFINITION_URL,
AuthorizationConstants.AUTZ_UI_CERTIFICATION_CAMPAIGNS_URL,
AuthorizationConstants.AUTZ_UI_CERTIFICATION_DECISIONS_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createCertificationItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_TASKS_URL,
AuthorizationConstants.AUTZ_UI_TASKS_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createServerTasksItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_REPORTS_URL,
AuthorizationConstants.AUTZ_UI_REPORTS_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createReportsItems());
}
if (WebComponentUtil.isAuthorized(AuthorizationConstants.AUTZ_UI_CONFIGURATION_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_DEBUG_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_DEBUGS_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_LOGGING_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_SYSTEM_CONFIG_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_ABOUT_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_REPOSITORY_QUERY_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_SYNCHRONIZATION_ACCOUNTS_URL,
AuthorizationConstants.AUTZ_UI_CONFIGURATION_ALL_URL, AuthorizationConstants.AUTZ_GUI_ALL_URL,
AuthorizationConstants.AUTZ_GUI_ALL_DEPRECATED_URL)) {
items.add(createConfigurationItems());
}
return menus;
}
private MainMenuItem createWorkItemsItems() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_WORK_ITEM_ICON_COLORED, createStringResource("PageAdmin.menu.top.workItems"), null) {
private static final long serialVersionUID = 1L;
@Override
public String getBubbleLabel() {
Integer workItemCount = workItemCountModel.getObject();
if (workItemCount == null || workItemCount == 0) {
return null;
} else {
return workItemCount.toString();
}
}
};
List<MenuItem> submenu = item.getItems();
MenuItem menu = new MenuItem(createStringResource("PageAdmin.menu.top.workItems.list"), PageWorkItemsAllocatedToMe.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.workItems.listClaimable"),
PageWorkItemsClaimable.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.workItems.listAll"), PageWorkItemsAll.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.workItems.listProcessInstancesRequestedBy"),
PageProcessInstancesRequestedBy.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.workItems.listProcessInstancesRequestedFor"),
PageProcessInstancesRequestedFor.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.workItems.listProcessInstancesAll"),
PageProcessInstancesAll.class);
submenu.add(menu);
return item;
}
private MainMenuItem createServerTasksItems() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_TASK_ICON_COLORED, createStringResource("PageAdmin.menu.top.serverTasks"),
null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.serverTasks.list"), PageTasks.class, null,
null);
submenu.add(list);
MenuItem n = new MenuItem(createStringResource("PageAdmin.menu.top.serverTasks.new"), PageTaskAdd.class);
submenu.add(n);
n = new MenuItem(createStringResource("PageAdmin.menu.top.serverTasks.edit"), PageTaskEdit.class, null,
createVisibleDisabledBehaviorForEditMenu(PageTaskEdit.class));
submenu.add(n);
return item;
}
private MainMenuItem createResourcesItems() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_RESOURCE_ICON_COLORED, createStringResource("PageAdmin.menu.top.resources"),
null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.resources.list"), PageResources.class);
submenu.add(list);
createFocusPageViewMenu(submenu, "PageAdmin.menu.top.resources.view", PageResource.class);
createFocusPageNewEditMenu(submenu, "PageAdmin.menu.top.resources.new", "PageAdmin.menu.top.resources.edit",
PageResourceWizard.class);
MenuItem n = new MenuItem(createStringResource("PageAdmin.menu.top.resources.import"),
PageImportResource.class);
submenu.add(n);
MenuItem connectorHostsList = new MenuItem(createStringResource("PageAdmin.menu.top.connectorHosts.list"),
PageConnectorHosts.class);
submenu.add(connectorHostsList);
return item;
}
private MainMenuItem createReportsItems() {
MainMenuItem item = new MainMenuItem("fa fa-pie-chart", createStringResource("PageAdmin.menu.top.reports"),
null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.reports.list"), PageReports.class);
submenu.add(list);
MenuItem configure = new MenuItem(createStringResource("PageAdmin.menu.top.reports.configure"),
PageReport.class, null, createVisibleDisabledBehaviorForEditMenu(PageReport.class));
submenu.add(configure);
MenuItem created = new MenuItem(createStringResource("PageAdmin.menu.top.reports.created"),
PageCreatedReports.class);
submenu.add(created);
MenuItem n = new MenuItem(createStringResource("PageAdmin.menu.top.reports.new"), PageNewReport.class);
submenu.add(n);
if (WebComponentUtil.isAuthorized(ModelAuthorizationAction.AUDIT_READ.getUrl())){
MenuItem auditLogViewer = new MenuItem(createStringResource("PageAuditLogViewer.menuName"),
PageAuditLogViewer.class);
submenu.add(auditLogViewer);
}
return item;
}
private MainMenuItem createCertificationItems() {
MainMenuItem item = new MainMenuItem("fa fa-certificate",
createStringResource("PageAdmin.menu.top.certification"), null);
List<MenuItem> submenu = item.getItems();
MenuItem menu = new MenuItem(createStringResource("PageAdmin.menu.top.certification.definitions"),
PageCertDefinitions.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.certification.newDefinition"),
PageCertDefinition.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.certification.campaigns"),
PageCertCampaigns.class);
submenu.add(menu);
PageParameters params = new PageParameters();
params.add(PageTasks.SELECTED_CATEGORY, TaskCategory.ACCESS_CERTIFICATION);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.certification.scheduling"), PageTasksCertScheduling.class,
params, null);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.certification.decisions"),
PageCertDecisions.class);
submenu.add(menu);
return item;
}
private MainMenuItem createConfigurationItems() {
MainMenuItem item = new MainMenuItem("fa fa-cog", createStringResource("PageAdmin.menu.top.configuration"),
null);
item.setInsertDefaultBackBreadcrumb(false);
List<MenuItem> submenu = item.getItems();
MenuItem menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.bulkActions"),
PageBulkAction.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.importObject"),
PageImportObject.class, null, null);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.repositoryObjects"),
PageDebugList.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.repositoryObjectView"),
PageDebugView.class, null, createVisibleDisabledBehaviorForEditMenu(PageDebugView.class));
submenu.add(menu);
PageParameters params = new PageParameters();
params.add(PageSystemConfiguration.SELECTED_TAB_INDEX, PageSystemConfiguration.CONFIGURATION_TAB_BASIC);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.basic"),
PageSystemConfiguration.class, params, null) {
@Override
public boolean isMenuActive(WebPage page) {
if (!PageSystemConfiguration.class.equals(page.getClass())) {
return false;
}
int index = getSelectedTabForConfiguration(page);
return PageSystemConfiguration.CONFIGURATION_TAB_BASIC == index ? true : false;
}
};
submenu.add(menu);
params = new PageParameters();
params.add(PageSystemConfiguration.SELECTED_TAB_INDEX, PageSystemConfiguration.CONFIGURATION_TAB_NOTIFICATION);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.notifications"),
PageSystemConfiguration.class, params, null) {
@Override
public boolean isMenuActive(WebPage page) {
if (!PageSystemConfiguration.class.equals(page.getClass())) {
return false;
}
int index = getSelectedTabForConfiguration(page);
return PageSystemConfiguration.CONFIGURATION_TAB_NOTIFICATION == index ? true : false;
}
};
submenu.add(menu);
params = new PageParameters();
params.add(PageSystemConfiguration.SELECTED_TAB_INDEX, PageSystemConfiguration.CONFIGURATION_TAB_LOGGING);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.logging"),
PageSystemConfiguration.class, params, null) {
@Override
public boolean isMenuActive(WebPage page) {
if (!PageSystemConfiguration.class.equals(page.getClass())) {
return false;
}
int index = getSelectedTabForConfiguration(page);
return PageSystemConfiguration.CONFIGURATION_TAB_LOGGING == index ? true : false;
}
};
submenu.add(menu);
params = new PageParameters();
params.add(PageSystemConfiguration.SELECTED_TAB_INDEX, PageSystemConfiguration.CONFIGURATION_TAB_PROFILING);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.profiling"),
PageSystemConfiguration.class, params, null) {
@Override
public boolean isMenuActive(WebPage page) {
if (!PageSystemConfiguration.class.equals(page.getClass())) {
return false;
}
int index = getSelectedTabForConfiguration(page);
return PageSystemConfiguration.CONFIGURATION_TAB_PROFILING == index ? true : false;
}
};
submenu.add(menu);
params = new PageParameters();
params.add(PageSystemConfiguration.SELECTED_TAB_INDEX, PageSystemConfiguration.CONFIGURATION_TAB_ADMIN_GUI);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.adminGui"),
PageSystemConfiguration.class, params, null) {
@Override
public boolean isMenuActive(WebPage page) {
if (!PageSystemConfiguration.class.equals(page.getClass())) {
return false;
}
int index = getSelectedTabForConfiguration(page);
return PageSystemConfiguration.CONFIGURATION_TAB_ADMIN_GUI == index ? true : false;
}
};
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.shadowsDetails"),
PageAccounts.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.internals"), PageInternals.class);
submenu.add(menu);
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.repoQuery"),
PageRepositoryQuery.class);
submenu.add(menu);
if (SystemConfigurationHolder.isExperimentalCodeEnabled()) {
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.evaluateMapping"),
PageEvaluateMapping.class);
submenu.add(menu);
}
menu = new MenuItem(createStringResource("PageAdmin.menu.top.configuration.about"), PageAbout.class);
submenu.add(menu);
return item;
}
private int getSelectedTabForConfiguration(WebPage page) {
PageParameters params = page.getPageParameters();
StringValue val = params.get(PageSystemConfiguration.SELECTED_TAB_INDEX);
String value = null;
if (val != null && !val.isNull()) {
value = val.toString();
}
return StringUtils.isNumeric(value) ? Integer.parseInt(value) : PageSystemConfiguration.CONFIGURATION_TAB_BASIC;
}
private void createSelfServiceMenu(SideBarMenuItem menu) {
MainMenuItem item = new MainMenuItem("fa fa-dashboard", createStringResource("PageAdmin.menu.selfDashboard"),
PageSelfDashboard.class);
menu.getItems().add(item);
item = new MainMenuItem("fa fa-user", createStringResource("PageAdmin.menu.profile"), PageSelfProfile.class);
menu.getItems().add(item);
// PageSelfAssignments is not implemented yet
// item = new MainMenuItem("fa fa-star",
// createStringResource("PageAdmin.menu.assignments"),
// PageSelfAssignments.class);
// menu.getItems().add(item);
item = new MainMenuItem("fa fa-shield", createStringResource("PageAdmin.menu.credentials"),
PageSelfCredentials.class);
menu.getItems().add(item);
item = new MainMenuItem("fa fa-pencil-square-o", createStringResource("PageAdmin.menu.request"),
PageAssignmentShoppingKart.class);
menu.getItems().add(item);
}
private void createAdditionalMenu(SideBarMenuItem menu) {
AdminGuiConfigurationType adminGuiConfig = loadAdminGuiConfiguration();
if (adminGuiConfig != null) {
List<RichHyperlinkType> menuList = loadAdminGuiConfiguration().getAdditionalMenuLink();
Map<String, Class> urlClassMap = DescriptorLoader.getUrlClassMap();
if (menuList != null && menuList.size() > 0 && urlClassMap != null && urlClassMap.size() > 0) {
for (RichHyperlinkType link : menuList) {
if (link.getTargetUrl() != null && !link.getTargetUrl().trim().equals("")) {
AdditionalMenuItem item = new AdditionalMenuItem(link.getIcon() == null ? "" : link.getIcon().getCssClass(),
getAdditionalMenuItemNameModel(link.getLabel()),
link.getTargetUrl(), urlClassMap.get(link.getTargetUrl()));
menu.getItems().add(item);
}
}
}
}
}
private IModel<String> getAdditionalMenuItemNameModel(final String name){
return new IModel<String>() {
@Override
public String getObject() {
return name;
}
@Override
public void setObject(String s) {
}
@Override
public void detach() {
}
};
}
private MainMenuItem createHomeItems() {
MainMenuItem item = new MainMenuItem("fa fa-dashboard", createStringResource("PageAdmin.menu.dashboard"),
PageDashboard.class);
return item;
}
private MainMenuItem createUsersItems() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_USER_ICON_COLORED, createStringResource("PageAdmin.menu.top.users"), null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.users.list"), PageUsers.class);
submenu.add(list);
createFocusPageNewEditMenu(submenu, "PageAdmin.menu.top.users.new", "PageAdmin.menu.top.users.edit",
PageUser.class);
// MenuItem search = new
// MenuItem(createStringResource("PageAdmin.menu.users.search"),
// PageUsersSearch.class);
// submenu.add(search);
return item;
}
private void createFocusPageNewEditMenu(List<MenuItem> submenu, String newKey, String editKey,
final Class<? extends PageAdmin> newPageClass) {
MenuItem edit = new MenuItem(createStringResource(editKey), newPageClass, null, new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
return false;
}
@Override
public boolean isVisible() {
if (!getPage().getClass().equals(newPageClass)) {
return false;
}
if (getPage() instanceof PageAdminFocus) {
PageAdminFocus page = (PageAdminFocus) getPage();
return page.isEditingFocus();
} else if (getPage() instanceof PageResourceWizard) {
PageResourceWizard page = (PageResourceWizard) getPage();
return !page.isNewResource();
} else {
return false;
}
}
});
submenu.add(edit);
MenuItem newMenu = new MenuItem(createStringResource(newKey), newPageClass, null, new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
try {
return getSecurityEnforcer().isAuthorized(AuthorizationConstants.AUTZ_UI_ADD_ACTION_URL,
AuthorizationPhaseType.REQUEST, (new OrgType(getPrismContext())).asPrismObject(),
null, null, null);
} catch (SchemaException ex){
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't solve authorization for New organization menu item", ex);
}
return true;
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected boolean isMenuActive() {
if (!PageBase.this.getPage().getClass().equals(newPageClass)) {
return false;
}
if (PageBase.this.getPage() instanceof PageAdminFocus) {
PageAdminFocus page = (PageAdminFocus) PageBase.this.getPage();
return !page.isEditingFocus();
} else if (PageBase.this.getPage() instanceof PageResourceWizard) {
PageResourceWizard page = (PageResourceWizard) PageBase.this.getPage();
return page.isNewResource();
} else {
return false;
}
}
};
submenu.add(newMenu);
}
private void createFocusPageViewMenu(List<MenuItem> submenu, String viewKey,
final Class<? extends PageBase> newPageType) {
MenuItem view = new MenuItem(createStringResource(viewKey), newPageType, null, new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isEnabled() {
return false;
}
@Override
public boolean isVisible() {
if (!getPage().getClass().equals(newPageType)) {
return false;
}
return true;
}
});
submenu.add(view);
}
private MainMenuItem createOrganizationsMenu() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_ORG_ICON_COLORED, createStringResource("PageAdmin.menu.top.users.org"),
null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.users.org.tree"), PageOrgTree.class);
submenu.add(list);
createFocusPageNewEditMenu(submenu, "PageAdmin.menu.top.users.org.new", "PageAdmin.menu.top.users.org.edit",
PageOrgUnit.class);
return item;
}
private MainMenuItem createRolesItems() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_ROLE_ICON_COLORED, createStringResource("PageAdmin.menu.top.roles"),
null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.roles.list"), PageRoles.class);
submenu.add(list);
createFocusPageNewEditMenu(submenu, "PageAdmin.menu.top.roles.new", "PageAdmin.menu.top.roles.edit",
PageRole.class);
return item;
}
private MainMenuItem createServicesItems() {
MainMenuItem item = new MainMenuItem(GuiStyleConstants.CLASS_OBJECT_SERVICE_ICON_COLORED, createStringResource("PageAdmin.menu.top.services"),
null);
List<MenuItem> submenu = item.getItems();
MenuItem list = new MenuItem(createStringResource("PageAdmin.menu.top.services.list"), PageServices.class);
submenu.add(list);
createFocusPageNewEditMenu(submenu, "PageAdmin.menu.top.services.new", "PageAdmin.menu.top.services.edit",
PageService.class);
return item;
}
public PrismObject<UserType> loadUserSelf(PageBase page) {
Task task = createSimpleTask(OPERATION_LOAD_USER);
OperationResult result = task.getResult();
PrismObject<UserType> user = WebModelServiceUtils.loadObject(UserType.class,
WebModelServiceUtils.getLoggedInUserOid(), page, task, result);
result.computeStatus();
showResult(result, null, false);
return user;
}
private VisibleEnableBehaviour createVisibleDisabledBehaviorForEditMenu(final Class<? extends WebPage> page) {
return new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
return getPage().getClass().equals(page);
}
@Override
public boolean isEnabled() {
return false;
}
};
}
public AdminGuiConfigurationType loadAdminGuiConfiguration() {
MidPointPrincipal user = SecurityUtils.getPrincipalUser();
AdminGuiConfigurationType adminGuiConfig = null;
if (user == null) {
return adminGuiConfig;
} else {
OperationResult result = new OperationResult(OPERATION_GET_SYSTEM_CONFIG);
Task task = createSimpleTask(OPERATION_GET_SYSTEM_CONFIG);
try {
adminGuiConfig = getModelInteractionService().getAdminGuiConfiguration(task, result);
LOGGER.trace("Admin GUI config: {}", adminGuiConfig);
result.recordSuccess();
} catch(Exception ex){
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load system configuration", ex);
result.recordFatalError("Couldn't load system configuration.", ex);
}
return adminGuiConfig;
}
}
public DeploymentInformationType loadDeploymentInformationType() {
DeploymentInformationType deploymentInformationType = null;
OperationResult result = new OperationResult(OPERATION_GET_DEPLOYMENT_INFORMATION);
try {
deploymentInformationType = getModelInteractionService().getDeploymentInformationConfiguration(result);
LOGGER.trace("Deployment information : {}", deploymentInformationType);
result.recordSuccess();
} catch(Exception ex){
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load deployment information", ex);
result.recordFatalError("Couldn't load deployment information.", ex);
}
return deploymentInformationType;
}
public boolean canRedirectBack() {
List<Breadcrumb> breadcrumbs = getBreadcrumbs();
if (breadcrumbs.size() > 2) {
return true;
}
if (breadcrumbs.size() == 2){
BreadcrumbPageClass breadcrumb = null;
if ((breadcrumbs.get(breadcrumbs.size() - 2)) instanceof BreadcrumbPageClass){
breadcrumb = (BreadcrumbPageClass) breadcrumbs.get(breadcrumbs.size() - 2);
}
if (breadcrumb != null && breadcrumb.getPage() != null){
return true;
}
}
return false;
}
public Breadcrumb redirectBack() {
List<Breadcrumb> breadcrumbs = getBreadcrumbs();
if (!canRedirectBack()) {
setResponsePage(getMidpointApplication().getHomePage());
return null;
}
Breadcrumb breadcrumb = breadcrumbs.get(breadcrumbs.size() - 2);
redirectBackToBreadcrumb(breadcrumb);
return breadcrumb;
}
public void navigateToNext(Class<? extends WebPage> page) {
navigateToNext(page, null);
}
public void navigateToNext(Class<? extends WebPage> pageType, PageParameters params) {
IPageFactory pFactory = Session.get().getPageFactory();
WebPage page;
if (params == null) {
page = pFactory.newPage(pageType);
} else {
page = pFactory.newPage(pageType, params);
}
navigateToNext(page);
}
public void navigateToNext(WebPage page) {
if (!(page instanceof PageBase)) {
setResponsePage(page);
return;
}
PageBase next = (PageBase) page;
next.setBreadcrumbs(getBreadcrumbs());
setResponsePage(next);
}
// TODO deduplicate with redirectBack
public RestartResponseException redirectBackViaRestartResponseException() {
List<Breadcrumb> breadcrumbs = getBreadcrumbs();
if (breadcrumbs.size() < 2) {
return new RestartResponseException(getApplication().getHomePage());
}
Breadcrumb breadcrumb = breadcrumbs.get(breadcrumbs.size() - 2);
redirectBackToBreadcrumb(breadcrumb);
return breadcrumb.getRestartResponseException();
}
public void redirectBackToBreadcrumb(Breadcrumb breadcrumb) {
Validate.notNull(breadcrumb, "Breadcrumb must not be null");
boolean found = false;
//we remove all breadcrumbs that are after "breadcrumb"
List<Breadcrumb> breadcrumbs = getBreadcrumbs();
Iterator<Breadcrumb> iterator = breadcrumbs.iterator();
while (iterator.hasNext()) {
Breadcrumb b = iterator.next();
if (found) {
iterator.remove();
} else if (b.equals(breadcrumb)) {
found = true;
}
}
WebPage page = breadcrumb.redirect();
if (page instanceof PageBase) {
PageBase base = (PageBase) page;
base.setBreadcrumbs(breadcrumbs);
}
setResponsePage(page);
}
protected void setTimeZone(PageBase page){
PrismObject<UserType> user = loadUserSelf(page);
String timeZone = null;
MidPointPrincipal principal = SecurityUtils.getPrincipalUser();
if (user != null && user.asObjectable().getTimezone() != null){
timeZone = user.asObjectable().getTimezone();
} else {
timeZone = principal.getAdminGuiConfiguration().getDefaultTimezone();
}
if (timeZone != null) {
WebSession.get().getClientInfo().getProperties().
setTimeZone(TimeZone.getTimeZone(timeZone));
}
}
protected <T> T runPrivileged(Producer<T> producer) {
return securityEnforcer.runPrivileged(producer);
}
public void setBreadcrumbs(List<Breadcrumb> breadcrumbs) {
getBreadcrumbs().clear();
if (breadcrumbs != null) {
getBreadcrumbs().addAll(breadcrumbs);
}
}
public List<Breadcrumb> getBreadcrumbs() {
if (breadcrumbs == null) {
breadcrumbs = new ArrayList<>();
}
return breadcrumbs;
}
public void addBreadcrumb(Breadcrumb breadcrumb) {
Validate.notNull(breadcrumb, "Breadcrumb must not be null");
Breadcrumb last = getBreadcrumbs().isEmpty() ?
null : getBreadcrumbs().get(getBreadcrumbs().size() - 1);
if (last != null && last.equals(breadcrumb)) {
return;
}
getBreadcrumbs().add(breadcrumb);
}
public Breadcrumb getLastBreadcrumb() {
if (getBreadcrumbs().isEmpty()) {
return null;
}
return getBreadcrumbs().get(getBreadcrumbs().size() - 1);
}
public void clearBreadcrumbs() {
getBreadcrumbs().clear();
}
private boolean isCustomLogoVisible(){
if (deploymentInfoModel != null && deploymentInfoModel.getObject() != null
&& deploymentInfoModel.getObject().getLogo() != null
&& (StringUtils.isNotEmpty(deploymentInfoModel.getObject().getLogo().getImageUrl())
|| StringUtils.isNotEmpty(deploymentInfoModel.getObject().getLogo().getCssClass()))) {
return true;
}
return false;
}
private String getSubscriptionId(){
if (deploymentInfoModel == null || deploymentInfoModel.getObject() == null){
return null;
}
return deploymentInfoModel.getObject().getSubscriptionIdentifier();
}
private VisibleEnableBehaviour getFooterVisibleBehaviour(){
return new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
String subscriptionId = getSubscriptionId();
if (StringUtils.isEmpty(subscriptionId)){
return true;
}
return !WebComponentUtil.isSubscriptionIdCorrect(subscriptionId) ||
(SubscriptionType.DEMO_SUBSRIPTION.getSubscriptionType().equals(subscriptionId.substring(0, 2))
&& WebComponentUtil.isSubscriptionIdCorrect(subscriptionId));
}
};
}
}