Skip to content

Commit

Permalink
MID-5847 shopping cart target user
Browse files Browse the repository at this point in the history
  • Loading branch information
KaterynaHonchar committed Oct 17, 2019
1 parent a9407f2 commit 7126b1d
Show file tree
Hide file tree
Showing 5 changed files with 102 additions and 46 deletions.
Expand Up @@ -353,6 +353,19 @@ public static <O extends ObjectType> List<O> loadReferencedObjectList(List<Objec
return loadedObjectsList;
}

public static List<UserType> loadTargetUsersListForShoppingCart(String operation, PageBase pageBase){
List<String> usersOidsList = pageBase.getSessionStorage().getRoleCatalog().getTargetUserOidsList();
if (CollectionUtils.isEmpty(usersOidsList)){
return new ArrayList<>();
}
List<ObjectReferenceType> usersReferenceList = new ArrayList<>();
usersOidsList.forEach(userOid -> {
usersReferenceList.add(WebComponentUtil.createObjectRef(userOid, null, UserType.COMPLEX_TYPE));
});
return WebComponentUtil.loadReferencedObjectList(usersReferenceList, operation, pageBase);

}

public static ObjectFilter getShadowTypeFilterForAssociation(ConstructionType construction, String operation, PageBase pageBase){
PrismContext prismContext = pageBase.getPrismContext();
if (construction == null){
Expand Down
Expand Up @@ -85,6 +85,7 @@ public class AssignmentEditorPanel extends BasePanel<AssignmentEditorDto> {
private static final String OPERATION_LOAD_RESOURCE = DOT_CLASS + "loadResource";
private static final String OPERATION_LOAD_ATTRIBUTES = DOT_CLASS + "loadAttributes";
private static final String OPERATION_LOAD_TARGET_OBJECT = DOT_CLASS + "loadItemSecurityDecisions";
private static final String OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT = DOT_CLASS + "loadAssignmentTargetUserObject";
private static final String OPERATION_LOAD_RELATION_DEFINITIONS = DOT_CLASS + "loadRelationDefinitions";

private static final String ID_HEADER_ROW = "headerRow";
Expand Down Expand Up @@ -1135,12 +1136,14 @@ private ItemSecurityConstraints loadSecurityConstraints() {
operationObject = ((PageAdminFocus)pageBase).getObjectWrapper().getObject();
} else if ((pageBase instanceof PageAssignmentDetails || pageBase instanceof PageAssignmentsList) //shopping cart assignment details panels
&& !pageBase.getSessionStorage().getRoleCatalog().isMultiUserRequest()){
List<UserType> targetUserList = pageBase.getSessionStorage().getRoleCatalog().getTargetUserList();
if (targetUserList == null || targetUserList.size() == 0){
operationObject = pageBase.getPrincipalUser().asPrismObject();
} else {
operationObject = targetUserList.get(0).asPrismObject();
}
String targetUserOid = pageBase.getSessionStorage().getRoleCatalog().isSelfRequest() ?
pageBase.getPrincipalUser().getOid() :
pageBase.getSessionStorage().getRoleCatalog().getTargetUserOidsList().get(0);
Task task = pageBase.createSimpleTask(OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT);
OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT);
operationObject = WebModelServiceUtils.loadObject(UserType.class,
targetUserOid, pageBase, task, result);

}
if (operationObject == null) {
return null;
Expand Down
Expand Up @@ -9,6 +9,7 @@
import com.evolveum.midpoint.gui.api.component.BasePanel;
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.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
Expand All @@ -30,7 +31,7 @@
import com.evolveum.midpoint.web.session.RoleCatalogStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.wicket.AttributeModifier;
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;
Expand Down Expand Up @@ -66,9 +67,11 @@ public abstract class AbstractShoppingCartTabPanel<R extends AbstractRoleType> e
private static final String OPERATION_LOAD_ASSIGNABLE_ROLES = DOT_CLASS + "loadAssignableRoles";
private static final String OPERATION_LOAD_ASSIGNABLE_RELATIONS_LIST = DOT_CLASS + "loadAssignableRelationsList";
private static final String OPERATION_LOAD_ASSIGNMENTS_LIMIT = DOT_CLASS + "loadAssignmentsLimit";
private static final String OPERATION_LOAD_ASSIGNMENT_TARGET_USER = DOT_CLASS + "loadAssignmentTargetUser";
private static final Trace LOGGER = TraceManager.getTrace(AbstractShoppingCartTabPanel.class);

private RoleManagementConfigurationType roleManagementConfig;
LoadableModel<UserType> targetUserModel;

public AbstractShoppingCartTabPanel(String id, RoleManagementConfigurationType roleManagementConfig){
super(id);
Expand All @@ -78,9 +81,23 @@ public AbstractShoppingCartTabPanel(String id, RoleManagementConfigurationType r
@Override
protected void onInitialize(){
super.onInitialize();
targetUserModel = new LoadableModel<UserType>(true) {
@Override
protected UserType load() {
return getTargetUser();
}
};
initLayout();
}

@Override
protected void onDetach() {
super.onDetach();
if (targetUserModel != null){
targetUserModel.reset();
}
}

private void initLayout(){
setOutputMarkupId(true);

Expand Down Expand Up @@ -181,7 +198,8 @@ private void initTargetUserSelectionPanel(WebMarkupContainer parametersPanel){
new IModel<List<UserType>>() {
@Override
public List<UserType> getObject() {
return getRoleCatalogStorage().getTargetUserList();
return WebComponentUtil.loadTargetUsersListForShoppingCart(OPERATION_LOAD_ASSIGNMENT_TARGET_USER,
AbstractShoppingCartTabPanel.this.getPageBase());
}
},
true, createStringResource("AssignmentCatalogPanel.selectTargetUser")){
Expand All @@ -200,15 +218,19 @@ protected String getTargetUserButtonClass(){
@Override
protected void onDeleteSelectedUsersPerformed(AjaxRequestTarget target){
super.onDeleteSelectedUsersPerformed(target);
getRoleCatalogStorage().setTargetUserList(new ArrayList<>());
getRoleCatalogStorage().setTargetUserOidsList(new ArrayList<>());

target.add(AbstractShoppingCartTabPanel.this);
// target.add(parametersPanel.get(ID_TARGET_USER_PANEL));
}

@Override
protected void multipleUsersSelectionPerformed(AjaxRequestTarget target, List<UserType> usersList){
getRoleCatalogStorage().setTargetUserList(usersList);
if (CollectionUtils.isNotEmpty(usersList)){
List<String> usersOidsList = new ArrayList<>();
usersList.forEach(user -> usersOidsList.add(user.getOid()));
getRoleCatalogStorage().setTargetUserOidsList(usersOidsList);
}
target.add(AbstractShoppingCartTabPanel.this);
// target.add(parametersPanel.get(ID_TARGET_USER_PANEL));
}
Expand Down Expand Up @@ -386,7 +408,7 @@ public ObjectQuery getQuery() {
}

private boolean isAlreadyAssigned(PrismObject<AbstractRoleType> obj, AssignmentEditorDto assignmentDto){
UserType user = getTargetUser();
UserType user = targetUserModel.getObject();
if (user == null || user.getAssignment() == null){
return false;
}
Expand Down Expand Up @@ -433,19 +455,33 @@ private SearchPanel getSearchPanel(){
}

private ObjectFilter getAssignableRolesFilter() {
if (getRoleCatalogStorage().isMultiUserRequest()){
return null;
}
Task task = getPageBase().createSimpleTask(OPERATION_LOAD_ASSIGNABLE_ROLES);
OperationResult result = task.getResult();
return WebComponentUtil.getAssignableRolesFilter(getTargetUser().asPrismObject(), (Class) ObjectTypes.getObjectTypeClass(getQueryType()),
UserType targetUser = targetUserModel.getObject();
if (targetUser == null){
return null;
}
return WebComponentUtil.getAssignableRolesFilter(targetUser.asPrismObject(), (Class) ObjectTypes.getObjectTypeClass(getQueryType()),
getNewAssignmentRelation(), WebComponentUtil.AssignmentOrder.ASSIGNMENT, result, task, getPageBase());
}

protected abstract QName getQueryType();

private UserType getTargetUser(){
if (getRoleCatalogStorage().isSelfRequest()){
return getPageBase().getPrincipalUser();
String targetUserOid = getRoleCatalogStorage().isSelfRequest() ?
getPageBase().getPrincipalUser().getOid()
: getRoleCatalogStorage().getTargetUserOidsList().get(0);
if (StringUtils.isEmpty(targetUserOid)){
return null;
}
return getRoleCatalogStorage().getTargetUserList().get(0);
OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_TARGET_USER);
Task task = getPageBase().createSimpleTask(OPERATION_LOAD_ASSIGNMENT_TARGET_USER);

PrismObject<UserType> targetUser = WebModelServiceUtils.loadObject(UserType.class, targetUserOid, getPageBase(), task, result);
return targetUser != null ? targetUser.asObjectable() : null;
}

protected void assignmentAddedToShoppingCartPerformed(AjaxRequestTarget target){
Expand Down
Expand Up @@ -43,6 +43,7 @@
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.web.util.OnePageParameterEncoder;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.map.HashedMap;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.Component;
Expand Down Expand Up @@ -82,6 +83,7 @@ public class PageAssignmentsList<F extends FocusType> extends PageBase{
private static final String OPERATION_REQUEST_ASSIGNMENTS = DOT_CLASS + "requestAssignments";
private static final String OPERATION_WF_TASK_CREATED = "com.evolveum.midpoint.wf.impl.hook.WfHook.invoke";
private static final String OPERATION_PREVIEW_ASSIGNMENT_CONFLICTS = "reviewAssignmentConflicts";
private static final String OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT = "loadAssignmentTargetUserObject";

private IModel<List<AssignmentEditorDto>> assignmentsModel;
private OperationResult backgroundTaskOperationResult = null;
Expand Down Expand Up @@ -158,7 +160,8 @@ protected boolean isRelationEditable() {
new IModel<List<UserType>>() {
@Override
public List<UserType> getObject() {
return getSessionStorage().getRoleCatalog().getTargetUserList();
return WebComponentUtil.loadTargetUsersListForShoppingCart(OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT,
PageAssignmentsList.this);
}
},
true, createStringResource("AssignmentCatalogPanel.selectTargetUser")) {
Expand All @@ -172,13 +175,17 @@ protected String getUserButtonLabel() {
@Override
protected void onDeleteSelectedUsersPerformed(AjaxRequestTarget target) {
super.onDeleteSelectedUsersPerformed(target);
getSessionStorage().getRoleCatalog().setTargetUserList(new ArrayList<>());
getSessionStorage().getRoleCatalog().setTargetUserOidsList(new ArrayList<>());
targetUserChangePerformed(target);
}

@Override
protected void multipleUsersSelectionPerformed(AjaxRequestTarget target, List<UserType> usersList) {
getSessionStorage().getRoleCatalog().setTargetUserList(usersList);
if (CollectionUtils.isNotEmpty(usersList)){
List<String> usersOidsList = new ArrayList<>();
usersList.forEach(user -> usersOidsList.add(user.getOid()));
getSessionStorage().getRoleCatalog().setTargetUserOidsList(usersOidsList);
}
targetUserChangePerformed(target);
}

Expand Down Expand Up @@ -210,8 +217,8 @@ public void onClick(AjaxRequestTarget target) {
AjaxButton requestAssignments = new AjaxButton(ID_REQUEST_BUTTON, createStringResource("PageAssignmentsList.requestButton")) {
@Override
public void onClick(AjaxRequestTarget target) {
if (getSessionStorage().getRoleCatalog().getTargetUserList() == null ||
getSessionStorage().getRoleCatalog().getTargetUserList().size() <= 1) {
if (getSessionStorage().getRoleCatalog().getTargetUserOidsList() == null ||
getSessionStorage().getRoleCatalog().getTargetUserOidsList().size() <= 1) {
onSingleUserRequestPerformed(target);
} else {
onMultiUserRequestPerformed(target);
Expand Down Expand Up @@ -371,8 +378,8 @@ private void clearStorage(){
if (storage.getRoleCatalog().getAssignmentShoppingCart() != null) {
storage.getRoleCatalog().getAssignmentShoppingCart().clear();
}
if (storage.getRoleCatalog().getTargetUserList() != null){
storage.getRoleCatalog().getTargetUserList().clear();
if (storage.getRoleCatalog().getTargetUserOidsList() != null){
storage.getRoleCatalog().getTargetUserOidsList().clear();
}
storage.getRoleCatalog().setRequestDescription("");
}
Expand Down Expand Up @@ -582,19 +589,11 @@ private ObjectDelta prepareDelta(PrismObject<UserType> user, OperationResult res
}

private ObjectQuery getTaskQuery(){
List<UserType> userList;
if (getSessionStorage().getRoleCatalog().isSelfRequest()){
userList = new ArrayList<>();
userList.add(getPrincipalUser());
} else {
userList = getSessionStorage().getRoleCatalog().getTargetUserList();
}
Set<String> oids = new HashSet<>();
for (UserType user : userList){
oids.add(user.getOid());
}
List<String> targetUsersOids = getSessionStorage().getRoleCatalog().isSelfRequest() ?
Arrays.asList(getPrincipalUser().getOid()) :
getSessionStorage().getRoleCatalog().getTargetUserOidsList();
QueryFactory queryFactory = getPrismContext().queryFactory();
return queryFactory.createQuery(queryFactory.createInOid(oids));
return queryFactory.createQuery(queryFactory.createInOid(targetUsersOids));
}

private PrismContainerValue[] getAddAssignmentContainerValues(List<AssignmentEditorDto> assignments) throws SchemaException {
Expand Down Expand Up @@ -647,10 +646,16 @@ private TextArea getDescriptionComponent(){
}

private PrismObject<UserType> getTargetUser() throws SchemaException {
List<UserType> usersList = getSessionStorage().getRoleCatalog().getTargetUserList();
PrismObject<UserType> user = getSessionStorage().getRoleCatalog().isSelfRequest() ?
getPrincipalUser().asPrismObject()
: usersList.get(0).asPrismObject();
String targetUserOid = getSessionStorage().getRoleCatalog().isSelfRequest() ?
getPrincipalUser().getOid() :
getSessionStorage().getRoleCatalog().getTargetUserOidsList().get(0);
Task task = createSimpleTask(OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT);
OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_TARGET_USER_OBJECT);
PrismObject<UserType> user = WebModelServiceUtils.loadObject(UserType.class,
targetUserOid, PageAssignmentsList.this, task, result);
if (user == null){
return null;
}
getPrismContext().adopt(user);
return user;
}
Expand Down
Expand Up @@ -10,7 +10,6 @@
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto;
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.util.SelectableBean;
import com.evolveum.midpoint.web.component.util.TreeSelectableBean;
import com.evolveum.midpoint.web.page.admin.users.dto.TreeStateSet;
import com.evolveum.midpoint.web.page.self.PageAssignmentShoppingCart;
Expand Down Expand Up @@ -46,7 +45,7 @@ public class RoleCatalogStorage implements PageStorage, OrgTreeStateStorage {
private List<AssignmentEditorDto> assignmentShoppingCart; // a list of assignments in the shopping cart
private AssignmentViewType viewType = null; //the current view type
private int defaultTabIndex = -1;
private List<UserType> targetUserList = new ArrayList<>();
private List<String> targetUserOidsList = new ArrayList<>();
private UserType assignmentsUserOwner = null;
private List<ConflictDto> conflictsList;
private String requestDescription = "";
Expand Down Expand Up @@ -184,12 +183,12 @@ public void setSelectedOid(String selectedOid) {
this.selectedOid = selectedOid;
}

public List<UserType> getTargetUserList() {
return targetUserList;
public List<String> getTargetUserOidsList() {
return targetUserOidsList;
}

public void setTargetUserList(List<UserType> targetUserList) {
this.targetUserList = targetUserList;
public void setTargetUserOidsList(List<String> targetUserOidsList) {
this.targetUserOidsList = targetUserOidsList;
}

public UserType getAssignmentsUserOwner() {
Expand All @@ -201,11 +200,11 @@ public void setAssignmentsUserOwner(UserType assignmentsUserOwner) {
}

public boolean isSelfRequest(){
return getTargetUserList() == null || getTargetUserList().size() == 0;
return getTargetUserOidsList() == null || getTargetUserOidsList().size() == 0;
}

public boolean isMultiUserRequest(){
return getTargetUserList() != null && getTargetUserList().size() > 1;
return getTargetUserOidsList() != null && getTargetUserOidsList().size() > 1;
}

public int getAssignmentRequestLimit() {
Expand Down

0 comments on commit 7126b1d

Please sign in to comment.