Skip to content

Commit

Permalink
Basic deputy functionality (in progress)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Nov 3, 2016
1 parent 0c07268 commit 6c10435
Show file tree
Hide file tree
Showing 9 changed files with 268 additions and 133 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.model.api.ModelExecuteOptions;
import com.evolveum.midpoint.model.api.context.EvaluatedAbstractRole;
import com.evolveum.midpoint.model.api.context.EvaluatedAssignmentTarget;
import com.evolveum.midpoint.model.api.context.EvaluatedAssignment;
import com.evolveum.midpoint.model.api.context.EvaluatedConstruction;
import com.evolveum.midpoint.model.api.context.ModelContext;
Expand Down Expand Up @@ -854,11 +854,11 @@ public List<AssignmentsPreviewDto> recomputeAssignmentsPerformed(AjaxRequestTarg
continue;
}
// roles and orgs
DeltaSetTriple<? extends EvaluatedAbstractRole> evaluatedRolesTriple = evaluatedAssignment
DeltaSetTriple<? extends EvaluatedAssignmentTarget> evaluatedRolesTriple = evaluatedAssignment
.getRoles();
Collection<? extends EvaluatedAbstractRole> evaluatedRoles = evaluatedRolesTriple
Collection<? extends EvaluatedAssignmentTarget> evaluatedRoles = evaluatedRolesTriple
.getNonNegativeValues();
for (EvaluatedAbstractRole role : evaluatedRoles) {
for (EvaluatedAssignmentTarget role : evaluatedRoles) {
if (role.isEvaluateConstructions()) {
assignmentDtoSet.add(createAssignmentsPreviewDto(role, task, result));
}
Expand All @@ -884,14 +884,14 @@ public List<AssignmentsPreviewDto> recomputeAssignmentsPerformed(AjaxRequestTarg
return null;
}

private AssignmentsPreviewDto createAssignmentsPreviewDto(EvaluatedAbstractRole evaluatedAbstractRole,
private AssignmentsPreviewDto createAssignmentsPreviewDto(EvaluatedAssignmentTarget evaluatedAbstractRole,
Task task, OperationResult result) {
AssignmentsPreviewDto dto = new AssignmentsPreviewDto();
PrismObject<? extends AbstractRoleType> role = evaluatedAbstractRole.getRole();
dto.setTargetOid(role.getOid());
dto.setTargetName(getNameToDisplay(role));
dto.setTargetDescription(role.asObjectable().getDescription());
dto.setTargetClass(role.getCompileTimeClass());
PrismObject<? extends FocusType> target = evaluatedAbstractRole.getTarget();
dto.setTargetOid(target.getOid());
dto.setTargetName(getNameToDisplay(target));
dto.setTargetDescription(target.asObjectable().getDescription());
dto.setTargetClass(target.getCompileTimeClass());
dto.setDirect(evaluatedAbstractRole.isDirectlyAssigned());
if (evaluatedAbstractRole.getAssignment() != null) {
if (evaluatedAbstractRole.getAssignment().getTenantRef() != null) {
Expand All @@ -906,12 +906,14 @@ private AssignmentsPreviewDto createAssignmentsPreviewDto(EvaluatedAbstractRole
return dto;
}

private String getNameToDisplay(PrismObject<? extends AbstractRoleType> role) {
String n = PolyString.getOrig(role.asObjectable().getDisplayName());
if (StringUtils.isNotBlank(n)) {
return n;
private String getNameToDisplay(PrismObject<? extends FocusType> target) {
if (target.canRepresent(AbstractRoleType.class)) {
String n = PolyString.getOrig(((AbstractRoleType)target.asObjectable()).getDisplayName());
if (StringUtils.isNotBlank(n)) {
return n;
}
}
return PolyString.getOrig(role.asObjectable().getName());
return PolyString.getOrig(target.asObjectable().getName());
}

private String nameFromReference(ObjectReferenceType reference, Task task, OperationResult result) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public interface EvaluatedAssignment<F extends FocusType> extends DebugDumpable

Collection<AdminGuiConfigurationType> getAdminGuiConfigurations();

DeltaSetTriple<? extends EvaluatedAbstractRole> getRoles();
DeltaSetTriple<? extends EvaluatedAssignmentTarget> getRoles();

DeltaSetTriple<EvaluatedConstruction> getEvaluatedConstructions(Task task, OperationResult result) throws SchemaException, ObjectNotFoundException;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/**
* Copyright (c) 2015 Evolveum
* Copyright (c) 2015-2016 Evolveum
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -19,14 +19,15 @@
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;

/**
* @author semancik
*
*/
public interface EvaluatedAbstractRole extends DebugDumpable {
public interface EvaluatedAssignmentTarget extends DebugDumpable {

PrismObject<? extends AbstractRoleType> getRole();
PrismObject<? extends FocusType> getTarget();

boolean isDirectlyAssigned();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,6 @@ private <O extends ObjectType> List<PrismObject<O>> resolveTargetsFromFilter(Cla
ModelExpressionThreadLocalHolder.popCurrentTask();
}


}


Expand All @@ -498,7 +497,7 @@ private void evaluateTarget(EvaluatedAssignmentImpl<F> assignment, AssignmentPat
ObjectType targetType = (ObjectType) target.asObjectable();
assignmentPathSegment.setTarget(targetType);
if (targetType instanceof AbstractRoleType) {
boolean roleConditionTrue = evaluateAbstractRole(assignment, assignmentPathSegment, evaluateOld, mode, isValid, (AbstractRoleType)targetType, source, sourceDescription,
boolean roleConditionTrue = evaluateAssignmentTarget(assignment, assignmentPathSegment, evaluateOld, mode, isValid, (AbstractRoleType)targetType, source, sourceDescription,
assignmentPath, task, result);
if (roleConditionTrue && mode != PlusMinusZero.MINUS && assignmentPathSegment.isEvaluateConstructions()) {
PrismReferenceValue refVal = new PrismReferenceValue();
Expand All @@ -514,7 +513,8 @@ private void evaluateTarget(EvaluatedAssignmentImpl<F> assignment, AssignmentPat
} else if (targetType instanceof UserType) {
if (QNameUtil.match(relation, SchemaConstants.ORG_DEPUTY)) {

// TODO MID-3472
evaluateAssignmentTarget(assignment, assignmentPathSegment, evaluateOld, mode, isValid, (UserType)targetType, source, sourceDescription,
assignmentPath, task, result);

} else {
throw new SchemaException("Unsuppoted relation " + relation + " for assignment of target type " + targetType + " in " + sourceDescription);
Expand All @@ -523,38 +523,40 @@ private void evaluateTarget(EvaluatedAssignmentImpl<F> assignment, AssignmentPat
throw new SchemaException("Unknown assignment target type " + targetType + " in " + sourceDescription);
}
}

private boolean evaluateAbstractRole(EvaluatedAssignmentImpl<F> assignment, AssignmentPathSegment assignmentPathSegment,
boolean evaluateOld, PlusMinusZero mode, boolean isValid, AbstractRoleType roleType, ObjectType source, String sourceDescription,
private boolean evaluateAssignmentTarget(EvaluatedAssignmentImpl<F> assignment, AssignmentPathSegment assignmentPathSegment,
boolean evaluateOld, PlusMinusZero mode, boolean isValid, FocusType targetType, ObjectType source, String sourceDescription,
AssignmentPath assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, PolicyViolationException {
assertSource(source, assignment);

if (!LensUtil.isValid(roleType, now, activationComputer)) {
LOGGER.trace("Skipping evaluation of " + roleType + " because it is not valid");
if (!LensUtil.isValid(targetType, now, activationComputer)) {
LOGGER.trace("Skipping evaluation of " + targetType + " because it is not valid");
return false;
}

MappingType conditionType = roleType.getCondition();
if (conditionType != null) {
AssignmentPathVariables assignmentPathVariables = LensUtil.computeAssignmentPathVariables(assignmentPath);
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> conditionTriple = evaluateMappingAsCondition(conditionType,
null, source, assignmentPathVariables, task, result);
boolean condOld = ExpressionUtil.computeConditionResult(conditionTriple.getNonPositiveValues());
boolean condNew = ExpressionUtil.computeConditionResult(conditionTriple.getNonNegativeValues());
PlusMinusZero condMode = ExpressionUtil.computeConditionResultMode(condOld, condNew);
if (condMode == null || (condMode == PlusMinusZero.ZERO && !condNew)) {
LOGGER.trace("Skipping evaluation of "+roleType+" because of condition result ({} -> {}: {})",
condOld, condNew, condMode);
return false;
if (targetType instanceof AbstractRoleType) {
MappingType conditionType = ((AbstractRoleType)targetType).getCondition();
if (conditionType != null) {
AssignmentPathVariables assignmentPathVariables = LensUtil.computeAssignmentPathVariables(assignmentPath);
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> conditionTriple = evaluateMappingAsCondition(conditionType,
null, source, assignmentPathVariables, task, result);
boolean condOld = ExpressionUtil.computeConditionResult(conditionTriple.getNonPositiveValues());
boolean condNew = ExpressionUtil.computeConditionResult(conditionTriple.getNonNegativeValues());
PlusMinusZero condMode = ExpressionUtil.computeConditionResultMode(condOld, condNew);
if (condMode == null || (condMode == PlusMinusZero.ZERO && !condNew)) {
LOGGER.trace("Skipping evaluation of "+targetType+" because of condition result ({} -> {}: {})",
condOld, condNew, condMode);
return false;
}
PlusMinusZero origMode = mode;
mode = PlusMinusZero.compute(mode, condMode);
LOGGER.trace("Evaluated condition in {}: {} -> {}: {} + {} = {}", targetType, condOld, condNew,
origMode, condMode, mode);
}
PlusMinusZero origMode = mode;
mode = PlusMinusZero.compute(mode, condMode);
LOGGER.trace("Evaluated condition in {}: {} -> {}: {} + {} = {}", roleType, condOld, condNew,
origMode, condMode, mode);
}

EvaluatedAbstractRoleImpl evalRole = new EvaluatedAbstractRoleImpl();
evalRole.setRole(roleType.asPrismObject());
EvaluatedAssignmentTargetImpl evalRole = new EvaluatedAssignmentTargetImpl();
evalRole.setTarget(targetType.asPrismObject());
evalRole.setEvaluateConstructions(assignmentPathSegment.isEvaluateConstructions());
evalRole.setAssignment(assignmentPath.last().getAssignment());
evalRole.setDirectlyAssigned(assignmentPath.size() == 1);
Expand All @@ -564,80 +566,83 @@ private boolean evaluateAbstractRole(EvaluatedAssignmentImpl<F> assignment, Assi
ObjectType orderOneObject;

if (evaluationOrder == 1) {
orderOneObject = roleType;
orderOneObject = targetType;
} else {
AssignmentPathSegment last = assignmentPath.last();
if (last != null && last.getSource() != null) {
orderOneObject = last.getSource();
} else {
orderOneObject = roleType;
orderOneObject = targetType;
}
}

for (AssignmentType roleInducement : roleType.getInducement()) {
if (!isApplicable(roleInducement.getFocusType(), roleType)) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Skipping application of inducement {} because the focusType does not match (specified: {}, actual: {})",
dumpAssignment(roleInducement), roleInducement.getFocusType(), roleType.getClass().getSimpleName());
if (targetType instanceof AbstractRoleType) {
for (AssignmentType roleInducement : ((AbstractRoleType)targetType).getInducement()) {
if (!isApplicable(roleInducement.getFocusType(), (AbstractRoleType)targetType)) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Skipping application of inducement {} because the focusType does not match (specified: {}, actual: {})",
dumpAssignment(roleInducement), roleInducement.getFocusType(), targetType.getClass().getSimpleName());
}
continue;
}
continue;
}
ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> roleInducementIdi = new ItemDeltaItem<>();
roleInducementIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(roleInducement));
roleInducementIdi.recompute();
AssignmentPathSegment roleAssignmentPathSegment = new AssignmentPathSegment(roleInducementIdi, null);
roleAssignmentPathSegment.setSource(roleType);
String subSourceDescription = roleType+" in "+sourceDescription;
Integer inducementOrder = roleInducement.getOrder();
if (inducementOrder == null) {
inducementOrder = 1;
}
if (inducementOrder == evaluationOrder) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("E{}: evaluate inducement({}) {} in {}",
evaluationOrder, inducementOrder, dumpAssignment(roleInducement), roleType);
ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> roleInducementIdi = new ItemDeltaItem<>();
roleInducementIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(roleInducement));
roleInducementIdi.recompute();
AssignmentPathSegment roleAssignmentPathSegment = new AssignmentPathSegment(roleInducementIdi, null);
roleAssignmentPathSegment.setSource(targetType);
String subSourceDescription = targetType+" in "+sourceDescription;
Integer inducementOrder = roleInducement.getOrder();
if (inducementOrder == null) {
inducementOrder = 1;
}
roleAssignmentPathSegment.setEvaluateConstructions(true);
roleAssignmentPathSegment.setEvaluationOrder(evaluationOrder);
roleAssignmentPathSegment.setOrderOneObject(orderOneObject);
evaluateAssignment(assignment, roleAssignmentPathSegment, evaluateOld, mode, isValid, roleType, subSourceDescription, assignmentPath, task, result);
// } else if (inducementOrder < assignmentPath.getEvaluationOrder()) {
// LOGGER.trace("Follow({}) inducement({}) in role {}",
// new Object[]{evaluationOrder, inducementOrder, source});
// roleAssignmentPathSegment.setEvaluateConstructions(false);
// roleAssignmentPathSegment.setEvaluationOrder(evaluationOrder+1);
// evaluateAssignment(assignment, roleAssignmentPathSegment, role, subSourceDescription, assignmentPath, task, result);
} else {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("E{}: NOT evaluate inducement({}) {} in {}",
evaluationOrder, inducementOrder, dumpAssignment(roleInducement), roleType);
if (inducementOrder == evaluationOrder) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("E{}: evaluate inducement({}) {} in {}",
evaluationOrder, inducementOrder, dumpAssignment(roleInducement), targetType);
}
roleAssignmentPathSegment.setEvaluateConstructions(true);
roleAssignmentPathSegment.setEvaluationOrder(evaluationOrder);
roleAssignmentPathSegment.setOrderOneObject(orderOneObject);
evaluateAssignment(assignment, roleAssignmentPathSegment, evaluateOld, mode, isValid, targetType, subSourceDescription, assignmentPath, task, result);
// } else if (inducementOrder < assignmentPath.getEvaluationOrder()) {
// LOGGER.trace("Follow({}) inducement({}) in role {}",
// new Object[]{evaluationOrder, inducementOrder, source});
// roleAssignmentPathSegment.setEvaluateConstructions(false);
// roleAssignmentPathSegment.setEvaluationOrder(evaluationOrder+1);
// evaluateAssignment(assignment, roleAssignmentPathSegment, role, subSourceDescription, assignmentPath, task, result);
} else {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("E{}: NOT evaluate inducement({}) {} in {}",
evaluationOrder, inducementOrder, dumpAssignment(roleInducement), targetType);
}
}
}
}
for (AssignmentType roleAssignment : roleType.getAssignment()) {

for (AssignmentType roleAssignment : targetType.getAssignment()) {
if (LOGGER.isTraceEnabled()) {
LOGGER.trace("E{}: follow assignment {} in {}",
evaluationOrder, dumpAssignment(roleAssignment), roleType);
evaluationOrder, dumpAssignment(roleAssignment), targetType);
}
ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> roleAssignmentIdi = new ItemDeltaItem<>();
roleAssignmentIdi.setItemOld(LensUtil.createAssignmentSingleValueContainerClone(roleAssignment));
roleAssignmentIdi.recompute();
AssignmentPathSegment roleAssignmentPathSegment = new AssignmentPathSegment(roleAssignmentIdi, null);
roleAssignmentPathSegment.setSource(roleType);
String subSourceDescription = roleType+" in "+sourceDescription;
roleAssignmentPathSegment.setSource(targetType);
String subSourceDescription = targetType+" in "+sourceDescription;
roleAssignmentPathSegment.setEvaluateConstructions(false);
roleAssignmentPathSegment.setEvaluationOrder(evaluationOrder+1);
roleAssignmentPathSegment.setOrderOneObject(orderOneObject);
evaluateAssignment(assignment, roleAssignmentPathSegment, evaluateOld, mode, isValid, roleType, subSourceDescription, assignmentPath, task, result);
evaluateAssignment(assignment, roleAssignmentPathSegment, evaluateOld, mode, isValid, targetType, subSourceDescription, assignmentPath, task, result);
}

if (evaluationOrder == 1) {
for(AuthorizationType authorizationType: roleType.getAuthorization()) {
Authorization authorization = createAuthorization(authorizationType, roleType.toString());
if (evaluationOrder == 1 && targetType instanceof AbstractRoleType) {
for(AuthorizationType authorizationType: ((AbstractRoleType)targetType).getAuthorization()) {
Authorization authorization = createAuthorization(authorizationType, targetType.toString());
assignment.addAuthorization(authorization);
}
if (roleType.getAdminGuiConfiguration() != null) {
assignment.addAdminGuiConfiguration(roleType.getAdminGuiConfiguration());
if (((AbstractRoleType)targetType).getAdminGuiConfiguration() != null) {
assignment.addAdminGuiConfiguration(((AbstractRoleType)targetType).getAdminGuiConfiguration());
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public class EvaluatedAssignmentImpl<F extends FocusType> implements EvaluatedAs

private ItemDeltaItem<PrismContainerValue<AssignmentType>,PrismContainerDefinition<AssignmentType>> assignmentIdi;
private DeltaSetTriple<Construction<F>> constructions;
private DeltaSetTriple<EvaluatedAbstractRoleImpl> roles;
private DeltaSetTriple<EvaluatedAssignmentTargetImpl> roles;
private Collection<PrismReferenceValue> orgRefVals;
private Collection<PrismReferenceValue> membershipRefVals;
private Collection<Authorization> authorizations;
Expand Down Expand Up @@ -144,11 +144,11 @@ public void addConstructionMinus(Construction<F> contruction) {
}

@Override
public DeltaSetTriple<EvaluatedAbstractRoleImpl> getRoles() {
public DeltaSetTriple<EvaluatedAssignmentTargetImpl> getRoles() {
return roles;
}

public void addRole(EvaluatedAbstractRoleImpl role, PlusMinusZero mode) {
public void addRole(EvaluatedAssignmentTargetImpl role, PlusMinusZero mode) {
roles.addToSet(mode, role);
}

Expand Down
Loading

0 comments on commit 6c10435

Please sign in to comment.