/*
* Copyright (c) 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.web.component.assignment;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.ObjectBrowserPanel;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.model.api.ModelInteractionService;
import com.evolveum.midpoint.model.api.RoleSelectionSpecification;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.query.*;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectQueryUtil;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
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.component.AjaxButton;
import com.evolveum.midpoint.web.component.data.ObjectDataProvider;
import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem;
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchFactory;
import com.evolveum.midpoint.web.component.search.SearchPanel;
import com.evolveum.midpoint.web.component.util.ListDataProvider;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.orgs.OrgTreePanel;
import com.evolveum.midpoint.web.page.admin.users.component.AbstractRoleMemberPanel;
import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus;
import com.evolveum.midpoint.web.page.self.PageAssignmentsList;
import com.evolveum.midpoint.web.page.self.dto.AssignmentViewType;
import com.evolveum.midpoint.web.security.SecurityUtils;
import com.evolveum.midpoint.web.session.OrgTreeStateStorage;
import com.evolveum.midpoint.web.session.RoleCatalogStorage;
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.sun.tools.xjc.reader.xmlschema.bindinfo.BIConversion;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.ajax.AjaxChannel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.form.OnChangeAjaxBehavior;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.EnumChoiceRenderer;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.StringResourceModel;
import javax.xml.namespace.QName;
import java.util.*;
/**
* Created by honchar.
*/
public class AssignmentCatalogPanel<F extends AbstractRoleType> extends BasePanel {
private static final long serialVersionUID = 1L;
private static final String ID_TREE_PANEL_CONTAINER = "treePanelContainer";
private static final String ID_TREE_PANEL = "treePanel";
private static final String ID_CATALOG_ITEMS_PANEL_CONTAINER = "catalogItemsPanelContainer";
private static final String ID_ASSIGNMENTS_OWNER_NAME = "assignmentsOwnerName";
private static final String ID_CATALOG_ITEMS_PANEL = "catalogItemsPanel";
private static final String ID_CART_BUTTON = "cartButton";
private static final String ID_CART_ITEMS_COUNT = "itemsCount";
private static final String ID_HEADER_PANEL = "headerPanel";
private static final String ID_VIEW_TYPE = "viewTypeSelect";
private static final String ID_SEARCH_FORM = "searchForm";
private static final String ID_SEARCH = "search";
private static final String ID_PANEL_CONTAINER = "catalogItemsPanelContainer";
private static final String ID_TARGET_USER_CONTAINER = "targetUserContainer";
private static final String ID_TARGET_USER_BUTTON = "targetUserButton";
private static final String ID_DELETE_TARGET_USER_BUTTON = "deleteTargetUserButton";
private static final String ID_TARGET_USER_LABEL = "targetUserLabel";
private static final String DOT_CLASS = AssignmentCatalogPanel.class.getName();
private static final Trace LOGGER = TraceManager.getTrace(AssignmentCatalogPanel.class);
private static final String OPERATION_LOAD_ASSIGNMENT_CONSTRAINTS = DOT_CLASS + "loadAssignmentConstraints";
private static final String OPERATION_LOAD_ASSIGNABLE_ROLES = DOT_CLASS + "loadAssignableRoles";
private PageBase pageBase;
private IModel<String> selectedTreeItemOidModel;
private String rootOid;
private IModel<Search> searchModel;
private IModel<AssignmentViewType> viewModel;
private ObjectDataProvider<AssignmentEditorDto, AbstractRoleType> objectProvider;
private int itemsPerRow = 4;
private boolean showUserSelectionPopup = true;
private List<AssignmentEditorDto> listProviderData;
List<AssignmentViewType> viewTypeList = new ArrayList<>();
public AssignmentCatalogPanel(String id) {
super(id);
}
public AssignmentCatalogPanel(String id, String rootOid,
AssignmentViewType viewType, List<AssignmentViewType> viewTypeList, PageBase pageBase) {
super(id);
this.pageBase = pageBase;
this.rootOid = rootOid;
this.viewTypeList = viewTypeList;
if (AssignmentViewType.getViewTypeFromSession(pageBase) == null) {
AssignmentViewType.saveViewTypeToSession(pageBase, viewType);
}
initLayout();
}
private void initProvider() {
objectProvider = new ObjectDataProvider<AssignmentEditorDto, AbstractRoleType>(pageBase, AbstractRoleType.class) {
private static final long serialVersionUID = 1L;
@Override
public AssignmentEditorDto createDataObjectWrapper(PrismObject<AbstractRoleType> obj) {
AssignmentEditorDto dto = AssignmentEditorDto.createDtoFromObject(obj.asObjectable(), UserDtoStatus.ADD, pageBase);
if (! getRoleCatalogStorage().isMultiUserRequest()) {
dto.setAlreadyAssigned(isAlreadyAssigned(obj, dto));
dto.setDefualtAssignmentConstraints(getAssignmentConstraints());
}
return dto;
}
@Override
public void setQuery(ObjectQuery query) {
super.setQuery(query);
}
@Override
public ObjectQuery getQuery() {
return createContentQuery(null);
}
};
}
private void initLayout() {
initModels();
initProvider();
setOutputMarkupId(true);
initHeaderPanel();
WebMarkupContainer panelContainer = new WebMarkupContainer(ID_CATALOG_ITEMS_PANEL_CONTAINER);
panelContainer.setOutputMarkupId(true);
add(panelContainer);
addOrReplaceLayout(null, panelContainer);
}
private void initHeaderPanel(){
WebMarkupContainer headerPanel = new WebMarkupContainer(ID_HEADER_PANEL);
headerPanel.setOutputMarkupId(true);
add(headerPanel);
initViewSelector(headerPanel);
initUserSelectionPanel(headerPanel);
initCartButton(headerPanel);
initSearchPanel(headerPanel);
}
public void addOrReplaceLayout(AjaxRequestTarget target, WebMarkupContainer panelContainer) {
WebMarkupContainer treePanelContainer = new WebMarkupContainer(ID_TREE_PANEL_CONTAINER);
treePanelContainer.setOutputMarkupId(true);
panelContainer.addOrReplace(treePanelContainer);
if (AssignmentViewType.ROLE_CATALOG_VIEW.equals(AssignmentViewType.getViewTypeFromSession(pageBase)) && StringUtils.isNotEmpty(rootOid)) {
// not let tree panel initializing in case of empty role catalog oid
OrgTreePanel treePanel = new OrgTreePanel(ID_TREE_PANEL, Model.of(rootOid), false, "AssignmentShoppingCartPanel.treeTitle") {
private static final long serialVersionUID = 1L;
@Override
protected void selectTreeItemPerformed(SelectableBean<OrgType> selected,
AjaxRequestTarget target) {
AssignmentCatalogPanel.this.selectTreeItemPerformed(selected, target);
}
protected List<InlineMenuItem> createTreeMenu() {
return new ArrayList<>();
}
@Override
protected List<InlineMenuItem> createTreeChildrenMenu() {
return new ArrayList<>();
}
@Override
protected OrgTreeStateStorage getOrgTreeStateStorage(){
return getRoleCatalogStorage();
}
};
treePanel.setOutputMarkupId(true);
treePanelContainer.add(new AttributeAppender("class", "col-md-3"));
treePanelContainer.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
return !isCatalogOidEmpty();
}
});
treePanelContainer.addOrReplace(treePanel);
} else {
WebMarkupContainer treePanel = new WebMarkupContainer(ID_TREE_PANEL);
treePanel.setVisible(false);
treePanel.setOutputMarkupId(true);
treePanelContainer.addOrReplace(treePanel);
}
WebMarkupContainer catalogItemsPanelContainer = new WebMarkupContainer(ID_CATALOG_ITEMS_PANEL_CONTAINER);
catalogItemsPanelContainer.setOutputMarkupId(true);
panelContainer.addOrReplace(catalogItemsPanelContainer);
String assignmentsOwnerName = getRoleCatalogStorage().getAssignmentsUserOwner() != null ?
getRoleCatalogStorage().getAssignmentsUserOwner().getName().getOrig() : "";
Label assignmentsOwnerLabel = new Label(ID_ASSIGNMENTS_OWNER_NAME,
createStringResource("AssignmentCatalogPanel.assignmentsOwner", assignmentsOwnerName));
assignmentsOwnerLabel.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
return AssignmentViewType.USER_TYPE.equals( getRoleCatalogStorage().getViewType());
}
});
catalogItemsPanelContainer.add(assignmentsOwnerLabel);
CatalogItemsPanel catalogItemsPanel;
if (AssignmentViewType.USER_TYPE.equals(viewModel.getObject())) {
PrismObject<UserType> assignmentsOwner = getRoleCatalogStorage().getAssignmentsUserOwner();
listProviderData = new ArrayList<>();
if (assignmentsOwner != null) {
List<AssignmentType> assignments = assignmentsOwner.asObjectable().getAssignment();
for (AssignmentType assignment : assignments) {
if (assignment.getTargetRef() == null ||
!UserType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType())) {
assignment.setId(null);
listProviderData.add(new AssignmentEditorDto(UserDtoStatus.MODIFY, assignment, pageBase));
}
}
Collections.sort(listProviderData);
}
ListDataProvider listDataProvider = new ListDataProvider(this, Model.ofList(listProviderData));
catalogItemsPanel = new CatalogItemsPanel(ID_CATALOG_ITEMS_PANEL,
pageBase, itemsPerRow, listDataProvider);
} else {
catalogItemsPanel = new CatalogItemsPanel(ID_CATALOG_ITEMS_PANEL, selectedTreeItemOidModel,
pageBase, itemsPerRow, objectProvider);
}
if (AssignmentViewType.ROLE_CATALOG_VIEW.equals(AssignmentViewType.getViewTypeFromSession(pageBase))) {
catalogItemsPanelContainer.add(new AttributeAppender("class", "col-md-9"));
} else {
catalogItemsPanelContainer.add(new AttributeAppender("class", "col-md-12"));
}
catalogItemsPanel.setOutputMarkupId(true);
catalogItemsPanelContainer.addOrReplace(catalogItemsPanel);
}
private void selectTreeItemPerformed(SelectableBean<OrgType> selected, AjaxRequestTarget target) {
final OrgType selectedOrg = selected.getValue();
if (selectedOrg == null) {
return;
}
selectedTreeItemOidModel.setObject(selectedOrg.getOid());
AssignmentViewType.saveViewTypeToSession(pageBase, AssignmentViewType.ROLE_CATALOG_VIEW);
AssignmentCatalogPanel.this.addOrReplaceLayout(null, getCatalogItemsPanelContainer());
target.add(getCatalogItemsPanelContainer());
}
private void initModels(){
selectedTreeItemOidModel = new IModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
return StringUtils.isEmpty( getRoleCatalogStorage().getSelectedOid()) ?
rootOid : getRoleCatalogStorage().getSelectedOid();
}
@Override
public void setObject(String s) {
getRoleCatalogStorage().setSelectedOid(s);
}
@Override
public void detach() {
}
};
viewModel = new IModel<AssignmentViewType>() {
private static final long serialVersionUID = 1L;
@Override
public AssignmentViewType getObject() {
return AssignmentViewType.getViewTypeFromSession(pageBase);
}
@Override
public void setObject(AssignmentViewType assignmentViewType) {
AssignmentViewType.saveViewTypeToSession(pageBase, assignmentViewType);
}
@Override
public void detach() {
}
};
searchModel = new LoadableModel<Search>(false) {
private static final long serialVersionUID = 1L;
@Override
public Search load() {
Search search = SearchFactory.createSearch(AbstractRoleType.class, pageBase.getPrismContext(),
pageBase.getModelInteractionService());
return search;
}
};
}
private void initUserSelectionPanel(WebMarkupContainer headerPanel){
WebMarkupContainer targetUserContainer = new WebMarkupContainer(ID_TARGET_USER_CONTAINER);
targetUserContainer.setOutputMarkupId(true);
AjaxLink<String> targetUserButton = new AjaxLink<String>(ID_TARGET_USER_BUTTON) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
if (showUserSelectionPopup) {
initUserSelectionPopup(createStringResource("AssignmentCatalogPanel.selectTargetUser"), true, target);
}
showUserSelectionPopup = true;
}
};
targetUserContainer.add(targetUserButton);
Label label = new Label(ID_TARGET_USER_LABEL, getTargetUserLabelModel());
label.setRenderBodyOnly(true);
targetUserButton.add(label);
AjaxLink deleteButton = new AjaxLink(ID_DELETE_TARGET_USER_BUTTON) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
showUserSelectionPopup = false;
getRoleCatalogStorage().setTargetUserList(null);
target.add(getTargetUserContainer());
}
};
deleteButton.add(new VisibleEnableBehaviour(){
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible(){
return getRoleCatalogStorage().getTargetUserList() != null &&
getRoleCatalogStorage().getTargetUserList().size() > 0;
}
});
targetUserButton.add(deleteButton);
headerPanel.add(targetUserContainer);
}
private void initViewSelector(WebMarkupContainer headerPanel){
DropDownChoice<AssignmentViewType> viewSelect = new DropDownChoice(ID_VIEW_TYPE, viewModel,
Model.ofList(viewTypeList != null && viewTypeList.size() > 0 ?
viewTypeList : createAssignableTypesList()),
new EnumChoiceRenderer<AssignmentViewType>(this));
viewSelect.add(new OnChangeAjaxBehavior() {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
if (AssignmentViewType.USER_TYPE.equals(viewSelect.getModelObject())){
initUserSelectionPopup(createStringResource("AssignmentCatalogPanel.selectAssignmentsUserOwner"),
false, target);
} else {
AssignmentCatalogPanel.this.addOrReplaceLayout(target, getCatalogItemsPanelContainer());
target.add(getCatalogItemsPanelContainer());
target.add(getHeaderPanel());
}
}
});
viewSelect.setOutputMarkupId(true);
headerPanel.add(viewSelect);
}
private WebMarkupContainer getCatalogItemsPanelContainer(){
return (WebMarkupContainer)get(ID_CATALOG_ITEMS_PANEL_CONTAINER);
}
private WebMarkupContainer getHeaderPanel(){
return (WebMarkupContainer)get(ID_HEADER_PANEL);
}
private DropDownChoice getViewSelectComponent(){
return (DropDownChoice)getHeaderPanel().get(ID_VIEW_TYPE);
}
private void initSearchPanel(WebMarkupContainer headerPanel) {
final Form searchForm = new Form(ID_SEARCH_FORM);
headerPanel.add(searchForm);
searchForm.add(new VisibleEnableBehaviour() {
public boolean isVisible() {
return !isCatalogOidEmpty()
&& !AssignmentViewType.USER_TYPE.equals( getRoleCatalogStorage().getViewType());
}
});
searchForm.setOutputMarkupId(true);
SearchPanel search = new SearchPanel(ID_SEARCH, (IModel) searchModel, false) {
private static final long serialVersionUID = 1L;
@Override
public void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {
AssignmentCatalogPanel.this.searchPerformed(query, target);
}
};
searchForm.add(search);
}
private void searchPerformed(ObjectQuery query, AjaxRequestTarget target) {
// setCurrentPage(0);
objectProvider.setQuery(createContentQuery(query));
AssignmentCatalogPanel.this.addOrReplaceLayout(null, getCatalogItemsPanelContainer());
target.add(getCatalogItemsPanelContainer());
}
protected ObjectQuery createContentQuery(ObjectQuery searchQuery) {
ObjectQuery memberQuery = new ObjectQuery();
if (AssignmentViewType.ROLE_CATALOG_VIEW.equals(AssignmentViewType.getViewTypeFromSession(pageBase))){
String oid = selectedTreeItemOidModel.getObject();
if (StringUtils.isNotEmpty(oid)) {
addOrgMembersFilter(oid, memberQuery);
}
}
addAssignableRolesFilter(memberQuery);
addViewTypeFilter(memberQuery);
if (memberQuery == null) {
memberQuery = new ObjectQuery();
}
if (searchQuery == null) {
if (searchModel != null && searchModel.getObject() != null) {
Search search = searchModel.getObject();
searchQuery = search.createObjectQuery(pageBase.getPrismContext());
}
}
if (searchQuery != null && searchQuery.getFilter() != null) {
memberQuery.addFilter(searchQuery.getFilter());
}
return memberQuery;
}
private void addViewTypeFilter(ObjectQuery query) {
ObjectFilter prependedAndFilter = null;
if (AssignmentViewType.ORG_TYPE.equals(AssignmentViewType.getViewTypeFromSession(pageBase))){
prependedAndFilter = ObjectQueryUtil.filterAnd(TypeFilter.createType(OrgType.COMPLEX_TYPE, null), query.getFilter());
query.addFilter(prependedAndFilter);
} else if (AssignmentViewType.ROLE_TYPE.equals(AssignmentViewType.getViewTypeFromSession(pageBase))){
prependedAndFilter = ObjectQueryUtil.filterAnd(TypeFilter.createType(RoleType.COMPLEX_TYPE, null), query.getFilter());
query.addFilter(prependedAndFilter);
} else if (AssignmentViewType.SERVICE_TYPE.equals(AssignmentViewType.getViewTypeFromSession(pageBase))){
prependedAndFilter = ObjectQueryUtil.filterAnd(TypeFilter.createType(ServiceType.COMPLEX_TYPE, null), query.getFilter());
query.addFilter(prependedAndFilter);
}
}
private void addAssignableRolesFilter(ObjectQuery query) {
ObjectFilter filter = null;
LOGGER.debug("Loading roles which the current user has right to assign");
OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNABLE_ROLES);
try {
ModelInteractionService mis = pageBase.getModelInteractionService();
RoleSelectionSpecification roleSpec =
mis.getAssignableRoleSpecification(getTargetUser(), result);
filter = roleSpec.getFilter();
} catch (Exception ex) {
LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load available roles", ex);
result.recordFatalError("Couldn't load available roles", ex);
} finally {
result.recomputeStatus();
}
if (!result.isSuccess() && !result.isHandledError()) {
pageBase.showResult(result);
}
if (query == null) {
query = new ObjectQuery();
}
query.addFilter(filter);
}
private ObjectQuery addOrgMembersFilter(String oid, ObjectQuery query) {
ObjectFilter filter = OrgFilter.createOrg(oid, OrgFilter.Scope.ONE_LEVEL);
TypeFilter roleTypeFilter = TypeFilter.createType(RoleType.COMPLEX_TYPE, filter);
TypeFilter serviceTypeFilter = TypeFilter.createType(ServiceType.COMPLEX_TYPE, filter);
query.addFilter(OrFilter.createOr(roleTypeFilter, serviceTypeFilter));
return query;
}
private void initCartButton(WebMarkupContainer headerPanel){
AjaxButton cartButton = new AjaxButton(ID_CART_BUTTON) {
private static final long serialVersionUID = 1L;
@Override
protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
attributes.setChannel(new AjaxChannel("blocking", AjaxChannel.Type.ACTIVE));
}
@Override
public void onClick(AjaxRequestTarget ajaxRequestTarget) {
PageAssignmentsList assignmentsPanel = new PageAssignmentsList(true);
pageBase.navigateToNext(assignmentsPanel);
}
};
cartButton.add(new VisibleEnableBehaviour(){
public boolean isVisible(){
return !isCatalogOidEmpty();
}
});
cartButton.setOutputMarkupId(true);
headerPanel.add(cartButton);
Label cartItemsCount = new Label(ID_CART_ITEMS_COUNT, new IModel<String>() {
@Override
public String getObject() {
SessionStorage storage = pageBase.getSessionStorage();
return Integer.toString(storage.getRoleCatalog().getAssignmentShoppingCart().size());
}
@Override
public void setObject(String s) {
}
@Override
public void detach() {
}
});
cartItemsCount.add(new VisibleEnableBehaviour() {
@Override
public boolean isVisible() {
SessionStorage storage = pageBase.getSessionStorage();
if (storage.getRoleCatalog().getAssignmentShoppingCart().size() == 0) {
return false;
} else {
return true;
}
}
});
cartItemsCount.setOutputMarkupId(true);
cartButton.add(cartItemsCount);
}
public void reloadCartButton(AjaxRequestTarget target) {
target.add(get(ID_HEADER_PANEL).get(ID_CART_BUTTON));
}
private QName getViewTypeClass(AssignmentViewType viewType) {
if (AssignmentViewType.ORG_TYPE.equals(viewType)) {
return OrgType.COMPLEX_TYPE;
} else if (AssignmentViewType.ROLE_TYPE.equals(viewType)) {
return RoleType.COMPLEX_TYPE;
} else if (AssignmentViewType.SERVICE_TYPE.equals(viewType)) {
return ServiceType.COMPLEX_TYPE;
}
return null;
}
public static List<AssignmentViewType> createAssignableTypesList() {
List<AssignmentViewType> focusTypeList = new ArrayList<>();
focusTypeList.add(AssignmentViewType.ROLE_CATALOG_VIEW);
focusTypeList.add(AssignmentViewType.ORG_TYPE);
focusTypeList.add(AssignmentViewType.ROLE_TYPE);
focusTypeList.add(AssignmentViewType.SERVICE_TYPE);
focusTypeList.add(AssignmentViewType.USER_TYPE);
return focusTypeList;
}
private boolean isCatalogOidEmpty(){
String oid = selectedTreeItemOidModel != null ? selectedTreeItemOidModel.getObject() : "";
return AssignmentViewType.ROLE_CATALOG_VIEW.equals(AssignmentViewType.getViewTypeFromSession(pageBase)) &&
(selectedTreeItemOidModel == null || StringUtils.isEmpty(oid));
}
private void initUserSelectionPopup(StringResourceModel title, boolean multiselect, AjaxRequestTarget target) {
List<QName> supportedTypes = new ArrayList<>();
supportedTypes.add(pageBase.getPrismContext().getSchemaRegistry()
.findObjectDefinitionByCompileTimeClass(UserType.class).getTypeName());
ObjectBrowserPanel<UserType> focusBrowser = new ObjectBrowserPanel<UserType>(pageBase.getMainPopupBodyId(),
UserType.class, supportedTypes, multiselect, pageBase, null, getSelectedObjects()) {
@Override
protected void addPerformed(AjaxRequestTarget target, QName type, List<UserType> selected) {
super.addPerformed(target, type, selected);
List<PrismObject<UserType>> userList = new ArrayList<>();
for (UserType user : selected){
userList.add(user.asPrismObject());
}
getRoleCatalogStorage().setTargetUserList(userList);
AssignmentCatalogPanel.this.addOrReplaceLayout(target, getCatalogItemsPanelContainer());
target.add(getHeaderPanel());
target.add(getCatalogItemsPanelContainer());
}
@Override
protected void onSelectPerformed(AjaxRequestTarget target, UserType targetUser) {
super.onSelectPerformed(target, targetUser);
getRoleCatalogStorage().setAssignmentsUserOwner(targetUser.asPrismContainer());
AssignmentCatalogPanel.this.addOrReplaceLayout(target, getCatalogItemsPanelContainer());
target.add(getCatalogItemsPanelContainer());
target.add(getHeaderPanel());
target.add(getViewSelectComponent());
}
@Override
public StringResourceModel getTitle() {
return title;
}
};
pageBase.showMainPopup(focusBrowser, target);
}
private List<UserType> getSelectedObjects(){
List<PrismObject<UserType>> selectedUsers = getRoleCatalogStorage().getTargetUserList();
List<UserType> users = new ArrayList<>();
if (selectedUsers != null) {
for (PrismObject<UserType> user : selectedUsers) {
users.add(user.asObjectable());
}
}
return users;
}
private WebMarkupContainer getTargetUserContainer(){
return (WebMarkupContainer)get(ID_HEADER_PANEL).get(ID_TARGET_USER_CONTAINER);
}
private IModel<String> getTargetUserLabelModel(){
return new IModel<String>() {
@Override
public String getObject() {
List<PrismObject<UserType>> targetUsersList = getRoleCatalogStorage().getTargetUserList();
if (targetUsersList == null ||
targetUsersList.size() == 0){
return createStringResource("AssignmentCatalogPanel.requestForMe").getString();
}
if (targetUsersList.size() == 1){
return createStringResource("AssignmentCatalogPanel.requestFor").getString() +
" " + targetUsersList.get(0).getName().getOrig();
}
return createStringResource("AssignmentCatalogPanel.requestForMultiple", targetUsersList.size()).getString();
}
@Override
public void setObject(String s) {
}
@Override
public void detach() {
}
};
}
private boolean isAlreadyAssigned(PrismObject<AbstractRoleType> obj, AssignmentEditorDto assignmentDto){
PrismObject<UserType> user = getTargetUser();
if (user == null || user.asObjectable().getAssignment() == null){
return false;
}
boolean isAssigned = false;
List<RelationTypes> assignedRelationsList = new ArrayList<>();
for (AssignmentType assignment : user.asObjectable().getAssignment()){
if (assignment.getTargetRef() != null && assignment.getTargetRef().getOid().equals(obj.getOid())){
isAssigned = true;
assignedRelationsList.add(RelationTypes.getRelationType(assignment.getTargetRef().getRelation()));
}
}
assignmentDto.setAssignedRelationsList(assignedRelationsList);
return isAssigned;
}
private PrismObject<UserType> getTargetUser(){
List<PrismObject<UserType>> targetUserList = getRoleCatalogStorage().getTargetUserList();
if (targetUserList == null || targetUserList.size() == 0){
return pageBase.loadUserSelf(pageBase);
}
return targetUserList.get(0);
}
private AssignmentConstraintsType getAssignmentConstraints() {
OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_CONSTRAINTS);
SystemConfigurationType systemConfig = null;
try {
systemConfig = pageBase.getModelInteractionService().getSystemConfiguration(result);
} catch (ObjectNotFoundException | SchemaException e) {
LOGGER.error("Error getting system configuration: {}", e.getMessage(), e);
return null;
}
if (systemConfig != null && systemConfig.getRoleManagement() != null) {
return systemConfig.getRoleManagement().getDefaultAssignmentConstraints();
}
return null;
}
private RoleCatalogStorage getRoleCatalogStorage(){
return pageBase.getSessionStorage().getRoleCatalog();
}
}