Skip to content

Commit

Permalink
Merge remote-tracking branch 'refs/remotes/origin/master'
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Oct 10, 2022
2 parents 0797096 + 71fe5ee commit c93058c
Show file tree
Hide file tree
Showing 8 changed files with 166 additions and 159 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.evolveum.midpoint.prism.delta.DeltaSetTriple;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.xml.XmlTypeConverter;
import com.evolveum.midpoint.schema.DeltaConvertor;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
Expand Down Expand Up @@ -67,6 +68,7 @@ public class RequestAccess implements Serializable {
private static final String OPERATION_REQUEST_ASSIGNMENTS = DOT_CLASS + "requestAssignments";
private static final String OPERATION_REQUEST_ASSIGNMENTS_SINGLE = DOT_CLASS + "requestAssignmentsSingle";
private static final String OPERATION_LOAD_ASSIGNABLE_RELATIONS_LIST = DOT_CLASS + "loadAssignableRelationsList";
private static final String OPERATION_LOAD_ASSIGNABLE_ROLES = DOT_CLASS + "loadAssignableRoles";

public static final List<ValidityPredefinedValueType> DEFAULT_VALIDITY_PERIODS = Arrays.asList(
new ValidityPredefinedValueType()
Expand Down Expand Up @@ -717,34 +719,57 @@ public void setValidity(XMLGregorianCalendar from, XMLGregorianCalendar to) {
markConflictsDirty();
}

private List<QName> getAssignableRelationList(PageBase page, ObjectReferenceType ref) {
if (ref == null) {
return new ArrayList<>();
private PrismObject<UserType> resolveFirstPoiReference(PageBase page) {
List<ObjectReferenceType> personsOfInterest = getPersonOfInterest();
ObjectReferenceType ref;
if (personsOfInterest.isEmpty()) {
return null;
}

FocusType focus;
ref = personsOfInterest.get(0);
try {
PrismObject<UserType> prismFocus = WebModelServiceUtils.loadObject(ref, page);
focus = prismFocus.asObjectable();
return WebModelServiceUtils.loadObject(ref, page);
} catch (Exception ex) {
page.error(page.getString("RelationPanel.loadRelationsError", ref.getTargetName(), ref.getOid()));
page.error(page.getString("RequestAccess.resolveFirstPersonOfInterest", ref.getTargetName(), ref.getOid()));
}

return null;
}

private List<QName> getAssignableRelationList(PageBase page) {
PrismObject<UserType> focus = resolveFirstPoiReference(page);
if (focus == null) {
return new ArrayList<>();
}

Task task = page.createSimpleTask(OPERATION_LOAD_ASSIGNABLE_RELATIONS_LIST);
OperationResult result = task.getResult();

return WebComponentUtil.getAssignableRelationsList(
focus.asPrismObject(), RoleType.class, WebComponentUtil.AssignmentOrder.ASSIGNMENT, result, task, page);
focus, RoleType.class, WebComponentUtil.AssignmentOrder.ASSIGNMENT, result, task, page);
}

public List<QName> getAvailableRelations(PageBase page) {
List<ObjectReferenceType> personsOfInterest = getPersonOfInterest();
ObjectReferenceType ref = null;
if (!personsOfInterest.isEmpty()) {
ref = personsOfInterest.get(0);
public ObjectFilter getAssignableRolesFilter(PageBase page, Class<? extends AbstractRoleType> targetType) {
if (targetType == null) {
return null;
}

List<QName> relations = getAssignableRelationList(page, ref);
PrismObject<UserType> focus = resolveFirstPoiReference(page);
if (focus == null) {
return null;
}

QName relation = getRelation();

Task task = page.createSimpleTask(OPERATION_LOAD_ASSIGNABLE_ROLES);
OperationResult result = task.getResult();

return WebComponentUtil.getAssignableRolesFilter(focus, targetType, relation,
WebComponentUtil.AssignmentOrder.ASSIGNMENT, result, task, page);
}

public List<QName> getAvailableRelations(PageBase page) {
List<QName> relations = getAssignableRelationList(page);

if (CollectionUtils.isEmpty(relations)) {
relations = WebComponentUtil.getCategoryRelationChoices(AreaCategoryType.SELF_SERVICE, page);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ public class RoleCatalogPanel extends WizardStepPanel<RequestAccess> implements
private static final String ID_ADD_SELECTED = "addSelected";
private static final String ID_ADD_ALL = "addAll";

private PageBase page;
private final PageBase page;

private IModel<Search<? extends ObjectType>> searchModel;

Expand Down Expand Up @@ -238,7 +238,7 @@ private void updateQueryForRolesOfTeammate(RoleCatalogQuery query, String userOi
String[] oids = user.asObjectable().getAssignment().stream()
.filter(a -> a.getTargetRef() != null)
.map(a -> a.getTargetRef().getOid())
.toArray((count) -> new String[count]);
.toArray(String[]::new);

ObjectQuery oq = getPrismContext().queryFor(AbstractRoleType.class)
.id(oids)
Expand All @@ -263,6 +263,12 @@ private void updateQueryFromCollectionRef(RoleCatalogQuery query, ObjectReferenc
}

PrismObject<ObjectCollectionType> collection = WebModelServiceUtils.loadObject(collectionRef, page);
if (collection == null) {
page.error(page.getString("RoleCatalogPanel.message.loadObjectCollectionError", WebComponentUtil.getName(collectionRef)));
updateFalseQuery(query);
return;
}

ObjectCollectionType objectCollection = collection.asObjectable();

try {
Expand All @@ -283,7 +289,7 @@ private void updateQueryFromCollectionRef(RoleCatalogQuery query, ObjectReferenc
query.setType(ot.getClassDefinition());
} catch (Exception ex) {
LOGGER.debug("Couldn't create search filter", ex);
page.error("Couldn't create search filter, reason: " + ex.getMessage());
page.error(page.getString("RoleCatalogPanel.message.searchFilterError", ex.getMessage()));

updateFalseQuery(query);
}
Expand All @@ -302,7 +308,7 @@ private void updateQueryFromCollectionIdentifier(RoleCatalogQuery query, String
.build();

query.setQuery(oq);
query.setType(collection.getType());
query.setType((Class<? extends AbstractRoleType>) collection.getType());
}

private void initModels() {
Expand Down Expand Up @@ -352,7 +358,17 @@ private void initLayout() {

@Override
protected ObjectQuery getCustomizeContentQuery() {
return queryModel.getObject().getQuery();
RoleCatalogQuery catalogQuery = queryModel.getObject();
ObjectQuery query = catalogQuery.getQuery();

Class<? extends AbstractRoleType> type = catalogQuery.getType();

ObjectFilter assignableRolesFilter = getModelObject().getAssignableRolesFilter(page, type);
if (assignableRolesFilter != null) {
query.addFilter(assignableRolesFilter);
}

return query;
}
};
Collection<SelectorOptions<GetOperationOptions>> options = getPageBase().getOperationOptionsBuilder()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,11 @@

package com.evolveum.midpoint.gui.impl.page.self.requestAccess;

import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import java.io.Serializable;

import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;

/**
* Created by Viliam Repan (lazyman).
*/
Expand All @@ -20,15 +20,15 @@ public class RoleCatalogQuery implements Serializable {
public RoleCatalogQuery() {
}

private Class<? extends ObjectType> type;
private Class<? extends AbstractRoleType> type;

private ObjectQuery query;

public Class<? extends ObjectType> getType() {
public Class<? extends AbstractRoleType> getType() {
return type;
}

public void setType(Class<? extends ObjectType> type) {
public void setType(Class<? extends AbstractRoleType> type) {
this.type = type;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -159,19 +159,24 @@ private void buttonMenuItemClickPerformed(int id, List<ButtonInlineMenuItem> but
if (id >= buttonMenuItems.size()){
return;
}

ButtonInlineMenuItem menuItem = buttonMenuItems.get(id);
if (menuItem.getAction() != null) {
// TODO: getConfirmationMessageModel is called here and again in showConfirmationPopup, but these are not getters,
// but both create model (perhaps not very expensive, but it still seems like waste.
if (menuItem.showConfirmationDialog() && menuItem.getConfirmationMessageModel() != null) {
showConfirmationPopup(menuItem, target);
} else {
if (menuItem.isSubmit()){
menuItem.getAction().onSubmit(target);
} else {
menuItem.getAction().onClick(target);
}
}
InlineMenuItemAction action = menuItem.getAction();
if (action == null) {
return;
}

// TODO: getConfirmationMessageModel is called here and again in showConfirmationPopup, but these are not getters,
// but both create model (perhaps not very expensive, but it still seems like waste.
if (menuItem.showConfirmationDialog() && menuItem.getConfirmationMessageModel() != null) {
showConfirmationPopup(menuItem, target);
return;
}

if (menuItem.isSubmit()){
action.onSubmit(target);
} else {
action.onClick(target);
}
}

Expand Down

0 comments on commit c93058c

Please sign in to comment.