Skip to content

Commit

Permalink
Merge branch 'master' of github.com:Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Sep 4, 2018
2 parents f11eeac + d202be0 commit 30bbc56
Show file tree
Hide file tree
Showing 13 changed files with 336 additions and 45 deletions.
Expand Up @@ -9223,6 +9223,17 @@
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
<xsd:element name="condition" type="tns:ExpressionType" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
Condition driving whether this expression is evaluated at all (for given inputs).
</xsd:documentation>
<xsd:appinfo>
<a:experimental>true</a:experimental>
<a:since>3.9</a:since>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:complexType>

Expand Down
Expand Up @@ -15,35 +15,20 @@
*/
package com.evolveum.midpoint.model.common.expression.evaluator;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.Map.Entry;

import javax.xml.namespace.QName;

import com.evolveum.midpoint.common.LocalizationService;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.delta.DeltaSetTriple;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.PlusMinusZero;
import com.evolveum.midpoint.prism.delta.PrismValueDeltaSetTriple;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.polystring.PolyString;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluationContext;
import com.evolveum.midpoint.repo.common.expression.ExpressionEvaluator;
import com.evolveum.midpoint.repo.common.expression.ExpressionSyntaxException;
import com.evolveum.midpoint.repo.common.expression.ExpressionVariables;
import com.evolveum.midpoint.repo.common.expression.ItemDeltaItem;
import com.evolveum.midpoint.repo.common.expression.ObjectDeltaObject;
import com.evolveum.midpoint.repo.common.expression.Source;
import com.evolveum.midpoint.repo.common.expression.SourceTriple;
import com.evolveum.midpoint.repo.common.expression.*;
import com.evolveum.midpoint.schema.constants.ExpressionConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ExceptionUtil;
Expand Down Expand Up @@ -350,6 +335,14 @@ private PrismValueDeltaSetTriple<V> evaluateRelativeExpression(final List<Source

final PrismValueDeltaSetTriple<V> outputTriple = new PrismValueDeltaSetTriple<>();

Expression<PrismPropertyValue<Boolean>, PrismPropertyDefinition<Boolean>> conditionExpression;
if (expressionEvaluatorType.getCondition() != null) {
conditionExpression = ExpressionUtil.createCondition(expressionEvaluatorType.getCondition(),
evaluationContext.getExpressionFactory(), "condition in " + contextDescription, task, result);
} else {
conditionExpression = null;
}

Processor<Collection<? extends PrismValue>> processor = pvalues -> {
if (includeNulls != null && !includeNulls && MiscUtil.isAllNull(pvalues)) {
// The case that all the sources are null. There is no point executing the expression.
Expand Down Expand Up @@ -426,8 +419,22 @@ private PrismValueDeltaSetTriple<V> evaluateRelativeExpression(final List<Source

List<V> scriptResults;
try {
scriptResults = transformSingleValue(scriptVariables, valueDestination, useNew, evaluationContext,
contextDescription, task, result);
boolean conditionResult;
if (conditionExpression != null) {
ExpressionEvaluationContext ctx = new ExpressionEvaluationContext(null, scriptVariables,
"condition in " + contextDescription, task, result);
PrismValueDeltaSetTriple<PrismPropertyValue<Boolean>> triple = conditionExpression.evaluate(ctx);
conditionResult = ExpressionUtil.computeConditionResult(triple.getNonNegativeValues());
} else {
conditionResult = true;
}
if (conditionResult) {
scriptResults = transformSingleValue(scriptVariables, valueDestination, useNew, evaluationContext,
contextDescription, task, result);
} else {
LOGGER.trace("Skipping value transformation because condition evaluated to false in {}", contextDescription);
scriptResults = Collections.emptyList();
}
} catch (ExpressionEvaluationException e) {
throw new TunnelException(
localizationService.translate(
Expand Down
Expand Up @@ -815,7 +815,7 @@ private XMLGregorianCalendar parseTimeSource(VariableBindingDefinitionType sourc
throw new SchemaException("Empty source path in "+getMappingContextDescription());
}

Object sourceObject = ExpressionUtil.resolvePath(path, variables, sourceContext, objectResolver, "reference time definition in "+getMappingContextDescription(), task, result);
Object sourceObject = ExpressionUtil.resolvePath(path, variables, false, sourceContext, objectResolver, "reference time definition in "+getMappingContextDescription(), task, result);
if (sourceObject == null) {
return null;
}
Expand Down Expand Up @@ -871,7 +871,7 @@ private <IV extends PrismValue, ID extends ItemDefinition> Source<IV,ID> parseSo
name = ItemPath.getName(path.last());
}
ItemPath resolvePath = path;
Object sourceObject = ExpressionUtil.resolvePath(path, variables, sourceContext, objectResolver, "source definition in "+getMappingContextDescription(), task, result);
Object sourceObject = ExpressionUtil.resolvePath(path, variables, true, sourceContext, objectResolver, "source definition in "+getMappingContextDescription(), task, result);
Item<IV,ID> itemOld = null;
ItemDelta<IV,ID> delta = null;
Item<IV,ID> itemNew = null;
Expand Down
Expand Up @@ -206,7 +206,7 @@ private <T> T resolvePath(String path, ExpressionVariables variables, final Stri
ItemPath itemPath = toItemPath(path);

// WHEN
Object resolved = ExpressionUtil.resolvePath(itemPath, variables, null, null, TEST_NAME, null, result);
Object resolved = ExpressionUtil.resolvePath(itemPath, variables, false, null, null, TEST_NAME, null, result);

// THEN
System.out.println("Resolved:");
Expand Down
Expand Up @@ -120,7 +120,7 @@ private static Object variableFromPathExpression(HashMap<String, Object> resulti
throw new IllegalArgumentException("Path expression: expected ItemPathType but got " + expressionEvaluator.getValue());
}
ItemPath itemPath = ((ItemPathType) expressionEvaluator.getValue()).getItemPath();
return ExpressionUtil.resolvePath(itemPath, createVariables(resultingVariables), null, ctx.objectResolver, shortDesc, ctx.task, result);
return ExpressionUtil.resolvePath(itemPath, createVariables(resultingVariables), false, null, ctx.objectResolver, shortDesc, ctx.task, result);
}

private static ExpressionVariables createVariables(HashMap<String, Object> variableMap) {
Expand Down
Expand Up @@ -102,6 +102,9 @@ public class AbstractConfiguredModelIntegrationTest extends AbstractModelIntegra
protected static final String USER_TEMPLATE_ORG_ASSIGNMENT_FILENAME = COMMON_DIR + "/user-template-org-assignment.xml";
protected static final String USER_TEMPLATE_ORG_ASSIGNMENT_OID = "10000000-0000-0000-0000-000000000444";

protected static final String USER_TEMPLATE_CARTHESIAN_FILENAME = COMMON_DIR + "/user-template-carthesian.xml";
protected static final String USER_TEMPLATE_CARTHESIAN_OID = "8e47c2b2-dde6-44a9-a7c0-de21a14cb70d";

protected static final File OBJECT_TEMPLATE_PERSONA_ADMIN_FILE = new File(COMMON_DIR, "object-template-persona-admin.xml");
protected static final String OBJECT_TEMPLATE_PERSONA_ADMIN_OID = "894ea1a8-2c0a-11e7-a950-ff2047b0c053";

Expand Down
Expand Up @@ -216,6 +216,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
repoAddObjectFromFile(USER_TEMPLATE_INBOUNDS_FILENAME, initResult);
repoAddObjectFromFile(USER_TEMPLATE_COMPLEX_INCLUDE_FILENAME, initResult);
repoAddObjectFromFile(USER_TEMPLATE_ORG_ASSIGNMENT_FILENAME, initResult);
repoAddObjectFromFile(USER_TEMPLATE_CARTHESIAN_FILENAME, initResult);

// Shadows
repoAddObjectFromFile(ACCOUNT_SHADOW_GUYBRUSH_DUMMY_FILE, initResult);
Expand Down
Expand Up @@ -24,6 +24,11 @@

import javax.xml.datatype.XMLGregorianCalendar;

import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.springframework.test.annotation.DirtiesContext;
import org.springframework.test.annotation.DirtiesContext.ClassMode;
import org.springframework.test.context.ContextConfiguration;
Expand Down Expand Up @@ -60,14 +65,6 @@
import com.evolveum.midpoint.util.exception.PolicyViolationException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SecurityViolationException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType;

/**
* @author semancik
Expand Down Expand Up @@ -133,8 +130,9 @@ public class TestMapping extends AbstractMappingTest {
protected static final String DRINK_GRAPPA = "grappa";
protected static final String DRINK_GIN = "gin";
protected static final String DRINK_MEZCAL = "mezcal";


private static final String USER_JIM_NAME = "jim";
private static final String USER_TYPE_CARTHESIAN = "carthesian";

@Override
public void initSystem(Task initTask, OperationResult initResult) throws Exception {
Expand All @@ -155,6 +153,8 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti
repoAddObjectFromFile(ROLE_COBALT_NEVERLAND_FILE, initResult);

assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL);

setDefaultObjectTemplate(UserType.COMPLEX_TYPE, USER_TYPE_CARTHESIAN, USER_TEMPLATE_CARTHESIAN_OID, initResult);
}

/**
Expand Down Expand Up @@ -3441,6 +3441,97 @@ public void test427UnassignAccountFromJack() throws Exception {
assertLinks(userAfter, 0);
}

/**
* MID-4862
*/
@Test
public void test500AssignmentsCombinationSingle() throws Exception {
final String TEST_NAME = "test500AssignmentsCombinationSingle";
displayTestTitle(TEST_NAME);

// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();

UserType jim = prismContext.createKnownObjectable(UserType.class)
.name(USER_JIM_NAME)
.subtype(USER_TYPE_CARTHESIAN)
.beginAssignment()
.targetRef(ROLE_SUPERUSER_OID, RoleType.COMPLEX_TYPE)
.end();

// WHEN
displayWhen(TEST_NAME);
addObject(jim.asPrismObject());

// THEN
displayThen(TEST_NAME);

PrismObject<UserType> userAfter = getUser(jim.getOid());
display("User after", userAfter);
assertAssignments(userAfter, 1);
}

/**
* MID-4862
*/
@Test
public void test510AssignmentsCombinationCouple() throws Exception {
final String TEST_NAME = "test500AssignmentsCombinationCouple";
displayTestTitle(TEST_NAME);

// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();

PrismObject<UserType> jim = findUserByUsername(USER_JIM_NAME);

// WHEN
displayWhen(TEST_NAME);
assignOrg(jim.getOid(), ORG_SAVE_ELAINE_OID, task, result);

// THEN
displayThen(TEST_NAME);
assertSuccess(result);

PrismObject<UserType> userAfter = getUser(jim.getOid());
display("User after", userAfter);
assertAssignments(userAfter, 3);
}

/**
* MID-4863
*/
@Test
public void test520DeleteUserAssignment() throws Exception {
final String TEST_NAME = "test520DeleteUserAssignment";
displayTestTitle(TEST_NAME);

// GIVEN
Task task = createTask(TEST_NAME);
OperationResult result = task.getResult();

PrismObject<UserType> jim = findUserByUsername(USER_JIM_NAME);

// WHEN
displayWhen(TEST_NAME);
AssignmentType orgAssignment = findAssignment(jim, ORG_SAVE_ELAINE_OID, SchemaConstants.ORG_DEFAULT);
assertNotNull("org assignment not found", orgAssignment);
PrismContainerValue<Containerable> orgAssignmentPcv = new PrismContainerValue<>(prismContext);
orgAssignmentPcv.setId(orgAssignment.getId());
ObjectDelta<UserType> delta = DeltaBuilder.deltaFor(UserType.class, prismContext)
.item(UserType.F_ASSIGNMENT).delete(orgAssignmentPcv)
.asObjectDeltaCast(jim.getOid());
executeChanges(delta, null, task, result);

// THEN
displayThen(TEST_NAME);
assertSuccess(result);

PrismObject<UserType> userAfter = getUser(jim.getOid());
display("User after", userAfter);
assertAssignments(userAfter, 1);
}

private String rumFrom(String locality) {
return "rum from " + locality;
Expand Down

0 comments on commit 30bbc56

Please sign in to comment.