From 05e90d13a815ac881a9ea1f393593cf3aadf0465 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 26 May 2020 09:48:11 +0200 Subject: [PATCH 1/9] Do minor improvements in linked objects 1) New names for midpoint.getLinkedSources/Targets methods. 2) Correct policy rule for "user delete" situation. 3) bulk action spec + updated spec A part of MID-6109 implementation. --- .../xml/ns/public/common/common-core-3.xsd | 2 +- .../xml/ns/public/common/common-policy-3.xsd | 55 +++++++++++++-- .../impl/expr/LinkedObjectsFunctions.java | 12 ++-- .../impl/expr/MidpointFunctionsImpl.java | 17 +++-- .../midpoint/model/impl/lens/Clockwork.java | 2 +- .../projector/focus/AssignmentProcessor.java | 2 +- .../LinkSourceFinder.java | 24 ++++--- .../LinkTargetFinder.java | 2 +- .../PolicyRuleScriptExecutor.java | 17 ++++- .../model/intest/TestLinkedObjects.java | 68 +++++++++++++++++++ .../resources/linked/archetype-device.xml | 36 +++++----- .../test/resources/linked/archetype-token.xml | 4 +- .../resources/linked/system-configuration.xml | 30 +++++++- .../test/resources/linked/template-device.xml | 4 +- .../test/resources/linked/template-user.xml | 2 +- 15 files changed, 219 insertions(+), 58 deletions(-) rename model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/{ => scriptExecutor}/LinkSourceFinder.java (81%) rename model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/{ => scriptExecutor}/LinkTargetFinder.java (99%) rename model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/{ => scriptExecutor}/PolicyRuleScriptExecutor.java (91%) diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 5c9a787d5b2..908dda5b2f7 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -13649,7 +13649,7 @@

- Definition of object with respect to its archetype. + Archetype of the object to select.

diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd index f9605be9933..8e12427bab0 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd @@ -2588,6 +2588,15 @@
+ + + +

+ Current object. This is the default if nothing is specified. +

+
+
+
@@ -2598,7 +2607,7 @@ - +

@@ -2612,10 +2621,10 @@ - + - Selects objects among link targets (for this object). + Selects objects among linked ones (for this object). EXPERIMENTAL @@ -2635,6 +2644,44 @@ + + + + + + + + + + Selects objects among linked sources (for this object). + EXPERIMENTAL + + + + 4.2 + true + + + + + + + + + + + Selects objects among link targets (for this object). + EXPERIMENTAL + + + + 4.2 + true + + + + + @@ -2729,7 +2776,7 @@ - Link matches if it exists in the "old" state (i.e. it existence went from true to any). + Link matches if it exists in the "old" state (i.e. it existence went from true to any). diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/LinkedObjectsFunctions.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/LinkedObjectsFunctions.java index bfaed307d8b..7c623be9418 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/LinkedObjectsFunctions.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/LinkedObjectsFunctions.java @@ -48,12 +48,12 @@ public class LinkedObjectsFunctions { @Autowired private RelationRegistry relationRegistry; @Autowired private MidpointFunctionsImpl midpointFunctions; - T findAssignee(Class type) throws CommunicationException, ObjectNotFoundException, + T findLinkedSource(Class type) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { - return MiscUtil.extractSingleton(findAssignees(type), () -> new IllegalStateException("More than one assignee found")); + return MiscUtil.extractSingleton(findLinkedSources(type), () -> new IllegalStateException("More than one assignee found")); } - List findAssignees(Class type) throws CommunicationException, + List findLinkedSources(Class type) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { ObjectQuery query = prismContext.queryFor(type) @@ -64,17 +64,17 @@ List findAssignees(Class type) throws Com } // Should be used after assignment evaluation! - T findAssignedObject(Class type, String archetypeOid) throws CommunicationException, + T findLinkedTarget(Class type, String archetypeOid) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { - return MiscUtil.extractSingleton(findAssignedObjects(type, archetypeOid), + return MiscUtil.extractSingleton(findLinkedTargets(type, archetypeOid), () -> new IllegalStateException("More than one assigned object found")); } // Should be used after assignment evaluation! @Experimental @NotNull - List findAssignedObjects(Class type, String archetypeOid) + List findLinkedTargets(Class type, String archetypeOid) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { Set membership = getMembership(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index e79e99c8d34..6d701bff7ee 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -89,7 +89,6 @@ import com.evolveum.midpoint.task.api.TaskManager; import com.evolveum.midpoint.util.Holder; import com.evolveum.midpoint.util.LocalizableMessage; -import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.Producer; import com.evolveum.midpoint.util.annotation.Experimental; import com.evolveum.midpoint.util.exception.*; @@ -1989,33 +1988,33 @@ public ResourceAttributeDefinition getAttributeDefinition(PrismObject T findAssignee(Class type) throws CommunicationException, ObjectNotFoundException, + public T findLinkedSource(Class type) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { - return linkedObjectsFunctions.findAssignee(type); + return linkedObjectsFunctions.findLinkedSource(type); } @Experimental - public List findAssignees(Class type) throws CommunicationException, + public List findLinkedSources(Class type) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { - return linkedObjectsFunctions.findAssignees(type); + return linkedObjectsFunctions.findLinkedSources(type); } // Should be used after assignment evaluation! @Experimental - public T findAssignedObject(Class type, String archetypeOid) + public T findLinkedTarget(Class type, String archetypeOid) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { - return linkedObjectsFunctions.findAssignedObject(type, archetypeOid); + return linkedObjectsFunctions.findLinkedTarget(type, archetypeOid); } // Should be used after assignment evaluation! @Experimental @NotNull - public List findAssignedObjects(Class type, String archetypeOid) + public List findLinkedTargets(Class type, String archetypeOid) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { - return linkedObjectsFunctions.findAssignedObjects(type, archetypeOid); + return linkedObjectsFunctions.findLinkedTargets(type, archetypeOid); } @Experimental diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index 3b0d4377f3d..f02c218c9ee 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -38,7 +38,7 @@ import com.evolveum.midpoint.model.impl.lens.projector.ContextLoader; import com.evolveum.midpoint.model.impl.lens.projector.Projector; import com.evolveum.midpoint.model.impl.lens.projector.focus.FocusConstraintsChecker; -import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyRuleScriptExecutor; +import com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor.PolicyRuleScriptExecutor; import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyRuleSuspendTaskExecutor; import com.evolveum.midpoint.model.impl.migrator.Migrator; import com.evolveum.midpoint.model.impl.sync.RecomputeTaskHandler; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java index 9c65c578648..f1f228909f7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java @@ -656,7 +656,7 @@ private void evaluateConstructions(LensContext< } /** - * Simply mark all projections as illegal - except those that are being unliked + * Simply mark all projections as illegal - except those that are being unlinked */ private void processFocusDelete(LensContext context, OperationResult result) { for (LensProjectionContext projectionContext: context.getProjectionContexts()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/LinkSourceFinder.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/LinkSourceFinder.java similarity index 81% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/LinkSourceFinder.java rename to model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/LinkSourceFinder.java index abc28664fdf..ad515c7cd35 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/LinkSourceFinder.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/LinkSourceFinder.java @@ -5,12 +5,13 @@ * and European Union Public License. See LICENSE file for details. */ -package com.evolveum.midpoint.model.impl.lens.projector.policy; +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LinkSourceObjectSelectorType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.jetbrains.annotations.NotNull; @@ -23,7 +24,8 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectSelectorType; + +import javax.xml.namespace.QName; /** * Finds link sources based on a collection of selectors. @@ -52,12 +54,12 @@ class LinkSourceFinder implements AutoCloseable { this.result = parentResult.createMinorSubresult(OP_GET_SOURCES); } - List> getSources(List sourceSelectors) throws SchemaException, + List> getSources(List sourceSelectors) throws SchemaException, ConfigurationException, ObjectNotFoundException, CommunicationException, SecurityViolationException, ExpressionEvaluationException { try { List> allSources = getAllSources(context.getFocusContextRequired().getOid()); - //noinspection unchecked + // noinspection unchecked return (List) filterObjects(allSources, sourceSelectors); } catch (Throwable t) { result.recordFatalError(t); @@ -79,29 +81,35 @@ private List> getAllSources(String f } } - private List> filterObjects(List> objects, List selectors) + private List> filterObjects(List> objects, List selectors) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { List> all = new ArrayList<>(); - for (ObjectSelectorType selector : selectors) { + for (LinkSourceObjectSelectorType selector : selectors) { all.addAll(filterObjects(objects, selector)); } return all; } - private List> filterObjects(List> objects, ObjectSelectorType selector) + private List> filterObjects(List> objects, LinkSourceObjectSelectorType selector) throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, ExpressionEvaluationException { List> matching = new ArrayList<>(); for (PrismObject object : objects) { if (beans.repositoryService.selectorMatches(selector, object, - null, LOGGER, "script object evaluation")) { + null, LOGGER, "script object evaluation") && + relationMatches(object, selector.getRelation())) { matching.add(object); } } return matching; } + private boolean relationMatches(PrismObject linkSource, List relations) { + return relations.isEmpty() || linkSource.asObjectable().getRoleInfluenceRef().stream() + .anyMatch(ref -> beans.prismContext.relationMatches(relations, ref.getRelation())); + } + @Override public void close() { result.computeStatusIfUnknown(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/LinkTargetFinder.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/LinkTargetFinder.java similarity index 99% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/LinkTargetFinder.java rename to model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/LinkTargetFinder.java index 63a842b8777..f6e87728e4e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/LinkTargetFinder.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/LinkTargetFinder.java @@ -5,7 +5,7 @@ * and European Union Public License. See LICENSE file for details. */ -package com.evolveum.midpoint.model.impl.lens.projector.policy; +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; import static java.util.Collections.emptySet; import static org.apache.commons.lang3.BooleanUtils.isTrue; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleScriptExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java similarity index 91% rename from model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleScriptExecutor.java rename to model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java index 13e0f5f6730..92f0734211f 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleScriptExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java @@ -1,10 +1,10 @@ /* - * Copyright (c) 2010-2019 Evolveum and contributors + * Copyright (c) 2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. */ -package com.evolveum.midpoint.model.impl.lens.projector.policy; +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; import java.util.*; @@ -124,6 +124,12 @@ private ValueListType createScriptInput(ScriptExecutionPolicyActionType action, return createInput(MiscUtil.singletonOrEmptyList(focusContext.getObjectAny())); } else { Map> objectsMap = new HashMap<>(); // using OID-keyed map to avoid duplicates + if (object.getCurrentObject() != null) { + PrismObject current = focusContext.getObjectAny(); + if (matches(current, object.getCurrentObject())) { + objectsMap.put(current.getOid(), current); + } + } if (!object.getLinkTarget().isEmpty()) { try (LinkTargetFinder targetFinder = new LinkTargetFinder(this, context, rule, result)) { for (LinkTargetObjectSelectorType linkTargetSelector : object.getLinkTarget()) { @@ -140,6 +146,13 @@ private ValueListType createScriptInput(ScriptExecutionPolicyActionType action, } } + private boolean matches(PrismObject object, ObjectSelectorType selector) throws CommunicationException, + ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, + ExpressionEvaluationException { + //noinspection unchecked + return repositoryService.selectorMatches(selector, (PrismObject) object, null, LOGGER, "current object"); + } + private void addObjects(Map> objectsMap, List> objects) { objects.forEach(o -> objectsMap.put(o.getOid(), o)); } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLinkedObjects.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLinkedObjects.java index 345d01fab56..15dbada9483 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLinkedObjects.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLinkedObjects.java @@ -364,6 +364,74 @@ public void test240UnassignSwordFromCubby() throws Exception { .assertDescription("Not used"); } + /** + * Assign sword to cubby again. + */ + @Test + public void test250AssignSwordToCubbyAgain() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = task.getResult(); + + when(); + assign(USER_CUBBY, SERVICE_SWORD, SchemaConstants.ORG_DEFAULT, null, task, result); + + then(); + assertSuccess(result); + + assertUserAfter(USER_CUBBY.oid) + .assertFullName("Little Cubby Gummi") + .assertOrganizations("wooden-sword users"); + + assertServiceAfter(SERVICE_SWORD.oid) + .assertDescription("Used by cubby (Little Cubby Gummi)"); + } + + /** + * Delete cubby (sigh). + */ + @Test + public void test260DeleteCubby() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = task.getResult(); + + when(); + deleteObject(UserType.class, USER_CUBBY.oid, task, result); + + then(); + assertSuccess(result); + + assertServiceAfter(SERVICE_SWORD.oid) + .assertDescription("Not used"); + } + + /** + * Add cubby but with sword. + */ + @Test + public void test270AddCubbyWithSword() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = task.getResult(); + + when(); + addObject(USER_CUBBY.file, task, result, cubby -> + ((UserType) cubby.asObjectable()) + .beginAssignment().targetRef(SERVICE_SWORD.oid, ServiceType.COMPLEX_TYPE) + ); + + then(); + assertSuccess(result); + + assertUserAfter(USER_CUBBY.oid) + .assertFullName("Cubby Gummi") + .assertOrganizations("wooden-sword users"); + + assertServiceAfter(SERVICE_SWORD.oid) + .assertDescription("Used by cubby (Cubby Gummi)"); + } + /** * Whistle is held by test user since creation - to check on the ordering of assignments. * (Whistle first, User second). TEMPORARY diff --git a/model/model-intest/src/test/resources/linked/archetype-device.xml b/model/model-intest/src/test/resources/linked/archetype-device.xml index 2549e2107b5..1e85ee48294 100644 --- a/model/model-intest/src/test/resources/linked/archetype-device.xml +++ b/model/model-intest/src/test/resources/linked/archetype-device.xml @@ -62,18 +62,22 @@ - recompute-device-on-membership-change - - Recomputes all devices whose membership has changed. - + recompute-device-on-user-name-change + Recomputes a device when user's name or fullName changes. - + + + name + + + fullName + + - changed true @@ -84,27 +88,23 @@ - 2 + 2 - recompute-device-on-user-name-change - Recomputes a device when user's name or fullName changes. + recompute-device-on-membership-change + + Recomputes all devices whose membership has changed. + - - - name - - - fullName - - + + changed true @@ -115,6 +115,6 @@ - 2 + 2 diff --git a/model/model-intest/src/test/resources/linked/archetype-token.xml b/model/model-intest/src/test/resources/linked/archetype-token.xml index d1bb6fa0309..e261fada8f0 100644 --- a/model/model-intest/src/test/resources/linked/archetype-token.xml +++ b/model/model-intest/src/test/resources/linked/archetype-token.xml @@ -65,8 +65,8 @@ diff --git a/model/model-intest/src/test/resources/linked/system-configuration.xml b/model/model-intest/src/test/resources/linked/system-configuration.xml index b98b2d3515c..6346c3f5360 100644 --- a/model/model-intest/src/test/resources/linked/system-configuration.xml +++ b/model/model-intest/src/test/resources/linked/system-configuration.xml @@ -15,11 +15,37 @@ keep the situation close to the reality.) --> - + SystemConfiguration UserType + + + + UserType + + + + + delete + + + + + + + changed + + + + + + + + + diff --git a/model/model-intest/src/test/resources/linked/template-device.xml b/model/model-intest/src/test/resources/linked/template-device.xml index e2112c4f92b..7876f793995 100644 --- a/model/model-intest/src/test/resources/linked/template-device.xml +++ b/model/model-intest/src/test/resources/linked/template-device.xml @@ -17,8 +17,8 @@ diff --git a/model/model-intest/src/test/resources/linked/template-user.xml b/model/model-intest/src/test/resources/linked/template-user.xml index 9d8d353a1c7..0824bbd7ac1 100644 --- a/model/model-intest/src/test/resources/linked/template-user.xml +++ b/model/model-intest/src/test/resources/linked/template-user.xml @@ -20,7 +20,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType ARCHETYPE_DEVICE_OID = 'd6d90e2c-ad25-4f7f-a0e1-2f5fac03b402' - devices = midpoint.findAssignedObjects(ServiceType.class, ARCHETYPE_DEVICE_OID) + devices = midpoint.findLinkedTargets(ServiceType.class, ARCHETYPE_DEVICE_OID) devices.collect { basic.stringify(it.name) + ' users' } From 63181a6df0d67a31794a66692539386a984d1dc8 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 26 May 2020 10:40:24 +0200 Subject: [PATCH 2/9] testing/rest classes cleanup/reformat --- .../testing/rest/RestServiceInitializer.java | 24 +++---------------- .../testing/rest/TestAbstractRestService.java | 3 +-- .../testing/rest/TestRestServiceJson.java | 4 +--- .../testing/rest/TestRestServiceJsonSecQ.java | 23 ++++++++---------- 4 files changed, 15 insertions(+), 39 deletions(-) diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java index 5be109cd4d2..f7360c8da44 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -9,7 +9,7 @@ import static org.testng.AssertJUnit.assertEquals; import java.io.File; -import java.util.Arrays; +import java.util.Collections; import javax.ws.rs.core.Response; import org.apache.cxf.jaxrs.client.ClientConfiguration; @@ -137,9 +137,6 @@ public void initSystem(Task initTask, OperationResult result) throws Exception { PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, result); - // TODO remove in 2021 - this should be covered in super.super.initSystem(...) -// dummyAuditService = DummyAuditService.getInstance(); - InternalMonitor.reset(); getModelService().postInit(result); @@ -148,8 +145,7 @@ public void initSystem(Task initTask, OperationResult result) throws Exception { } protected WebClient prepareClient(String username, String password) { - - WebClient client = WebClient.create(ENDPOINT_ADDRESS, Arrays.asList(getProvider())); + WebClient client = WebClient.create(ENDPOINT_ADDRESS, Collections.singletonList(getProvider())); ClientConfiguration clientConfig = WebClient.getConfig(client); clientConfig.getRequestContext().put(LocalConduit.DIRECT_DISPATCH, Boolean.TRUE); @@ -159,7 +155,6 @@ protected WebClient prepareClient(String username, String password) { createAuthorizationHeader(client, username, password); return client; - } protected void createAuthorizationHeader(WebClient client, String username, String password) { @@ -194,17 +189,4 @@ public ProvisioningService getProvisioning() { public DummyAuditService getDummyAuditService() { return dummyAuditService; } - - public MidpointXmlProvider getXmlProvider() { - return xmlProvider; - } - - public MidpointJsonProvider getJsonProvider() { - return jsonProvider; - } - - public MidpointYamlProvider getYamlProvider() { - return yamlProvider; - } - } diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java index eff71c0d3dc..e6ff3ea2619 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2018 Evolveum and contributors + * Copyright (c) 2013-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -48,7 +48,6 @@ public abstract class TestAbstractRestService extends RestServiceInitializer { - // protected static final File BASE_DIR = new File("src/test/resources"); protected static final File BASE_REQ_DIR = new File("src/test/resources/req/"); // REST, reader and adder authorization diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJson.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJson.java index ee1e0bc1df4..94abd7134c1 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJson.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJson.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013-2017 Evolveum and contributors + * Copyright (c) 2013-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -24,7 +24,6 @@ protected String getContentType() { return MediaType.APPLICATION_JSON; } - @Override protected File getRepoFile(String fileBaseName) { return new File(BASE_REPO_DIR + "/json", fileBaseName + ".json"); @@ -39,5 +38,4 @@ protected File getRequestFile(String fileBaseName) { protected MidpointAbstractProvider getProvider() { return jsonProvider; } - } diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJsonSecQ.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJsonSecQ.java index 5fe2c07ee2a..edf9cbcdda5 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJsonSecQ.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestRestServiceJsonSecQ.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2010-2017 Evolveum and contributors + * Copyright (c) 2010-2020 Evolveum and contributors * * This work is dual-licensed under the Apache License 2.0 * and European Union Public License. See LICENSE file for details. @@ -9,29 +9,26 @@ import org.apache.cxf.jaxrs.client.WebClient; -public class TestRestServiceJsonSecQ extends TestRestServiceJson{ - +public class TestRestServiceJsonSecQ extends TestRestServiceJson { @Override protected void createAuthorizationHeader(WebClient client, String username, String password) { - if (username == null) { return; } String authzHeader = "{" - + "\"user\" : \""+ username +"\"," + + "\"user\" : \"" + username + "\"," + "\"answer\" : [" - + "{ " - + "\"qid\" : \"http://midpoint.evolveum.com/xml/ns/public/security/question-2#q001\"," - + "\"qans\" : \"" + (password == null ? "" : password) + "\"" - + "}" + + "{ " + + "\"qid\" : \"http://midpoint.evolveum.com/xml/ns/public/security/question-2#q001\"," + + "\"qans\" : \"" + (password == null ? "" : password) + "\"" + + "}" + "]" + "}"; - String authorizationHeader = "SecQ " - + org.apache.cxf.common.util.Base64Utility.encode((authzHeader).getBytes()); - client.header("Authorization", authorizationHeader); - + String authorizationHeader = "SecQ " + + org.apache.cxf.common.util.Base64Utility.encode((authzHeader).getBytes()); + client.header("Authorization", authorizationHeader); } } From 0b92fce690dc0935c2eac7d4faaefd9936b52731 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 26 May 2020 10:41:10 +0200 Subject: [PATCH 3/9] testing/rest security-policy*.xml typo fix, minor reformat --- .../src/test/resources/repo/security-policy-no-history.xml | 6 +++--- testing/rest/src/test/resources/repo/security-policy.xml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/testing/rest/src/test/resources/repo/security-policy-no-history.xml b/testing/rest/src/test/resources/repo/security-policy-no-history.xml index 26904213ae8..45aeef7cf4a 100644 --- a/testing/rest/src/test/resources/repo/security-policy-no-history.xml +++ b/testing/rest/src/test/resources/repo/security-policy-no-history.xml @@ -1,13 +1,13 @@ + xmlns='http://midpoint.evolveum.com/xml/ns/public/common/common-3'> Security Policy @@ -96,7 +96,7 @@ http://midpoint.evolveum.com/xml/ns/public/security/question-2#q002 - What is your mother's best friend's uncle's grandaughter's dog's mother maiden name? + What is your mother's best friend's uncle's granddaughter's dog's mother maiden name? http://midpoint.evolveum.com/xml/ns/public/security/question-2#q003 diff --git a/testing/rest/src/test/resources/repo/security-policy.xml b/testing/rest/src/test/resources/repo/security-policy.xml index c1424d6feec..ac4dc12dcc4 100644 --- a/testing/rest/src/test/resources/repo/security-policy.xml +++ b/testing/rest/src/test/resources/repo/security-policy.xml @@ -1,13 +1,13 @@ + xmlns='http://midpoint.evolveum.com/xml/ns/public/common/common-3'> Security Policy @@ -99,7 +99,7 @@ http://midpoint.evolveum.com/xml/ns/public/security/question-2#q002 - What is your mother's best friend's uncle's grandaughter's dog's mother maiden name? + What is your mother's best friend's uncle's granddaughter's dog's mother maiden name? http://midpoint.evolveum.com/xml/ns/public/security/question-2#q003 From 1df8ae8248d60d8de0505a4401aaa4bd71bd7ea1 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 26 May 2020 10:43:03 +0200 Subject: [PATCH 4/9] testing/rest spring+logback XML cleanup --- .../src/test/resources/ctx-rest-test-main.xml | 22 +++--------- .../rest/src/test/resources/ctx-rest-test.xml | 33 ++++++----------- .../rest/src/test/resources/logback-test.xml | 36 +++++++++---------- 3 files changed, 31 insertions(+), 60 deletions(-) diff --git a/testing/rest/src/test/resources/ctx-rest-test-main.xml b/testing/rest/src/test/resources/ctx-rest-test-main.xml index 9523d9902c6..7df9c260810 100644 --- a/testing/rest/src/test/resources/ctx-rest-test-main.xml +++ b/testing/rest/src/test/resources/ctx-rest-test-main.xml @@ -7,24 +7,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/testing/rest/src/test/resources/ctx-rest-test.xml b/testing/rest/src/test/resources/ctx-rest-test.xml index 8efdfc64687..00086179725 100644 --- a/testing/rest/src/test/resources/ctx-rest-test.xml +++ b/testing/rest/src/test/resources/ctx-rest-test.xml @@ -1,32 +1,19 @@ - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> + + diff --git a/testing/rest/src/test/resources/logback-test.xml b/testing/rest/src/test/resources/logback-test.xml index b6617d3b40c..767227a4f09 100644 --- a/testing/rest/src/test/resources/logback-test.xml +++ b/testing/rest/src/test/resources/logback-test.xml @@ -1,6 +1,6 @@ - + - - - + + + - + - + - - - - + + + + - + From 9c6a5ba54907bfc0fead874933b642c3477da379 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 26 May 2020 12:23:33 +0200 Subject: [PATCH 5/9] Add extension to ModelExecuteOptionsType This is to allow custom options e.g. for turning off/on linked objects recomputation. A part of MID-6109 implementation. --- .../midpoint/gui/api/page/PageBase.java | 4 + .../gui/api/util/WebComponentUtil.java | 2 +- .../midpoint/init/InitialDataImport.java | 2 +- .../midpoint/init/PostInitialDataImport.java | 2 +- .../web/component/progress/ProgressPanel.java | 15 +- .../util/FocusListInlineMenuHelper.java | 2 +- .../component/wizard/resource/NameStep.java | 2 +- .../web/page/admin/PageAdminFocus.java | 2 +- .../page/admin/PageAdminObjectDetails.java | 2 +- .../web/page/admin/cases/PageCases.java | 2 +- .../certification/PageCertDefinition.java | 4 +- .../admin/configuration/PageDebugList.java | 2 +- .../admin/configuration/PageDebugView.java | 11 +- .../admin/configuration/PageImportObject.java | 730 +++++++++--------- .../ResourceContentRepositoryPanel.java | 2 +- .../web/page/admin/users/PageUsers.java | 6 +- .../component/ExecuteChangeOptionsDto.java | 14 +- .../admin/users/component/TreeTablePanel.java | 4 +- .../web/page/login/PageSelfRegistration.java | 2 +- .../web/page/self/PageAssignmentsList.java | 8 +- .../TestIntegrationObjectWrapperFactory.java | 2 +- .../midpoint/gui/TestPageAccount.java | 2 +- .../evolveum/midpoint/gui/TestPageOrg.java | 2 +- .../evolveum/midpoint/gui/TestPageRole.java | 2 +- .../gui/TestPageSystemConfiguration.java | 2 +- .../evolveum/midpoint/gui/TestPageUser.java | 2 +- .../midpoint/gui/TestWrapperDelta.java | 2 +- .../midpoint/prism/PrismContainer.java | 3 +- .../prism/impl/PrismContainerImpl.java | 6 + .../prism/impl/item/DummyContainerImpl.java | 5 + .../xml/ns/public/common/common-core-3.xsd | 41 + .../impl/AccCertUpdateHelper.java | 4 +- .../TestPolicyDrivenRoleLifecycle.java | 5 +- .../model/api/ModelExecuteOptions.java | 664 +++++----------- .../midpoint/model/impl/ModelCrudService.java | 2 +- .../controller/ExecuteDeltasTaskHandler.java | 6 +- .../ModelInteractionServiceImpl.java | 2 +- .../model/impl/controller/ObjectMerger.java | 4 +- .../impl/expr/MidpointFunctionsImpl.java | 11 +- .../model/impl/importer/ObjectImporter.java | 8 +- .../midpoint/model/impl/lens/Clockwork.java | 2 +- .../impl/lens/ClockworkConflictResolver.java | 8 +- .../midpoint/model/impl/lens/LensContext.java | 5 +- .../scripting/actions/RecomputeExecutor.java | 2 +- .../scripting/helpers/OperationsHelper.java | 6 +- .../sync/FocusValidityScannerTaskHandler.java | 2 +- .../model/impl/sync/RecomputeTaskHandler.java | 2 +- .../impl/sync/SynchronizationServiceImpl.java | 6 +- .../impl/trigger/RecomputeTriggerHandler.java | 11 +- ...stractSearchIterativeModelTaskHandler.java | 317 ++++---- .../model/impl/util/DeleteTaskHandler.java | 2 +- .../model/impl/util/ModelImplUtils.java | 15 +- .../impl/lens/TestPolicyStateRecording.java | 4 +- .../model/impl/lens/TestReconScript.java | 6 +- .../midpoint/model/intest/TestActivation.java | 10 +- .../model/intest/TestConnectorDummyFake.java | 8 +- .../model/intest/TestConsistencySimple.java | 8 +- .../intest/TestLoggingConfiguration.java | 2 +- .../intest/TestModelServiceContract.java | 10 +- .../model/intest/TestPreviewChanges.java | 42 +- .../midpoint/model/intest/TestResources.java | 6 +- .../model/intest/TestTolerantAttributes.java | 10 +- .../model/intest/TestUserTemplate.java | 2 +- .../intest/TestUserTemplateWithRanges.java | 11 +- .../model/intest/gensync/TestEditSchema.java | 4 +- .../intest/importer/AbstractImportTest.java | 4 +- .../model/intest/mapping/TestMapping.java | 6 +- .../intest/mapping/TestMappingInbound.java | 2 +- .../model/intest/misc/TestTracing.java | 4 +- .../model/intest/multi/TestMultiResource.java | 4 +- .../model/intest/orgstruct/TestOrgStruct.java | 7 +- .../orgstruct/TestOrgStructCaribbean.java | 2 +- .../intest/rbac/TestAssignmentValidity.java | 12 +- .../midpoint/model/intest/rbac/TestRbac.java | 4 +- .../rbac/TestRbacLightInitialProjection.java | 2 +- .../model/intest/rbac/TestRbacNoInbounds.java | 2 +- .../intest/rbac/TestSegregationOfDuties.java | 2 +- .../intest/security/AbstractSecurityTest.java | 18 +- .../intest/security/TestSecurityBasic.java | 4 +- .../test/AbstractModelIntegrationTest.java | 24 +- .../rest/impl/ModelRestController.java | 12 +- .../wf/impl/AbstractWfTestPolicy.java | 2 +- .../assignments/TestAssignmentsAdvanced.java | 5 +- .../TestObjectLifecycleApprovalGlobal.java | 10 +- .../wf/impl/other/TestMiscellaneous.java | 12 +- .../wf/impl/other/TestParallelApprovals.java | 9 +- .../midpoint/wf/impl/other/TestPreview.java | 2 +- .../ad/AbstractAdLdapMultidomainTest.java | 4 +- .../testing/rest/RestServiceInitializer.java | 8 +- .../testing/rest/TestAbstractRestService.java | 4 +- .../story/TestConsistencyMechanism.java | 6 +- .../story/ldap/TestLdapVirtualGroup.java | 2 +- 92 files changed, 1015 insertions(+), 1252 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index 378781c8ab0..41d2bde75e4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -2757,4 +2757,8 @@ public Clock getClock() { private SideBarMenuPanel getSideBarMenuPanel(){ return (SideBarMenuPanel) get(ID_SIDEBAR_MENU); } + + public ModelExecuteOptions executeOptions() { + return ModelExecuteOptions.create(getPrismContext()); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index cc3eb9f4693..6efdd1c142d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -644,7 +644,7 @@ public static TaskType createSingleRecurrenceTask(String taskName, QName applica } if (options != null) { - prismTask.findOrCreateProperty(SchemaConstants.PATH_MODEL_EXTENSION_EXECUTE_OPTIONS) + prismTask.findOrCreateContainer(SchemaConstants.PATH_MODEL_EXTENSION_EXECUTE_OPTIONS) .setRealValue(options.toModelExecutionOptionsType()); } return task; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java index 57d54d056df..2f58797c13a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/InitialDataImport.java @@ -133,7 +133,7 @@ private Boolean importObject(PrismObject object, File ObjectDelta delta = DeltaFactory.Object.createAddDelta(object); try { LOGGER.info("Starting initial import of file {}.", file.getName()); - model.executeChanges(MiscUtil.createCollection(delta), ModelExecuteOptions.createIsImport(), task, result); + model.executeChanges(MiscUtil.createCollection(delta), ModelExecuteOptions.create(prismContext).setIsImport(), task, result); result.recordSuccess(); LOGGER.info("Created {} as part of initial import", object); return true; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/PostInitialDataImport.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/PostInitialDataImport.java index c7a9c0f605b..ca9bf553433 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/PostInitialDataImport.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/init/PostInitialDataImport.java @@ -127,7 +127,7 @@ private boolean importObject(File file, Task task, OperationResult mainResult) { LOGGER.info("Starting post-initial import of file {}.", file.getName()); ImportOptionsType options = new ImportOptionsType(); options.overwrite(true); - options.setModelExecutionOptions(new ModelExecuteOptionsType().raw(false)); + options.setModelExecutionOptions(new ModelExecuteOptionsType(prismContext).raw(false)); model.importObjectsFromFile(file, options, task, result); result.recordSuccess(); return true; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressPanel.java index d7b5ab224a0..d54e066aa54 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/progress/ProgressPanel.java @@ -9,15 +9,12 @@ import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.model.api.ModelInteractionService; import com.evolveum.midpoint.model.api.ModelPublicConstants; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.api.context.ModelContext; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.schema.DeltaConvertor; import com.evolveum.midpoint.schema.ObjectDeltaOperation; @@ -449,11 +446,11 @@ public void executeChangesInBackground(Collection optionsDefinition = page.getPrismContext().getSchemaRegistry() - .findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); - PrismProperty optionsProperty = optionsDefinition.instantiate(); - optionsProperty.setRealValue(options.toModelExecutionOptionsType()); - task.addExtensionProperty(optionsProperty); + PrismContainerDefinition optionsDefinition = page.getPrismContext().getSchemaRegistry() + .findContainerDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); + PrismContainer optionsContainer = optionsDefinition.instantiate(); + optionsContainer.setRealValue(options.toModelExecutionOptionsType()); + task.setExtensionContainer(optionsContainer); } task.setChannel(SchemaConstants.CHANNEL_GUI_USER_URI); task.setHandlerUri(ModelPublicConstants.EXECUTE_DELTAS_TASK_HANDLER_URI); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/FocusListInlineMenuHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/FocusListInlineMenuHelper.java index 2c1150cf855..0c053a1bb71 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/FocusListInlineMenuHelper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/util/FocusListInlineMenuHelper.java @@ -303,7 +303,7 @@ private void reconcilePerformed(AjaxRequestTarget target, F selectedObject) { .createEmptyModifyDelta(objectClass, object.getOid() ); Collection> deltas = MiscUtil.createCollection(delta); - parentPage.getModelService().executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, opResult); + parentPage.getModelService().executeChanges(deltas, parentPage.executeOptions().reconcile(), task, opResult); opResult.computeStatusIfUnknown(); } catch (CommonException|RuntimeException ex) { opResult.recomputeStatus(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java index 601774c7fc0..c26a0260e0c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java @@ -477,7 +477,7 @@ public void applyState() { } if (!delta.isEmpty()) { parentPage.logDelta(delta); - WebModelServiceUtils.save(delta, ModelExecuteOptions.createRaw(), result, null, parentPage); + WebModelServiceUtils.save(delta, ModelExecuteOptions.create(prismContext).raw(), result, null, parentPage); parentPage.resetModels(); saved = true; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java index 0afbf0b14d0..6e75bdb113d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java @@ -706,7 +706,7 @@ public List showAllAssignmentsPerformed(AjaxRequestTarget aja ModelContext modelContext; try { - ModelExecuteOptions options = ModelExecuteOptions.createEvaluateAllAssignmentRelationsOnRecompute(); + ModelExecuteOptions options = executeOptions().evaluateAllAssignmentRelationsOnRecompute(); modelContext = getModelInteractionService().previewChanges(Collections.singleton(delta), options, task, result); } catch (NoFocusNameSchemaException e) { info(getString("pageAdminFocus.message.noUserName")); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java index 4868adbc1ca..0a22b6b1589 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java @@ -993,7 +993,7 @@ public void startProcessing(AjaxRequestTarget target, OperationResult result) { @NotNull protected ModelExecuteOptions getOptions(boolean previewOnly) { - ModelExecuteOptions options = mainPanel.getExecuteChangeOptionsDto().createOptions(); + ModelExecuteOptions options = mainPanel.getExecuteChangeOptionsDto().createOptions(getPrismContext()); if (previewOnly) { options.getOrCreatePartialProcessing().setApprovals(PartialProcessingTypeType.PROCESS); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCases.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCases.java index 7628e8506ce..afb8c33ff42 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCases.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCases.java @@ -247,7 +247,7 @@ private void deleteCaseObjectsConfirmed(AjaxRequestTarget target, List OperationResult result = new OperationResult(OPERATION_DELETE_CASE_OBJECT); casesToDelete.forEach(caseObject -> { WebModelServiceUtils.deleteObject(CaseType.class, caseObject.getOid(), - ExecuteChangeOptionsDto.createFromSystemConfiguration().createOptions(), + ExecuteChangeOptionsDto.createFromSystemConfiguration().createOptions(getPrismContext()), result, PageCases.this); }); result.computeStatusComposite(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertDefinition.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertDefinition.java index 3890c38ab89..d85bab7c453 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertDefinition.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/PageCertDefinition.java @@ -253,8 +253,8 @@ public void savePerformed(AjaxRequestTarget target) { delta.normalize(); if (!delta.isEmpty()) { getPrismContext().adopt(delta); - ModelExecuteOptions options = new ModelExecuteOptions(); - options.setRaw(true); + ModelExecuteOptions options = new ModelExecuteOptions(getPrismContext()); + options.raw(true); getModelService().executeChanges(MiscUtil.createCollection(delta), options, task, result); } result.computeStatus(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java index ec3e6d89fc4..e8200f4d652 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageDebugList.java @@ -867,7 +867,7 @@ private void deleteSelectedConfirmed(AjaxRequestTarget target, List> deltas = (Collection) MiscUtil.createCollection(delta); - ModelExecuteOptions options = new ModelExecuteOptions(); + ModelExecuteOptions options = ModelExecuteOptions.create(getPrismContext()); if (isTrue(DebugViewOptions.ID_SAVE_AS_RAW)) { - options.setRaw(true); + options.raw(true); } if (isTrue(DebugViewOptions.ID_REEVALUATE_SEARCH_FILTERS)) { - options.setReevaluateSearchFilters(true); + options.reevaluateSearchFilters(true); } if(!isTrue(DebugViewOptions.ID_ENCRYPT)) { - options.setNoCrypt(true); + options.noCrypt(true); } getModelService().executeChanges(deltas, options, task, result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java index 1275b217bb9..9fb200911a2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/PageImportObject.java @@ -1,365 +1,365 @@ -/* - * Copyright (c) 2010-2015 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ - -package com.evolveum.midpoint.web.page.admin.configuration; - -import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.task.api.Task; -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.application.AuthorizationAction; -import com.evolveum.midpoint.web.application.PageDescriptor; -import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.AjaxSubmitButton; -import com.evolveum.midpoint.web.component.input.DataLanguagePanel; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.component.AceEditor; -import com.evolveum.midpoint.web.page.admin.configuration.component.ImportOptionsPanel; -import com.evolveum.midpoint.web.security.MidPointApplication; -import com.evolveum.midpoint.web.security.WebApplicationConfiguration; -import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ImportOptionsType; - -import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; -import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; -import org.apache.commons.lang.StringUtils; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; -import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.Radio; -import org.apache.wicket.markup.html.form.RadioGroup; -import org.apache.wicket.markup.html.form.upload.FileUpload; -import org.apache.wicket.markup.html.form.upload.FileUploadField; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.util.file.File; -import org.jetbrains.annotations.NotNull; - -import java.io.FileInputStream; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.List; - -import static org.apache.commons.lang3.BooleanUtils.isTrue; - -/** - * @author lazyman - * @author mserbak - */ -@PageDescriptor(url = "/admin/config/import", action = { - @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), - @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL, label = "PageImportObject.auth.configImport.label", description = "PageImportObject.auth.configImport.description") }) -public class PageImportObject extends PageAdminConfiguration { - - private static final Trace LOGGER = TraceManager.getTrace(PageImportObject.class); - private static final String DOT_CLASS = PageImportObject.class.getName() + "."; - private static final String OPERATION_IMPORT_FILE = DOT_CLASS + "importFile"; - private static final String OPERATION_IMPORT_XML = DOT_CLASS + "importXml"; - - private static final String ID_MAIN_FORM = "mainForm"; - private static final String ID_BUTTON_BAR = "buttonBar"; - private static final String ID_IMPORT_OPTIONS = "importOptions"; - private static final String ID_IMPORT_RADIO_GROUP = "importRadioGroup"; - private static final String ID_FILE_RADIO = "fileRadio"; - private static final String ID_XML_RADIO = "xmlRadio"; - private static final String ID_BACK_BUTTON = "back"; - private static final String ID_IMPORT_FILE_BUTTON = "importFileButton"; - private static final String ID_IMPORT_XML_BUTTON = "importXmlButton"; - private static final String ID_INPUT = "input"; - private static final String ID_INPUT_ACE = "inputAce"; - private static final String ID_LANGUAGE_PANEL = "languagePanel"; - private static final String ID_ACE_EDITOR = "aceEditor"; - private static final String ID_INPUT_FILE_LABEL = "inputFileLabel"; - private static final String ID_INPUT_FILE = "inputFile"; - private static final String ID_FILE_INPUT = "fileInput"; - - private static final Integer INPUT_FILE = 1; - private static final Integer INPUT_XML = 2; - - private LoadableModel optionsModel; - private IModel fullProcessingModel; - private IModel xmlEditorModel; - - private String dataLanguage; - - public PageImportObject() { - optionsModel = new LoadableModel(false) { - - @Override - protected ImportOptionsType load() { - return MiscSchemaUtil.getDefaultImportOptions(); - } - }; - fullProcessingModel = Model.of(Boolean.TRUE); - xmlEditorModel = new Model<>(null); - - initLayout(); - } - - private void initLayout() { - Form mainForm = new com.evolveum.midpoint.web.component.form.Form(ID_MAIN_FORM); - mainForm.setMultiPart(true); - add(mainForm); - - ImportOptionsPanel importOptions = new ImportOptionsPanel(ID_IMPORT_OPTIONS, optionsModel, fullProcessingModel); - mainForm.add(importOptions); - - final WebMarkupContainer input = new WebMarkupContainer(ID_INPUT); - input.setOutputMarkupId(true); - mainForm.add(input); - - final WebMarkupContainer buttonBar = new WebMarkupContainer(ID_BUTTON_BAR); - buttonBar.setOutputMarkupId(true); - mainForm.add(buttonBar); - - final IModel groupModel = new Model<>(INPUT_FILE); - RadioGroup importRadioGroup = new RadioGroup(ID_IMPORT_RADIO_GROUP, groupModel); - importRadioGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() { - - @Override - protected void onUpdate(AjaxRequestTarget target) { - target.add(input); - target.add(buttonBar); - } - }); - mainForm.add(importRadioGroup); - - Radio fileRadio = new Radio(ID_FILE_RADIO, new Model(INPUT_FILE), importRadioGroup); - importRadioGroup.add(fileRadio); - - Radio xmlRadio = new Radio(ID_XML_RADIO, new Model(INPUT_XML), importRadioGroup); - importRadioGroup.add(xmlRadio); - - WebMarkupContainer inputAce = new WebMarkupContainer(ID_INPUT_ACE); - addVisibileForInputType(inputAce, INPUT_XML, groupModel); - input.add(inputAce); - - dataLanguage = determineDataLanguage(); - - DataLanguagePanel languagePanel = new DataLanguagePanel(ID_LANGUAGE_PANEL, dataLanguage, List.class, this) { - @Override - protected void onLanguageSwitched(AjaxRequestTarget target, int index, String updatedLanguage, String objectString) { - dataLanguage = updatedLanguage; - xmlEditorModel.setObject(objectString); - addOrReplaceEditor(inputAce); - target.add(mainForm); - } - - @Override - protected String getObjectStringRepresentation() { - return xmlEditorModel.getObject(); - } - }; - inputAce.add(languagePanel); - addOrReplaceEditor(inputAce); - - WebMarkupContainer inputFileLabel = new WebMarkupContainer(ID_INPUT_FILE_LABEL); - addVisibileForInputType(inputFileLabel, INPUT_FILE, groupModel); - input.add(inputFileLabel); - - WebMarkupContainer inputFile = new WebMarkupContainer(ID_INPUT_FILE); - addVisibileForInputType(inputFile, INPUT_FILE, groupModel); - input.add(inputFile); - - FileUploadField fileInput = new FileUploadField(ID_FILE_INPUT); - inputFile.add(fileInput); - - initButtons(buttonBar, groupModel); - } - - private void addOrReplaceEditor(WebMarkupContainer inputAce) { - AceEditor editor = new AceEditor(ID_ACE_EDITOR, xmlEditorModel); - editor.setOutputMarkupId(true); - editor.setModeForDataLanguage(dataLanguage); - editor.add(new AjaxFormComponentUpdatingBehavior("blur") { - @Override - protected void onUpdate(AjaxRequestTarget target) { - } - }); - inputAce.addOrReplace(editor); - } - - private void addVisibileForInputType(Component comp, final Integer type, - final IModel groupModel) { - comp.add(new VisibleEnableBehaviour() { - - @Override - public boolean isVisible() { - return type.equals(groupModel.getObject()); - } - - }); - } - - private void initButtons(WebMarkupContainer buttonBar, IModel inputType) { - AjaxButton backButton = new AjaxButton(ID_BACK_BUTTON, createStringResource("PageCertCampaign.button.back")) { - - @Override - public void onClick(AjaxRequestTarget target) { - redirectBack(); - } - }; - backButton.add(new VisibleEnableBehaviour() { - - @Override - public boolean isVisible() { - return canRedirectBack(); - } - }); - buttonBar.add(backButton); - - AjaxSubmitButton saveFileButton = new AjaxSubmitButton(ID_IMPORT_FILE_BUTTON, - createStringResource("PageImportObject.button.import")) { - - @Override - protected void onSubmit(AjaxRequestTarget target) { - savePerformed(false, OPERATION_IMPORT_FILE, target); - } - - @Override - protected void onError(AjaxRequestTarget target) { - target.add(getFeedbackPanel()); - } - }; - addVisibileForInputType(saveFileButton, INPUT_FILE, inputType); - buttonBar.add(saveFileButton); - - AjaxSubmitButton saveXmlButton = new AjaxSubmitButton(ID_IMPORT_XML_BUTTON, - createStringResource("PageImportObject.button.import")) { - - @Override - protected void onSubmit(AjaxRequestTarget target) { - savePerformed(true, OPERATION_IMPORT_XML, target); - } - - @Override - protected void onError(AjaxRequestTarget target) { - target.add(getFeedbackPanel()); - } - }; - addVisibileForInputType(saveXmlButton, INPUT_XML, inputType); - buttonBar.add(saveXmlButton); - } - - private FileUpload getUploadedFile() { - FileUploadField file = (FileUploadField) get( - createComponentPath(ID_MAIN_FORM, ID_INPUT, ID_INPUT_FILE, ID_FILE_INPUT)); - return file.getFileUpload(); - } - - private boolean validateInput(boolean raw) { - if (raw) { - return StringUtils.isNotEmpty(xmlEditorModel.getObject()); - } - return getUploadedFile() != null; - - } - - private static class InputDescription { - private InputStream inputStream; - private String dataLanguage; - InputDescription(InputStream inputStream, String dataLanguage) { - this.inputStream = inputStream; - this.dataLanguage = dataLanguage; - } - } - - @NotNull - private InputDescription getInputDescription(boolean editor) throws Exception { - if (editor) { - return new InputDescription( - IOUtils.toInputStream(xmlEditorModel.getObject(), StandardCharsets.UTF_8), - dataLanguage); - } - File newFile = null; - try { - // Create new file - MidPointApplication application = getMidpointApplication(); - WebApplicationConfiguration config = application.getWebApplicationConfiguration(); - File folder = new File(config.getImportFolder()); - if (!folder.exists() || !folder.isDirectory()) { - folder.mkdir(); - } - - FileUpload uploadedFile = getUploadedFile(); - newFile = new File(folder, uploadedFile.getClientFileName()); - // Check new file, delete if it already exists - if (newFile.exists()) { - newFile.delete(); - } - // Save file - - newFile.createNewFile(); - - FileUtils.copyInputStreamToFile(uploadedFile.getInputStream(), newFile); - - String language = getPrismContext().detectLanguage(newFile); - return new InputDescription(new FileInputStream(newFile), language); - } finally { - if (newFile != null) { - FileUtils.deleteQuietly(newFile); - } - } - } - - private void clearOldFeedback(){ - getSession().getFeedbackMessages().clear(); - getFeedbackMessages().clear(); - } - - private void savePerformed(boolean raw, String operationName, AjaxRequestTarget target) { - clearOldFeedback(); - - OperationResult result = new OperationResult(operationName); - - if (!validateInput(raw)) { - error(getString("pageImportObject.message.nullFile")); - target.add(getFeedbackPanel()); - - return; - } - InputStream stream = null; - - try { - Task task = createSimpleTask(operationName); - InputDescription inputDescription = getInputDescription(raw); - stream = inputDescription.inputStream; - ImportOptionsType options = optionsModel.getObject(); - if (isTrue(fullProcessingModel.getObject())) { - options.setModelExecutionOptions(new ModelExecuteOptionsType().raw(false)); - } else { - options.setModelExecutionOptions(null); - } - getModelService().importObjectsFromStream(stream, inputDescription.dataLanguage, options, task, result); - - result.recomputeStatus(); - } catch (Exception ex) { - result.recordFatalError(getString("PageImportObject.message.savePerformed.fatalError"), ex); - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import file", ex); - } finally { - if (stream != null) { - IOUtils.closeQuietly(stream); - } - - } - showResult(result); - if (result.isFatalError()){ - target.add(getFeedbackPanel()); - } else { - target.add(PageImportObject.this); - } - } - - -} +/* + * Copyright (c) 2010-2015 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.web.page.admin.configuration; + +import com.evolveum.midpoint.gui.api.model.LoadableModel; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.schema.util.MiscSchemaUtil; +import com.evolveum.midpoint.security.api.AuthorizationConstants; +import com.evolveum.midpoint.task.api.Task; +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.application.AuthorizationAction; +import com.evolveum.midpoint.web.application.PageDescriptor; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.AjaxSubmitButton; +import com.evolveum.midpoint.web.component.input.DataLanguagePanel; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import com.evolveum.midpoint.web.component.AceEditor; +import com.evolveum.midpoint.web.page.admin.configuration.component.ImportOptionsPanel; +import com.evolveum.midpoint.web.security.MidPointApplication; +import com.evolveum.midpoint.web.security.WebApplicationConfiguration; +import com.evolveum.midpoint.xml.ns._public.common.api_types_3.ImportOptionsType; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormChoiceComponentUpdatingBehavior; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.markup.html.form.Radio; +import org.apache.wicket.markup.html.form.RadioGroup; +import org.apache.wicket.markup.html.form.upload.FileUpload; +import org.apache.wicket.markup.html.form.upload.FileUploadField; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.util.file.File; +import org.jetbrains.annotations.NotNull; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import static org.apache.commons.lang3.BooleanUtils.isTrue; + +/** + * @author lazyman + * @author mserbak + */ +@PageDescriptor(url = "/admin/config/import", action = { + @AuthorizationAction(actionUri = PageAdminConfiguration.AUTH_CONFIGURATION_ALL, label = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_LABEL, description = PageAdminConfiguration.AUTH_CONFIGURATION_ALL_DESCRIPTION), + @AuthorizationAction(actionUri = AuthorizationConstants.AUTZ_UI_CONFIGURATION_IMPORT_URL, label = "PageImportObject.auth.configImport.label", description = "PageImportObject.auth.configImport.description") }) +public class PageImportObject extends PageAdminConfiguration { + + private static final Trace LOGGER = TraceManager.getTrace(PageImportObject.class); + private static final String DOT_CLASS = PageImportObject.class.getName() + "."; + private static final String OPERATION_IMPORT_FILE = DOT_CLASS + "importFile"; + private static final String OPERATION_IMPORT_XML = DOT_CLASS + "importXml"; + + private static final String ID_MAIN_FORM = "mainForm"; + private static final String ID_BUTTON_BAR = "buttonBar"; + private static final String ID_IMPORT_OPTIONS = "importOptions"; + private static final String ID_IMPORT_RADIO_GROUP = "importRadioGroup"; + private static final String ID_FILE_RADIO = "fileRadio"; + private static final String ID_XML_RADIO = "xmlRadio"; + private static final String ID_BACK_BUTTON = "back"; + private static final String ID_IMPORT_FILE_BUTTON = "importFileButton"; + private static final String ID_IMPORT_XML_BUTTON = "importXmlButton"; + private static final String ID_INPUT = "input"; + private static final String ID_INPUT_ACE = "inputAce"; + private static final String ID_LANGUAGE_PANEL = "languagePanel"; + private static final String ID_ACE_EDITOR = "aceEditor"; + private static final String ID_INPUT_FILE_LABEL = "inputFileLabel"; + private static final String ID_INPUT_FILE = "inputFile"; + private static final String ID_FILE_INPUT = "fileInput"; + + private static final Integer INPUT_FILE = 1; + private static final Integer INPUT_XML = 2; + + private LoadableModel optionsModel; + private IModel fullProcessingModel; + private IModel xmlEditorModel; + + private String dataLanguage; + + public PageImportObject() { + optionsModel = new LoadableModel(false) { + + @Override + protected ImportOptionsType load() { + return MiscSchemaUtil.getDefaultImportOptions(); + } + }; + fullProcessingModel = Model.of(Boolean.TRUE); + xmlEditorModel = new Model<>(null); + + initLayout(); + } + + private void initLayout() { + Form mainForm = new com.evolveum.midpoint.web.component.form.Form(ID_MAIN_FORM); + mainForm.setMultiPart(true); + add(mainForm); + + ImportOptionsPanel importOptions = new ImportOptionsPanel(ID_IMPORT_OPTIONS, optionsModel, fullProcessingModel); + mainForm.add(importOptions); + + final WebMarkupContainer input = new WebMarkupContainer(ID_INPUT); + input.setOutputMarkupId(true); + mainForm.add(input); + + final WebMarkupContainer buttonBar = new WebMarkupContainer(ID_BUTTON_BAR); + buttonBar.setOutputMarkupId(true); + mainForm.add(buttonBar); + + final IModel groupModel = new Model<>(INPUT_FILE); + RadioGroup importRadioGroup = new RadioGroup(ID_IMPORT_RADIO_GROUP, groupModel); + importRadioGroup.add(new AjaxFormChoiceComponentUpdatingBehavior() { + + @Override + protected void onUpdate(AjaxRequestTarget target) { + target.add(input); + target.add(buttonBar); + } + }); + mainForm.add(importRadioGroup); + + Radio fileRadio = new Radio(ID_FILE_RADIO, new Model(INPUT_FILE), importRadioGroup); + importRadioGroup.add(fileRadio); + + Radio xmlRadio = new Radio(ID_XML_RADIO, new Model(INPUT_XML), importRadioGroup); + importRadioGroup.add(xmlRadio); + + WebMarkupContainer inputAce = new WebMarkupContainer(ID_INPUT_ACE); + addVisibileForInputType(inputAce, INPUT_XML, groupModel); + input.add(inputAce); + + dataLanguage = determineDataLanguage(); + + DataLanguagePanel languagePanel = new DataLanguagePanel(ID_LANGUAGE_PANEL, dataLanguage, List.class, this) { + @Override + protected void onLanguageSwitched(AjaxRequestTarget target, int index, String updatedLanguage, String objectString) { + dataLanguage = updatedLanguage; + xmlEditorModel.setObject(objectString); + addOrReplaceEditor(inputAce); + target.add(mainForm); + } + + @Override + protected String getObjectStringRepresentation() { + return xmlEditorModel.getObject(); + } + }; + inputAce.add(languagePanel); + addOrReplaceEditor(inputAce); + + WebMarkupContainer inputFileLabel = new WebMarkupContainer(ID_INPUT_FILE_LABEL); + addVisibileForInputType(inputFileLabel, INPUT_FILE, groupModel); + input.add(inputFileLabel); + + WebMarkupContainer inputFile = new WebMarkupContainer(ID_INPUT_FILE); + addVisibileForInputType(inputFile, INPUT_FILE, groupModel); + input.add(inputFile); + + FileUploadField fileInput = new FileUploadField(ID_FILE_INPUT); + inputFile.add(fileInput); + + initButtons(buttonBar, groupModel); + } + + private void addOrReplaceEditor(WebMarkupContainer inputAce) { + AceEditor editor = new AceEditor(ID_ACE_EDITOR, xmlEditorModel); + editor.setOutputMarkupId(true); + editor.setModeForDataLanguage(dataLanguage); + editor.add(new AjaxFormComponentUpdatingBehavior("blur") { + @Override + protected void onUpdate(AjaxRequestTarget target) { + } + }); + inputAce.addOrReplace(editor); + } + + private void addVisibileForInputType(Component comp, final Integer type, + final IModel groupModel) { + comp.add(new VisibleEnableBehaviour() { + + @Override + public boolean isVisible() { + return type.equals(groupModel.getObject()); + } + + }); + } + + private void initButtons(WebMarkupContainer buttonBar, IModel inputType) { + AjaxButton backButton = new AjaxButton(ID_BACK_BUTTON, createStringResource("PageCertCampaign.button.back")) { + + @Override + public void onClick(AjaxRequestTarget target) { + redirectBack(); + } + }; + backButton.add(new VisibleEnableBehaviour() { + + @Override + public boolean isVisible() { + return canRedirectBack(); + } + }); + buttonBar.add(backButton); + + AjaxSubmitButton saveFileButton = new AjaxSubmitButton(ID_IMPORT_FILE_BUTTON, + createStringResource("PageImportObject.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target) { + savePerformed(false, OPERATION_IMPORT_FILE, target); + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getFeedbackPanel()); + } + }; + addVisibileForInputType(saveFileButton, INPUT_FILE, inputType); + buttonBar.add(saveFileButton); + + AjaxSubmitButton saveXmlButton = new AjaxSubmitButton(ID_IMPORT_XML_BUTTON, + createStringResource("PageImportObject.button.import")) { + + @Override + protected void onSubmit(AjaxRequestTarget target) { + savePerformed(true, OPERATION_IMPORT_XML, target); + } + + @Override + protected void onError(AjaxRequestTarget target) { + target.add(getFeedbackPanel()); + } + }; + addVisibileForInputType(saveXmlButton, INPUT_XML, inputType); + buttonBar.add(saveXmlButton); + } + + private FileUpload getUploadedFile() { + FileUploadField file = (FileUploadField) get( + createComponentPath(ID_MAIN_FORM, ID_INPUT, ID_INPUT_FILE, ID_FILE_INPUT)); + return file.getFileUpload(); + } + + private boolean validateInput(boolean raw) { + if (raw) { + return StringUtils.isNotEmpty(xmlEditorModel.getObject()); + } + return getUploadedFile() != null; + + } + + private static class InputDescription { + private InputStream inputStream; + private String dataLanguage; + InputDescription(InputStream inputStream, String dataLanguage) { + this.inputStream = inputStream; + this.dataLanguage = dataLanguage; + } + } + + @NotNull + private InputDescription getInputDescription(boolean editor) throws Exception { + if (editor) { + return new InputDescription( + IOUtils.toInputStream(xmlEditorModel.getObject(), StandardCharsets.UTF_8), + dataLanguage); + } + File newFile = null; + try { + // Create new file + MidPointApplication application = getMidpointApplication(); + WebApplicationConfiguration config = application.getWebApplicationConfiguration(); + File folder = new File(config.getImportFolder()); + if (!folder.exists() || !folder.isDirectory()) { + folder.mkdir(); + } + + FileUpload uploadedFile = getUploadedFile(); + newFile = new File(folder, uploadedFile.getClientFileName()); + // Check new file, delete if it already exists + if (newFile.exists()) { + newFile.delete(); + } + // Save file + + newFile.createNewFile(); + + FileUtils.copyInputStreamToFile(uploadedFile.getInputStream(), newFile); + + String language = getPrismContext().detectLanguage(newFile); + return new InputDescription(new FileInputStream(newFile), language); + } finally { + if (newFile != null) { + FileUtils.deleteQuietly(newFile); + } + } + } + + private void clearOldFeedback(){ + getSession().getFeedbackMessages().clear(); + getFeedbackMessages().clear(); + } + + private void savePerformed(boolean raw, String operationName, AjaxRequestTarget target) { + clearOldFeedback(); + + OperationResult result = new OperationResult(operationName); + + if (!validateInput(raw)) { + error(getString("pageImportObject.message.nullFile")); + target.add(getFeedbackPanel()); + + return; + } + InputStream stream = null; + + try { + Task task = createSimpleTask(operationName); + InputDescription inputDescription = getInputDescription(raw); + stream = inputDescription.inputStream; + ImportOptionsType options = optionsModel.getObject(); + if (isTrue(fullProcessingModel.getObject())) { + options.setModelExecutionOptions(new ModelExecuteOptionsType(getPrismContext()).raw(false)); + } else { + options.setModelExecutionOptions(null); + } + getModelService().importObjectsFromStream(stream, inputDescription.dataLanguage, options, task, result); + + result.recomputeStatus(); + } catch (Exception ex) { + result.recordFatalError(getString("PageImportObject.message.savePerformed.fatalError"), ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't import file", ex); + } finally { + if (stream != null) { + IOUtils.closeQuietly(stream); + } + + } + showResult(result); + if (result.isFatalError()){ + target.add(getFeedbackPanel()); + } else { + target.add(PageImportObject.this); + } + } + + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentRepositoryPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentRepositoryPanel.java index 4b5f3c446d6..3d199d6e038 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentRepositoryPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentRepositoryPanel.java @@ -174,7 +174,7 @@ protected Search createSearch() { @Override protected ModelExecuteOptions createModelOptions() { - return ModelExecuteOptions.createRaw(); + return getPageBase().executeOptions().raw(); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java index 34175b417e9..e3ecd6ba5ac 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUsers.java @@ -417,7 +417,7 @@ private void deleteConfirmedPerformed(AjaxRequestTarget target, UserType userToD delta.setOid(user.getOid()); ExecuteChangeOptionsDto executeOptions = executeOptionsModel.getObject(); - ModelExecuteOptions options = executeOptions.createOptions(); + ModelExecuteOptions options = executeOptions.createOptions(getPrismContext()); LOGGER.debug("Using options {}.", new Object[] { executeOptions }); getModelService().executeChanges(MiscUtil.createCollection(delta), options, task, subResult); @@ -511,7 +511,7 @@ private void reconcilePerformed(AjaxRequestTarget target, UserType selectedUser) ObjectDelta delta = getPrismContext().deltaFactory().object().createEmptyModifyDelta(UserType.class, user.getOid() ); Collection> deltas = MiscUtil.createCollection(delta); - getModelService().executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, + getModelService().executeChanges(deltas, executeOptions().reconcile(), task, opResult); opResult.computeStatusIfUnknown(); } catch (Exception ex) { @@ -573,7 +573,7 @@ private void updateActivationPerformed(AjaxRequestTarget target, boolean enablin UserType.class, user.getOid(), enabling, getPrismContext()); ExecuteChangeOptionsDto executeOptions = executeOptionsModel.getObject(); - ModelExecuteOptions options = executeOptions.createOptions(); + ModelExecuteOptions options = executeOptions.createOptions(getPrismContext()); LOGGER.debug("Using options {}.", new Object[] { executeOptions }); getModelService().executeChanges(MiscUtil.createCollection(objectDelta), options, task, subResult); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/ExecuteChangeOptionsDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/ExecuteChangeOptionsDto.java index f2179d12b7b..afd257f3c84 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/ExecuteChangeOptionsDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/ExecuteChangeOptionsDto.java @@ -8,6 +8,7 @@ package com.evolveum.midpoint.web.page.admin.users.component; import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.web.security.MidPointApplication; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.TracingProfileType; @@ -129,13 +130,12 @@ public void setSaveInBackground(boolean saveInBackground) { } @NotNull - public ModelExecuteOptions createOptions() { - ModelExecuteOptions options = new ModelExecuteOptions(); - options.setForce(isForce()); - options.setReconcile(isReconcile()); - options.setReconcileAffected(isReconcileAffected()); - options.setExecuteImmediatelyAfterApproval(!isExecuteAfterAllApprovals()); - options.setTracingProfile(tracing); + public ModelExecuteOptions createOptions(PrismContext prismContext) { + ModelExecuteOptions options = new ModelExecuteOptions(prismContext); + options.force(isForce()); + options.reconcile(isReconcile()); + options.executeImmediatelyAfterApproval(!isExecuteAfterAllApprovals()); + options.tracingProfile(tracing); return options; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java index f94599bf57a..0dc6c93b920 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java @@ -625,8 +625,8 @@ private void recomputePerformed(SelectableBeanImpl orgToRecompute, Ajax try { ObjectDelta emptyDelta = getPageBase().getPrismContext().deltaFactory().object().createEmptyModifyDelta(OrgType.class, orgToRecompute.getValue().getOid()); - ModelExecuteOptions options = new ModelExecuteOptions(); - options.setReconcile(true); + ModelExecuteOptions options = new ModelExecuteOptions(getPrismContext()); + options.reconcile(true); getPageBase().getModelService().executeChanges(MiscUtil.createCollection(emptyDelta), options, task, result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java index 400e010062e..0850e05567f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/login/PageSelfRegistration.java @@ -387,7 +387,7 @@ private void saveUser(OperationResult result) { result.recordFatalError(getString("PageSelfRegistration.message.createDelta.fatalError", e.getMessage()), e); return result; } - WebModelServiceUtils.save(userDelta, ModelExecuteOptions.createOverwrite(), result, task, PageSelfRegistration.this); + WebModelServiceUtils.save(userDelta, executeOptions().overwrite(), result, task, PageSelfRegistration.this); return result; }, administrator); } catch (CommonException|RuntimeException e) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java index 33f386db693..0b0c364b94c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageAssignmentsList.java @@ -280,7 +280,7 @@ private void onSingleUserRequestPerformed(AjaxRequestTarget target) { delta = prepareDelta(user, result); ModelExecuteOptions options = createOptions(); - options.setInitialPartialProcessing(new PartialProcessingOptionsType().inbound(SKIP).projection(SKIP)); // TODO make this configurable? + options.initialPartialProcessing(new PartialProcessingOptionsType().inbound(SKIP).projection(SKIP)); // TODO make this configurable? getModelService().executeChanges(Collections.singletonList(delta), options, createSimpleTask(OPERATION_REQUEST_ASSIGNMENTS), result); result.recordSuccess(); @@ -331,8 +331,8 @@ private ModelExecuteOptions createOptions() { } else { businessContextType = null; } - ModelExecuteOptions options = ExecuteChangeOptionsDto.createFromSystemConfiguration().createOptions(); - options.setRequestBusinessContext(businessContextType); + ModelExecuteOptions options = ExecuteChangeOptionsDto.createFromSystemConfiguration().createOptions(getPrismContext()); + options.requestBusinessContext(businessContextType); return options; } @@ -466,7 +466,7 @@ private List getAssignmentConflicts(){ PartialProcessingOptionsType partialProcessing = new PartialProcessingOptionsType(); partialProcessing.setInbound(SKIP); partialProcessing.setProjection(SKIP); - ModelExecuteOptions recomputeOptions = ModelExecuteOptions.createPartialProcessing(partialProcessing); + ModelExecuteOptions recomputeOptions = executeOptions().partialProcessing(partialProcessing); modelContext = getModelInteractionService() .previewChanges(MiscUtil.createCollection(delta), recomputeOptions, task, result); DeltaSetTriple evaluatedAssignmentTriple = modelContext diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java index a170e3a1140..cf869ecbfc2 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestIntegrationObjectWrapperFactory.java @@ -122,7 +122,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + addObject(systemConfig, executeOptions().overwrite(), initTask, initResult); } diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageAccount.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageAccount.java index 1d3ee08db07..7298ab158a4 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageAccount.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageAccount.java @@ -41,7 +41,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); logger.info("adding system config page"); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + addObject(systemConfig, executeOptions().overwrite(), initTask, initResult); } @Test diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java index 261a3f84003..2e46f465967 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageOrg.java @@ -50,7 +50,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); logger.info("adding system config page"); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + addObject(systemConfig, executeOptions().overwrite(), initTask, initResult); } @Test diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java index 05433c947bd..6cfd160d053 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageRole.java @@ -50,7 +50,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); logger.info("adding system config page"); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + addObject(systemConfig, executeOptions().overwrite(), initTask, initResult); } @Test diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageSystemConfiguration.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageSystemConfiguration.java index 0d3bc29a087..dfb5226b0fa 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageSystemConfiguration.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageSystemConfiguration.java @@ -44,7 +44,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); logger.info("adding system config page"); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + addObject(systemConfig, executeOptions().overwrite(), initTask, initResult); } @Test diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageUser.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageUser.java index c9da5ea9bb3..13204b6dce6 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageUser.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestPageUser.java @@ -69,7 +69,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); logger.info("adding system config page"); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, initResult); + addObject(systemConfig, executeOptions().overwrite(), initTask, initResult); } @Test diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java index ccc5ad74b49..0069ce3edbe 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/gui/TestWrapperDelta.java @@ -219,7 +219,7 @@ public void test111modifyUserAssignemnt() throws Exception { assertModification(delta, resourceAttrDefValueWrapper.getPath(), ModificationTypeType.ADD, expectedvalue); - executeChanges(delta, ModelExecuteOptions.createRaw(), task, result); + executeChanges(delta, executeOptions().raw(), task, result); display(result); assertSuccess(result); diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java index ca49fd74085..3c69f24dcdc 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/PrismContainer.java @@ -79,6 +79,8 @@ public interface PrismContainer @NotNull C getRealValue(); + void setRealValue(C value) throws SchemaException; + void setValue(@NotNull PrismContainerValue value) throws SchemaException; @NotNull @@ -253,5 +255,4 @@ static void createParentIfNeeded(V value, ItemDe * USE WITH CARE. Make sure the definitions are not shared by other objects! */ void trimDefinitionTree(Collection alwaysKeep); - } diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerImpl.java index 72a390c0235..f999e353627 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/PrismContainerImpl.java @@ -143,6 +143,12 @@ public C getRealValue() { return getValue().getRealValue(); } + @Override + public void setRealValue(C value) throws SchemaException { + //noinspection unchecked + setValue(value != null ? value.asPrismContainerValue() : null); + } + @NotNull public PrismContainerValue getValue() { if (getValues().size() == 1) { diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java index a413ce076e2..4f7747df7a0 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/item/DummyContainerImpl.java @@ -73,6 +73,11 @@ public C getRealValue() { return delegate().getRealValue(); } + @Override + public void setRealValue(C value) throws SchemaException { + delegate().setRealValue(value); + } + @Override public X getRealValue(Class type) { return delegate().getRealValue(type); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 908dda5b2f7..ad3f0f78293 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -22065,8 +22065,25 @@ Options for execution of Model operations. These options influence the way how the operations are executed. The options are not mandatory. All options have reasonable default values. They may not be specified at all. + + true + + + + +

+ Extension container used to provide deployment-specific execution options. +

+
+ + 4.2 + true + +
+
+ @@ -22125,7 +22142,13 @@ Also, because of time complexity, the reconciliation may be executed in a separate background task. + + Support was removed in 4.2. It is replaced by new "Linked objects" functionality. + + true + 4.2 + @@ -22179,6 +22202,21 @@ + + + + Partial processing for initial clockwork stage. Used primarily for eliminating overhead when starting + operations that are expected to result in (background) approval processing. + + Note that if this option is used and if the clockwork proceeds to PRIMARY phase (e.g. because there are + no approvals), the context will be rotten after INITIAL phase. This presents some overhead. So please use + this option only if there is reasonable assumption that the request will stop after INITIAL phase. + + + 4.2 + + + @@ -22235,6 +22273,9 @@ Options that allows to select only some of the projector/clockwork parts to process. + + true + diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java index 95642f11d6d..4c420a89e2e 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertUpdateHelper.java @@ -148,7 +148,7 @@ void addObjectPreAuthorized(ObjectType objectType, Task task, OperationResult re try { ops = modelService.executeChanges( singleton(objectDelta), - ModelExecuteOptions.createRaw().setPreAuthorized(), task, result); + ModelExecuteOptions.create(prismContext).raw().preAuthorized(), task, result); } catch (ExpressionEvaluationException|CommunicationException|ConfigurationException|PolicyViolationException|SecurityViolationException e) { throw new SystemException("Unexpected exception when adding object: " + e.getMessage(), e); } @@ -175,7 +175,7 @@ void modifyObjectPreAuthorized(Class objectClass, Stri ObjectDelta objectDelta = prismContext.deltaFactory().object().createModifyDelta(oid, itemDeltas, objectClass ); try { - ModelExecuteOptions options = ModelExecuteOptions.createRaw().setPreAuthorized(); + ModelExecuteOptions options = ModelExecuteOptions.create(prismContext).raw().preAuthorized(); modelService.executeChanges(Collections.singletonList(objectDelta), options, task, result); } catch (SecurityViolationException|ExpressionEvaluationException|CommunicationException|ConfigurationException|PolicyViolationException e) { throw new SystemException("Unexpected exception when modifying " + objectClass.getSimpleName() + " " + oid + ": " + e.getMessage(), e); diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/complex/TestPolicyDrivenRoleLifecycle.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/complex/TestPolicyDrivenRoleLifecycle.java index 39ca0f90ee2..67dd7a93271 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/complex/TestPolicyDrivenRoleLifecycle.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/complex/TestPolicyDrivenRoleLifecycle.java @@ -37,7 +37,6 @@ import java.util.List; import java.util.stream.Collectors; -import static com.evolveum.midpoint.model.api.ModelExecuteOptions.createPartialProcessing; import static com.evolveum.midpoint.xml.ns._public.common.common_3.PartialProcessingTypeType.SKIP; import static java.util.Collections.emptyList; import static java.util.Collections.singleton; @@ -192,7 +191,7 @@ public void test040AssignOwnerAndApproverToCorrectRole() throws Exception { // WHEN+THEN when(); then(); - ModelExecuteOptions noApprovals = createPartialProcessing(new PartialProcessingOptionsType().approvals(SKIP)); + ModelExecuteOptions noApprovals = executeOptions().partialProcessing(new PartialProcessingOptionsType().approvals(SKIP)); assignRole(USER_ADMINISTRATOR_OID, roleCorrectOid, SchemaConstants.ORG_APPROVER, noApprovals, task, result); assignRole(USER_ADMINISTRATOR_OID, roleCorrectOid, SchemaConstants.ORG_OWNER, noApprovals, task, result); @@ -266,7 +265,7 @@ public void test060AssignOwnerAndApproverToCorrectHighRiskRole() throws Exceptio // WHEN+THEN when(); then(); - ModelExecuteOptions noApprovals = createPartialProcessing(new PartialProcessingOptionsType().approvals(SKIP)); + ModelExecuteOptions noApprovals = executeOptions().partialProcessing(new PartialProcessingOptionsType().approvals(SKIP)); assignRole(USER_ADMINISTRATOR_OID, roleCorrectHighRiskOid, SchemaConstants.ORG_APPROVER, noApprovals, task, result); assignRole(userJackOid, roleCorrectHighRiskOid, SchemaConstants.ORG_APPROVER, noApprovals, task, result); assignRole(USER_ADMINISTRATOR_OID, roleCorrectHighRiskOid, SchemaConstants.ORG_OWNER, noApprovals, task, result); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java index d15f36c8a48..09f3fb94581 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java @@ -6,14 +6,19 @@ */ package com.evolveum.midpoint.model.api; - +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.path.ItemName; import com.evolveum.midpoint.schema.AbstractOptions; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.jetbrains.annotations.NotNull; + import java.io.Serializable; import java.util.List; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType.*; + import static org.apache.commons.lang3.BooleanUtils.isTrue; /** @@ -22,82 +27,14 @@ * * @author semancik */ +@SuppressWarnings("UnusedReturnValue") public class ModelExecuteOptions extends AbstractOptions implements Serializable, Cloneable { /** - * Force the operation even if it would otherwise fail due to external failure. E.g. attempt to delete an account - * that no longer exists on resource may fail without a FORCE option. If FORCE option is used then the operation is - * finished even if the account does not exist (e.g. at least shadow is removed from midPoint repository). - */ - private Boolean force; - - /** - * Avoid any smart processing of the data except for schema application. Do not synchronize the data, do not apply - * any expressions, etc. - */ - private Boolean raw; - - /** - * Encrypt any cleartext data on write, decrypt any encrypted data on read. Applies only to the encrypted - * data formats (ProtectedString, ProtectedByteArray). - * It is not recommended to use in production environment. This option is provided only for diagnostic - * purposes to be used in development environments. - */ - private Boolean noCrypt; - - /** - * Option to reconcile focus and all projections while executing changes. - * (implies reconcileFocus) - */ - private Boolean reconcile; - - /** - * Option to reconcile focus while executing changes. - * If this option is set and the reconcile option is not set then the projections - * reconciliation will not be forced (but it may still happen if other configuration - * loads full projection). - */ - private Boolean reconcileFocus; - - /** - * Option to reconcile affected objects after executing changes. - * Typical use: after a role is changed, all users that have been assigned this role - * would be reconciled. - * - * Because it is difficult to determine all affected objects (e.g. users that have - * indirectly assigned a role), midPoint does a reasonable attempt to determine - * and reconcile them. E.g. it may be limited to a direct assignees. - * - * Also, because of time complexity, the reconciliation may be executed in - * a separate background task. - */ - private Boolean reconcileAffected; - - /** - * Option to execute changes as soon as they are approved. (For the primary stage approvals, the default behavior - * is to wait until all changes are approved/rejected and then execute the operation as a whole.) - */ - private Boolean executeImmediatelyAfterApproval; - - /** - * Option to user overwrite flag. It can be used from web service, if we want to re-import some object + * Majority of the content is present also in ModelExecuteOptionsType. + * So let's reuse the schema instead of duplicating it. */ - private Boolean overwrite; - - /** - * Option to simulate import operation. E.g. search filters will be resolved. - */ - private Boolean isImport; - - /** - * Causes reevaluation of search filters (producing partial errors on failure). - */ - private Boolean reevaluateSearchFilters; - - /** - * Option to limit propagation only for the source resource - */ - private Boolean limitPropagation; + @NotNull private final ModelExecuteOptionsType content; /** * Is this operation already authorized, i.e. should it be executed without any further authorization checks? @@ -105,39 +42,6 @@ public class ModelExecuteOptions extends AbstractOptions implements Serializable */ private Boolean preAuthorized; - /** - * Business context that describes this request. - */ - private OperationBusinessContextType requestBusinessContext; - - /** - * Options that control selective execution of model logic. - * Use with extreme care. Some combinations may be dangerous. - */ - private PartialProcessingOptionsType partialProcessing; - - /** - * Partial processing for initial clockwork stage. Used primarily for eliminating overhead when starting - * operations that are expected to result in (background) approval processing. - * - * Note that if this option is used and if the clockwork proceeds to PRIMARY phase (e.g. because there are - * no approvals), the context will be rotten after INITIAL phase. This presents some overhead. So please use - * this option only if there is reasonable assumption that the request will stop after INITIAL phase. - */ - private PartialProcessingOptionsType initialPartialProcessing; - - /** - * A method to resolve conflicts on focus objects. This specifies how will the processors handle - * optimistic locking conflicts - and whether they even try to detect them. The default value is - * null, which means that there is no reaction to conflicts and that the conflicts are not even - * detected. - * - * Note that different default conflict resolution may be specified in system configuration. - * - * EXPERIMENTAL - */ - private ConflictResolutionType focusConflictResolution; - /** * Processes all assignment relations on recompute. Used for computing all assignments. * TEMPORARY. EXPERIMENTAL. Should be replaced by something more generic (e.g. setting optimization level). @@ -151,349 +55,218 @@ public class ModelExecuteOptions extends AbstractOptions implements Serializable */ private TracingProfileType tracingProfile; - public Boolean getForce() { - return force; + public ModelExecuteOptions(PrismContext prismContext) { + content = new ModelExecuteOptionsType(prismContext); } - public void setForce(Boolean force) { - this.force = force; + private ModelExecuteOptions(@NotNull ModelExecuteOptionsType content) { + this.content = content; } - public static boolean isForce(ModelExecuteOptions options) { - if (options == null) { - return false; - } - if (options.force == null) { - return false; - } - return options.force; - } - - public static ModelExecuteOptions createForce() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setForce(true); - return opts; + private ModelExecuteOptions() { + this((PrismContext) null); } - public ModelExecuteOptions setForce() { - setForce(true); - return this; + public static ModelExecuteOptions create(PrismContext prismContext) { + return new ModelExecuteOptions(prismContext); } - public Boolean getRaw() { - return raw; + public static ModelExecuteOptions create(ModelExecuteOptions original, PrismContext prismContext) { + return original != null ? original.clone() : new ModelExecuteOptions(prismContext); } - public void setRaw(Boolean raw) { - this.raw = raw; + public static boolean is(ModelExecuteOptions options, ItemName itemName) { + return is(options, itemName, false); } - public static boolean isRaw(ModelExecuteOptions options) { + public static boolean is(ModelExecuteOptions options, ItemName itemName, boolean defaultValue) { if (options == null) { - return false; + return defaultValue; } - if (options.raw == null) { - return false; - } - return options.raw; + Boolean value = (Boolean) options.content.asPrismContainerValue().getPropertyRealValue(itemName, Boolean.class); + return value != null ? value : defaultValue; } - public static ModelExecuteOptions createRaw() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setRaw(true); - return opts; - } + //region Specific methods - public ModelExecuteOptions setRaw() { - setRaw(true); - return this; + public Boolean getForce() { + return content.isForce(); } - public Boolean getNoCrypt() { - return noCrypt; + public ModelExecuteOptions force(Boolean force) { + content.setForce(force); + return this; } - public void setNoCrypt(Boolean noCrypt) { - this.noCrypt = noCrypt; + public ModelExecuteOptions force() { + return force(true); } - public static boolean isNoCrypt(ModelExecuteOptions options) { - if (options == null) { - return false; - } - if (options.noCrypt == null) { - return false; - } - return options.noCrypt; + public static boolean isForce(ModelExecuteOptions options) { + return is(options, ModelExecuteOptionsType.F_FORCE); } - public static ModelExecuteOptions createNoCrypt() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setNoCrypt(true); - return opts; + public Boolean getRaw() { + return content.isRaw(); } - public ModelExecuteOptions setNoCrypt() { - setNoCrypt(true); + public ModelExecuteOptions raw(Boolean raw) { + content.setRaw(raw); return this; } - public Boolean getReconcile() { - return reconcile; - } - - public void setReconcile(Boolean reconcile) { - this.reconcile = reconcile; + public ModelExecuteOptions raw() { + return raw(true); } - public static boolean isReconcile(ModelExecuteOptions options) { - if (options == null){ - return false; - } - if (options.reconcile == null){ - return false; - } - return options.reconcile; + public static boolean isRaw(ModelExecuteOptions options) { + return is(options, ModelExecuteOptionsType.F_RAW); } - public static ModelExecuteOptions createReconcile() { + @Deprecated // kept because of (expected) external uses; use create(prismContext).raw() instead + public static ModelExecuteOptions createRaw() { ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setReconcile(true); + opts.raw(true); return opts; } - public static ModelExecuteOptions createReconcile(ModelExecuteOptions defaultOptions) { - ModelExecuteOptions opts = defaultOptions != null ? defaultOptions.clone() : new ModelExecuteOptions(); - opts.setReconcile(true); - return opts; + public Boolean getNoCrypt() { + return content.isNoCrypt(); } - public ModelExecuteOptions setReconcile() { - setReconcile(true); + public ModelExecuteOptions noCrypt(Boolean noCrypt) { + content.setNoCrypt(noCrypt); return this; } - public Boolean getReconcileFocus() { - return reconcileFocus; - } - - public void setReconcileFocus(Boolean reconcileFocus) { - this.reconcileFocus = reconcileFocus; - } - - public static ModelExecuteOptions createReconcileFocus() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setReconcileFocus(true); - return opts; + public static boolean isNoCrypt(ModelExecuteOptions options) { + return is(options, F_NO_CRYPT); } - public static boolean isReconcileFocus(ModelExecuteOptions options) { - if (options == null){ - return false; - } - if (options.reconcileFocus == null){ - return false; - } - return options.reconcileFocus; + public Boolean getReconcile() { + return content.isReconcile(); } - public Boolean getReconcileAffected() { - return reconcileAffected; + public ModelExecuteOptions reconcile(Boolean reconcile) { + content.setReconcile(reconcile); + return this; } - public void setReconcileAffected(Boolean reconcile) { - this.reconcileAffected = reconcile; + public ModelExecuteOptions reconcile() { + return reconcile(true); } - public static boolean isReconcileAffected(ModelExecuteOptions options){ - if (options == null){ - return false; - } - if (options.reconcileAffected == null){ - return false; - } - return options.reconcileAffected; + public static boolean isReconcile(ModelExecuteOptions options) { + return is(options, ModelExecuteOptionsType.F_RECONCILE); } - public static ModelExecuteOptions createReconcileAffected(){ + @Deprecated // kept because of (expected) external uses; use create(prismContext).reconcile() instead + public static ModelExecuteOptions createReconcile() { ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setReconcileAffected(true); + opts.reconcile(true); return opts; } - public ModelExecuteOptions setReconcileAffected() { - setReconcileAffected(true); + public ModelExecuteOptions reconcileFocus(Boolean reconcileFocus) { + content.setReconcileFocus(reconcileFocus); return this; } - public Boolean getOverwrite() { - return overwrite; - } - - public void setOverwrite(Boolean overwrite) { - this.overwrite = overwrite; + public ModelExecuteOptions reconcileFocus() { + return reconcileFocus(true); } - public static boolean isOverwrite(ModelExecuteOptions options){ - if (options == null){ - return false; - } - if (options.overwrite == null){ - return false; - } - return options.overwrite; + public static boolean isReconcileFocus(ModelExecuteOptions options) { + return is(options, ModelExecuteOptionsType.F_RECONCILE_FOCUS); } - public static ModelExecuteOptions createOverwrite(){ - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setOverwrite(true); - return opts; + public Boolean getOverwrite() { + return content.isOverwrite(); } - public ModelExecuteOptions setOverwrite() { - setOverwrite(true); + public ModelExecuteOptions overwrite(Boolean overwrite) { + content.setOverwrite(overwrite); return this; } - public Boolean getIsImport() { - return isImport; + public ModelExecuteOptions overwrite() { + return overwrite(true); } - public void setIsImport(Boolean isImport) { - this.isImport = isImport; - } - - public static boolean isIsImport(ModelExecuteOptions options){ - if (options == null){ - return false; - } - if (options.isImport == null){ - return false; - } - return options.isImport; + public static boolean isOverwrite(ModelExecuteOptions options) { + return is(options, F_OVERWRITE); } - public static ModelExecuteOptions createIsImport(){ - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setIsImport(true); - return opts; + // Intentionally using "set" to avoid confusion with asking on "isImport" + @SuppressWarnings("WeakerAccess") + public ModelExecuteOptions setIsImport(Boolean isImport) { + content.setIsImport(isImport); + return this; } - public ModelExecuteOptions setIsImport(){ + // Intentionally using "set" to avoid confusion with asking on "isImport" + public ModelExecuteOptions setIsImport() { setIsImport(true); return this; } - public void setExecuteImmediatelyAfterApproval(Boolean executeImmediatelyAfterApproval) { - this.executeImmediatelyAfterApproval = executeImmediatelyAfterApproval; + public static boolean isIsImport(ModelExecuteOptions options) { + return is(options, F_IS_IMPORT); } - public static boolean isExecuteImmediatelyAfterApproval(ModelExecuteOptions options){ - if (options == null){ - return false; - } - if (options.executeImmediatelyAfterApproval == null) { - return false; - } - return options.executeImmediatelyAfterApproval; - } - - public static ModelExecuteOptions createExecuteImmediatelyAfterApproval() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setExecuteImmediatelyAfterApproval(true); - return opts; - } - - public void setLimitPropagation(Boolean limitPropagation) { - this.limitPropagation = limitPropagation; - } - - public static boolean isLimitPropagation(ModelExecuteOptions options){ - if (options == null){ - return false; - } - if (options.limitPropagation == null){ - return false; - } - return options.limitPropagation; - } - - public static ModelExecuteOptions createLimitPropagation() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setLimitPropagation(true); - return opts; - } - - public ModelExecuteOptions setLimitPropagation() { - setLimitPropagation(true); + public ModelExecuteOptions executeImmediatelyAfterApproval(Boolean executeImmediatelyAfterApproval) { + content.setExecuteImmediatelyAfterApproval(executeImmediatelyAfterApproval); return this; } - - public Boolean getReevaluateSearchFilters() { - return reevaluateSearchFilters; + public ModelExecuteOptions executeImmediatelyAfterApproval() { + return executeImmediatelyAfterApproval(true); } - public void setReevaluateSearchFilters(Boolean reevaluateSearchFilters) { - this.reevaluateSearchFilters = reevaluateSearchFilters; + public static boolean isExecuteImmediatelyAfterApproval(ModelExecuteOptions options) { + return is(options, F_EXECUTE_IMMEDIATELY_AFTER_APPROVAL); } - public static boolean isReevaluateSearchFilters(ModelExecuteOptions options){ - if (options == null){ - return false; - } - if (options.reevaluateSearchFilters == null){ - return false; - } - return options.reevaluateSearchFilters; + public ModelExecuteOptions limitPropagation(Boolean limitPropagation) { + content.setLimitPropagation(limitPropagation); + return this; } - public static ModelExecuteOptions createReevaluateSearchFilters(){ - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setReevaluateSearchFilters(true); - return opts; + public static boolean isLimitPropagation(ModelExecuteOptions options) { + return is(options, F_LIMIT_PROPAGATION); } - public ModelExecuteOptions setReevaluateSearchFilters(){ - setReevaluateSearchFilters(true); + public ModelExecuteOptions reevaluateSearchFilters(Boolean reevaluateSearchFilters) { + content.setReevaluateSearchFilters(reevaluateSearchFilters); return this; } - public Boolean getPreAuthorized() { - return preAuthorized; + public static boolean isReevaluateSearchFilters(ModelExecuteOptions options) { + return is(options, F_REEVALUATE_SEARCH_FILTERS); } - public void setPreAuthorized(Boolean value) { + @SuppressWarnings("WeakerAccess") + public void preAuthorized(Boolean value) { this.preAuthorized = value; } - public static boolean isPreAuthorized(ModelExecuteOptions options) { - if (options == null) { - return false; - } - if (options.preAuthorized == null){ - return false; - } - return options.preAuthorized; - } - - public static ModelExecuteOptions createPreAuthorized() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setPreAuthorized(true); - return opts; + public ModelExecuteOptions preAuthorized() { + preAuthorized(true); + return this; } - public ModelExecuteOptions setPreAuthorized() { - setPreAuthorized(true); - return this; + public static boolean isPreAuthorized(ModelExecuteOptions options) { + return options != null && options.preAuthorized != null && options.preAuthorized; } + @SuppressWarnings("WeakerAccess") public OperationBusinessContextType getRequestBusinessContext() { - return requestBusinessContext; + return content.getRequestBusinessContext(); } - public void setRequestBusinessContext(OperationBusinessContextType requestBusinessContext) { - this.requestBusinessContext = requestBusinessContext; + public ModelExecuteOptions requestBusinessContext(OperationBusinessContextType requestBusinessContext) { + content.setRequestBusinessContext(requestBusinessContext); + return this; } public static OperationBusinessContextType getRequestBusinessContext(ModelExecuteOptions options) { @@ -503,18 +276,13 @@ public static OperationBusinessContextType getRequestBusinessContext(ModelExecut return options.getRequestBusinessContext(); } - public static ModelExecuteOptions createRequestBusinessContext(OperationBusinessContextType requestBusinessContext) { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setRequestBusinessContext(requestBusinessContext); - return opts; - } - public PartialProcessingOptionsType getPartialProcessing() { - return partialProcessing; + return content.getPartialProcessing(); } - public void setPartialProcessing(PartialProcessingOptionsType partialProcessing) { - this.partialProcessing = partialProcessing; + public ModelExecuteOptions partialProcessing(PartialProcessingOptionsType partialProcessing) { + content.setPartialProcessing(partialProcessing); + return this; } public static PartialProcessingOptionsType getPartialProcessing(ModelExecuteOptions options) { @@ -524,19 +292,13 @@ public static PartialProcessingOptionsType getPartialProcessing(ModelExecuteOpti return options.getPartialProcessing(); } - public static ModelExecuteOptions createPartialProcessing(PartialProcessingOptionsType partialProcessing) { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setPartialProcessing(partialProcessing); - return opts; - } - public PartialProcessingOptionsType getInitialPartialProcessing() { - return initialPartialProcessing; + return content.getInitialPartialProcessing(); } - public void setInitialPartialProcessing( - PartialProcessingOptionsType initialPartialProcessing) { - this.initialPartialProcessing = initialPartialProcessing; + public ModelExecuteOptions initialPartialProcessing(PartialProcessingOptionsType initialPartialProcessing) { + content.setInitialPartialProcessing(initialPartialProcessing); + return this; } public static PartialProcessingOptionsType getInitialPartialProcessing(ModelExecuteOptions options) { @@ -546,18 +308,14 @@ public static PartialProcessingOptionsType getInitialPartialProcessing(ModelExec return options.getInitialPartialProcessing(); } - public static ModelExecuteOptions createInitialPartialProcessing(PartialProcessingOptionsType partialProcessing) { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setInitialPartialProcessing(partialProcessing); - return opts; - } - + @SuppressWarnings("WeakerAccess") public ConflictResolutionType getFocusConflictResolution() { - return focusConflictResolution; + return content.getFocusConflictResolution(); } - public void setFocusConflictResolution(ConflictResolutionType focusConflictResolution) { - this.focusConflictResolution = focusConflictResolution; + public ModelExecuteOptions focusConflictResolution(ConflictResolutionType focusConflictResolution) { + content.setFocusConflictResolution(focusConflictResolution); + return this; } public static ConflictResolutionType getFocusConflictResolution(ModelExecuteOptions options) { @@ -567,121 +325,86 @@ public static ConflictResolutionType getFocusConflictResolution(ModelExecuteOpti return options.getFocusConflictResolution(); } - public static ModelExecuteOptions createFocusConflictResolution(ConflictResolutionType focusConflictResolution) { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setFocusConflictResolution(focusConflictResolution); - return opts; - } - - public Boolean getEvaluateAllAssignmentRelationsOnRecompute() { - return evaluateAllAssignmentRelationsOnRecompute; + @SuppressWarnings("WeakerAccess") + public ModelExecuteOptions evaluateAllAssignmentRelationsOnRecompute(Boolean evaluateAllAssignmentRelationsOnRecompute) { + this.evaluateAllAssignmentRelationsOnRecompute = evaluateAllAssignmentRelationsOnRecompute; + return this; } - public void setEvaluateAllAssignmentRelationsOnRecompute(Boolean evaluateAllAssignmentRelationsOnRecompute) { - this.evaluateAllAssignmentRelationsOnRecompute = evaluateAllAssignmentRelationsOnRecompute; + public ModelExecuteOptions evaluateAllAssignmentRelationsOnRecompute() { + return evaluateAllAssignmentRelationsOnRecompute(true); } public static boolean isEvaluateAllAssignmentRelationsOnRecompute(ModelExecuteOptions options) { return options != null && isTrue(options.evaluateAllAssignmentRelationsOnRecompute); } - public static ModelExecuteOptions createEvaluateAllAssignmentRelationsOnRecompute() { - ModelExecuteOptions opts = new ModelExecuteOptions(); - opts.setEvaluateAllAssignmentRelationsOnRecompute(true); - return opts; - } - public TracingProfileType getTracingProfile() { return tracingProfile; } - public void setTracingProfile(TracingProfileType tracingProfile) { + public ModelExecuteOptions tracingProfile(TracingProfileType tracingProfile) { this.tracingProfile = tracingProfile; + return this; } public static TracingProfileType getTracingProfile(ModelExecuteOptions options) { return options != null ? options.tracingProfile : null; } - public ModelExecuteOptions createTracingProfile(TracingProfileType tracingProfile) { - setTracingProfile(tracingProfile); + // TEMPORARY + public ModelExecuteOptions reconcileAffected(Boolean value) { + content.setReconcileAffected(value); return this; } + public static boolean isReconcileAffected(ModelExecuteOptions options) { + return is(options, F_RECONCILE_AFFECTED); + } + + //endregion + public ModelExecuteOptionsType toModelExecutionOptionsType() { - ModelExecuteOptionsType retval = new ModelExecuteOptionsType(); - retval.setForce(force); - retval.setRaw(raw); - retval.setNoCrypt(noCrypt); - retval.setReconcile(reconcile); - retval.setReconcileFocus(reconcileFocus); - retval.setExecuteImmediatelyAfterApproval(executeImmediatelyAfterApproval); - retval.setOverwrite(overwrite); - retval.setIsImport(isImport); - retval.setLimitPropagation(limitPropagation); - retval.setReevaluateSearchFilters(reevaluateSearchFilters); - // preAuthorized is purposefully omitted (security reasons) - retval.setRequestBusinessContext(requestBusinessContext); - retval.setPartialProcessing(partialProcessing); - retval.setFocusConflictResolution(focusConflictResolution); - return retval; - } - - public static ModelExecuteOptions fromModelExecutionOptionsType(ModelExecuteOptionsType type) { - if (type == null) { - return null; - } - ModelExecuteOptions retval = new ModelExecuteOptions(); - retval.setForce(type.isForce()); - retval.setRaw(type.isRaw()); - retval.setNoCrypt(type.isNoCrypt()); - retval.setReconcile(type.isReconcile()); - retval.setReconcileFocus(type.isReconcileFocus()); - retval.setExecuteImmediatelyAfterApproval(type.isExecuteImmediatelyAfterApproval()); - retval.setOverwrite(type.isOverwrite()); - retval.setIsImport(type.isIsImport()); - retval.setLimitPropagation(type.isLimitPropagation()); - retval.setReevaluateSearchFilters(type.isReevaluateSearchFilters()); - // preAuthorized is purposefully omitted (security reasons) - retval.setRequestBusinessContext(type.getRequestBusinessContext()); - retval.setPartialProcessing(type.getPartialProcessing()); - retval.setFocusConflictResolution(type.getFocusConflictResolution()); - return retval; - } - - public static ModelExecuteOptions fromRestOptions(List options){ - if (options == null || options.isEmpty()){ + return clone().content; // cloning for safety reasons + } + + public static ModelExecuteOptions fromModelExecutionOptionsType(ModelExecuteOptionsType bean) { + return bean != null ? new ModelExecuteOptions(bean) : null; + } + + public static ModelExecuteOptions fromRestOptions(List options, PrismContext prismContext) { + if (options == null || options.isEmpty()) { return null; } - ModelExecuteOptions retVal = new ModelExecuteOptions(); + ModelExecuteOptions retVal = new ModelExecuteOptions(prismContext); for (String option : options){ - if (ModelExecuteOptionsType.F_RAW.getLocalPart().equals(option)){ - retVal.setRaw(true); + if (ModelExecuteOptionsType.F_RAW.getLocalPart().equals(option)) { + retVal.raw(true); } - if (ModelExecuteOptionsType.F_EXECUTE_IMMEDIATELY_AFTER_APPROVAL.getLocalPart().equals(option)){ - retVal.setExecuteImmediatelyAfterApproval(true); + if (ModelExecuteOptionsType.F_EXECUTE_IMMEDIATELY_AFTER_APPROVAL.getLocalPart().equals(option)) { + retVal.executeImmediatelyAfterApproval(true); } - if (ModelExecuteOptionsType.F_FORCE.getLocalPart().equals(option)){ - retVal.setForce(true); + if (ModelExecuteOptionsType.F_FORCE.getLocalPart().equals(option)) { + retVal.force(true); } - if (ModelExecuteOptionsType.F_NO_CRYPT.getLocalPart().equals(option)){ - retVal.setNoCrypt(true); + if (F_NO_CRYPT.getLocalPart().equals(option)) { + retVal.noCrypt(true); } - if (ModelExecuteOptionsType.F_OVERWRITE.getLocalPart().equals(option)){ - retVal.setOverwrite(true); + if (F_OVERWRITE.getLocalPart().equals(option)) { + retVal.overwrite(true); } - if (ModelExecuteOptionsType.F_RECONCILE.getLocalPart().equals(option)){ - retVal.setReconcile(true); + if (ModelExecuteOptionsType.F_RECONCILE.getLocalPart().equals(option)) { + retVal.reconcile(true); } - if (ModelExecuteOptionsType.F_IS_IMPORT.getLocalPart().equals(option)){ + if (ModelExecuteOptionsType.F_IS_IMPORT.getLocalPart().equals(option)) { retVal.setIsImport(true); } - if (ModelExecuteOptionsType.F_LIMIT_PROPAGATION.getLocalPart().equals(option)){ - retVal.setLimitPropagation(true); + if (ModelExecuteOptionsType.F_LIMIT_PROPAGATION.getLocalPart().equals(option)) { + retVal.limitPropagation(true); } - if (ModelExecuteOptionsType.F_REEVALUATE_SEARCH_FILTERS.getLocalPart().equals(option)){ - retVal.setReevaluateSearchFilters(true); + if (ModelExecuteOptionsType.F_REEVALUATE_SEARCH_FILTERS.getLocalPart().equals(option)) { + retVal.reevaluateSearchFilters(true); } // preAuthorized is purposefully omitted (security reasons) } @@ -692,22 +415,21 @@ public static ModelExecuteOptions fromRestOptions(List options){ @Override public String toString() { StringBuilder sb = new StringBuilder("ModelExecuteOptions("); - appendFlag(sb, "executeImmediatelyAfterApproval", executeImmediatelyAfterApproval); - appendFlag(sb, "force", force); - appendFlag(sb, "isImport", isImport); - appendFlag(sb, "limitPropagation", limitPropagation); - appendFlag(sb, "noCrypt", noCrypt); - appendFlag(sb, "overwrite", overwrite); + appendFlag(sb, "executeImmediatelyAfterApproval", content.isExecuteImmediatelyAfterApproval()); + appendFlag(sb, "force", content.isForce()); + appendFlag(sb, "isImport", content.isIsImport()); + appendFlag(sb, "limitPropagation", content.isLimitPropagation()); + appendFlag(sb, "noCrypt", content.isNoCrypt()); + appendFlag(sb, "overwrite", content.isOverwrite()); appendFlag(sb, "preAuthorized", preAuthorized); - appendFlag(sb, "raw", raw); - appendFlag(sb, "reconcile", reconcile); - appendFlag(sb, "reconcileFocus", reconcileFocus); - appendFlag(sb, "reevaluateSearchFilters", reevaluateSearchFilters); - appendFlag(sb, "reconcileAffected", reconcileAffected); - appendFlag(sb, "requestBusinessContext", requestBusinessContext == null ? null : true); - appendVal(sb, "partialProcessing", format(partialProcessing)); - appendVal(sb, "initialPartialProcessing", format(initialPartialProcessing)); - appendVal(sb, "focusConflictResolution", focusConflictResolution); + appendFlag(sb, "raw", content.isRaw()); + appendFlag(sb, "reconcile", content.isReconcile()); + appendFlag(sb, "reconcileFocus", content.isReconcileFocus()); + appendFlag(sb, "reevaluateSearchFilters", content.isReevaluateSearchFilters()); + appendFlag(sb, "requestBusinessContext", content.getRequestBusinessContext() == null ? null : true); + appendVal(sb, "partialProcessing", format(content.getPartialProcessing())); + appendVal(sb, "initialPartialProcessing", format(content.getInitialPartialProcessing())); + appendVal(sb, "focusConflictResolution", content.getFocusConflictResolution()); appendVal(sb, "tracingProfile", tracingProfile); removeLastComma(sb); sb.append(")"); @@ -760,10 +482,12 @@ private void appendPpFlag(StringBuilder sb, PartialProcessingTypeType option, St sb.append(label).append(value).append(","); } + @SuppressWarnings("MethodDoesntCallSuperMethod") public ModelExecuteOptions clone() { - // not much efficient, but... - ModelExecuteOptions clone = fromModelExecutionOptionsType(toModelExecutionOptionsType()); - clone.setPreAuthorized(this.preAuthorized); + ModelExecuteOptions clone = new ModelExecuteOptions(content.clone()); + clone.preAuthorized = this.preAuthorized; + clone.evaluateAllAssignmentRelationsOnRecompute = this.evaluateAllAssignmentRelationsOnRecompute; + clone.tracingProfile = this.tracingProfile; return clone; } @@ -773,10 +497,10 @@ public boolean notEmpty() { } public PartialProcessingOptionsType getOrCreatePartialProcessing() { - if (partialProcessing == null) { - partialProcessing = new PartialProcessingOptionsType(); + if (content.getPartialProcessing() == null) { + content.setPartialProcessing(new PartialProcessingOptionsType()); } - return partialProcessing; + return content.getPartialProcessing(); } public static GetOperationOptions toGetOperationOptions(ModelExecuteOptions modelOptions) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java index c26f085d4bb..a19e7058387 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/ModelCrudService.java @@ -160,7 +160,7 @@ public String addObject(PrismObject object, ModelExecu if (options == null) { if (StringUtils.isNotEmpty(objectType.getVersion())) { - options = ModelExecuteOptions.createOverwrite(); + options = ModelExecuteOptions.create(prismContext).overwrite(); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java index e87f5922074..fb1d90b536d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ExecuteDeltasTaskHandler.java @@ -66,9 +66,9 @@ public TaskRunResult run(RunningTask task, TaskPartitionDefinitionType partition } else { deltas = deltasProperty.getRealValues(); } - PrismProperty optionsProperty = task.getExtensionPropertyOrClone(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); - ModelExecuteOptions options = optionsProperty != null ? - ModelExecuteOptions.fromModelExecutionOptionsType(optionsProperty.getRealValue()) : null; + ModelExecuteOptionsType optionsBean = task.getExtensionContainerRealValueOrClone(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); + ModelExecuteOptions options = optionsBean != null ? + ModelExecuteOptions.fromModelExecutionOptionsType(optionsBean) : null; try { Collection> objectDeltas = new ArrayList<>(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java index f33a181539f..5ab94b23b7c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java @@ -1644,7 +1644,7 @@ public ExecuteCredentialResetResponseType executeCredentialsReset(PrismObject> result = modelService.executeChanges( - MiscUtil.createCollection(userDelta), ModelExecuteOptions.createRaw(), task, parentResult); + MiscUtil.createCollection(userDelta), ModelExecuteOptions.create(prismContext).raw(), task, parentResult); } catch (ObjectNotFoundException | SchemaException | CommunicationException | ConfigurationException | SecurityViolationException | ExpressionEvaluationException | ObjectAlreadyExistsException | PolicyViolationException e) { response.message(LocalizationUtil.createForFallbackMessage("Failed to reset credential: " + e.getMessage())); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java index c58bf1646ba..9fd95d9ab24 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ObjectMerger.java @@ -108,10 +108,10 @@ public Collection> executedDeltas = new ArrayList<>(); LOGGER.trace("Executing right link delta (raw): {}", deltas.getRightLinkDelta()); - executeDelta(deltas.getRightLinkDelta(), ModelExecuteOptions.createRaw(), executedDeltas, task, result); + executeDelta(deltas.getRightLinkDelta(), ModelExecuteOptions.create(prismContext).raw(), executedDeltas, task, result); LOGGER.trace("Executing left link delta (raw): {}", deltas.getLeftLinkDelta()); - executeDelta(deltas.getLeftLinkDelta(), ModelExecuteOptions.createRaw(), executedDeltas, task, result); + executeDelta(deltas.getLeftLinkDelta(), ModelExecuteOptions.create(prismContext).raw(), executedDeltas, task, result); LOGGER.trace("Executing left object delta: {}", deltas.getLeftObjectDelta()); executeDelta(deltas.getLeftObjectDelta(), null, executedDeltas, task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index 6d701bff7ee..fcd2f3e2353 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -1678,12 +1678,11 @@ public TaskType executeChangesAsynchronously(Collection> deltas, deltasProperty.setRealValues(deltasBeans.toArray(new ObjectDeltaType[0])); newTask.asPrismObject().addExtensionItem(deltasProperty); if (options != null) { - //noinspection unchecked - PrismPropertyDefinition optionsDefinition = prismContext.getSchemaRegistry() - .findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); - PrismProperty optionsProperty = optionsDefinition.instantiate(); - optionsProperty.setRealValue(options.toModelExecutionOptionsType()); - newTask.asPrismObject().addExtensionItem(optionsProperty); + PrismContainerDefinition optionsDefinition = prismContext.getSchemaRegistry() + .findContainerDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); + PrismContainer optionsContainer = optionsDefinition.instantiate(); + optionsContainer.setRealValue(options.toModelExecutionOptionsType()); + newTask.asPrismObject().addExtensionItem(optionsContainer); } ObjectDelta taskAddDelta = DeltaFactory.Object.createAddDelta(newTask.asPrismObject()); Collection> operations = modelService diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java index 9b23ad08f63..6a4633be278 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java @@ -407,16 +407,16 @@ private void addObject(PrismObject object, boolean ove if (importOptions.getModelExecutionOptions() != null) { modelOptions = ModelExecuteOptions.fromModelExecutionOptionsType(importOptions.getModelExecutionOptions()); } else { - modelOptions = new ModelExecuteOptions(); + modelOptions = ModelExecuteOptions.create(prismContext); } if (modelOptions.getRaw() == null) { - modelOptions.setRaw(true); + modelOptions.raw(true); } if (modelOptions.getOverwrite() == null) { - modelOptions.setOverwrite(overwrite); + modelOptions.overwrite(overwrite); } if (isFalse(importOptions.isEncryptProtectedValues()) && modelOptions.getNoCrypt() == null) { - modelOptions.setNoCrypt(true); + modelOptions.noCrypt(true); } Collection> executedDeltas = modelService diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index f02c218c9ee..01bf0a1038c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -721,7 +721,7 @@ private void logFinalReadable(LensContext context) { DebugUtil.indentDebugDump(sb, 1); sb.append(projectionContext.getHumanReadableName()); if (projectionContext.isTombstone()) { - sb.append(" THOMBSTONE"); + sb.append(" TOMBSTONE"); } sb.append(": "); sb.append(projectionContext.getSynchronizationPolicyDecision()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkConflictResolver.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkConflictResolver.java index a0495883f03..1ee8d911005 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkConflictResolver.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/ClockworkConflictResolver.java @@ -11,6 +11,7 @@ import com.evolveum.midpoint.model.api.ProgressInformation; import com.evolveum.midpoint.model.api.hooks.HookOperationMode; import com.evolveum.midpoint.model.impl.util.ModelImplUtils; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.repo.api.ConflictWatcher; import com.evolveum.midpoint.repo.api.PreconditionViolationException; @@ -46,6 +47,7 @@ public class ClockworkConflictResolver { @Autowired private Clockwork clockwork; @Autowired private ContextFactory contextFactory; @Autowired @Qualifier("cacheRepositoryService") private transient RepositoryService repositoryService; + @Autowired private PrismContext prismContext; private static final int DEFAULT_MAX_CONFLICT_RESOLUTION_ATTEMPTS = 1; // synchronize with common-core-3.xsd private static final int DEFAULT_CONFLICT_RESOLUTION_DELAY_UNIT = 5000; // synchronize with common-core-3.xsd @@ -110,7 +112,7 @@ private HookOperationMode resolveFocusConflict(LensContex return HookOperationMode.FOREGROUND; } PrismObject focusObject = context.getFocusContext() != null ? context.getFocusContext().getObjectAny() : null; - ModelExecuteOptions options = new ModelExecuteOptions(); + ModelExecuteOptions options = new ModelExecuteOptions(prismContext); switch (resolutionPolicy.getAction()) { case FAIL: throw new SystemException("Conflict detected while updating " + focusObject); case LOG: @@ -119,7 +121,7 @@ private HookOperationMode resolveFocusConflict(LensContex case RECOMPUTE: break; case RECONCILE: - options.setReconcile(); + options.reconcile(); break; default: throw new IllegalStateException("Unsupported conflict resolution action: " + resolutionPolicy.getAction()); @@ -152,7 +154,7 @@ private HookOperationMode resolveFocusConflict(LensContex ConflictResolutionType focusConflictResolution = new ConflictResolutionType(); focusConflictResolution.setAction(ConflictResolutionActionType.ERROR); - options.setFocusConflictResolution(focusConflictResolution); + options.focusConflictResolution(focusConflictResolution); int preconditionAttempts = 0; while (true) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java index 5576dac902f..8749aad5a33 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensContext.java @@ -663,10 +663,7 @@ public void setStats(LensContextStatsType stats) { } public OperationBusinessContextType getRequestBusinessContext() { - if (options == null) { - return null; - } - return options.getRequestBusinessContext(); + return ModelExecuteOptions.getRequestBusinessContext(options); } /** diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java index 9cc1018dd64..778b72f8d61 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/actions/RecomputeExecutor.java @@ -45,7 +45,7 @@ public PipelineData execute(ActionExpressionType action, PipelineData input, Exe boolean dryRun = operationsHelper.getDryRun(action, input, context, globalResult); ModelExecuteOptions options = operationsHelper.getOptions(action, input, context, globalResult); - options.setReconcile(true); + options.reconcile(true); TriggerCreationType triggerCreation = action instanceof RecomputeActionExpressionType ? ((RecomputeActionExpressionType) action).getTriggered() : null; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java index 7efeb5e5133..eb77fc661a3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/helpers/OperationsHelper.java @@ -87,13 +87,13 @@ public ModelExecuteOptions getOptions(ActionExpressionType action, PipelineData Boolean skipApprovals = expressionHelper.getArgumentAsBoolean(action.getParameter(), PARAM_SKIP_APPROVALS, input, context, null, PARAM_SKIP_APPROVALS, result); if (Boolean.TRUE.equals(raw)) { - options.setRaw(true); + options.raw(true); } if (Boolean.TRUE.equals(skipApprovals)) { if (options.getPartialProcessing() != null) { options.getPartialProcessing().setApprovals(SKIP); } else { - options.setPartialProcessing(new PartialProcessingOptionsType().approvals(SKIP)); + options.partialProcessing(new PartialProcessingOptionsType().approvals(SKIP)); } } return options; @@ -109,7 +109,7 @@ private ModelExecuteOptions getRawOptions(ActionExpressionType action, PipelineD if (optionsBean != null) { return ModelExecuteOptions.fromModelExecutionOptionsType(optionsBean); } else { - return new ModelExecuteOptions(); + return ModelExecuteOptions.create(prismContext); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java index 9bfc1e0ac62..e3a264530bc 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/FocusValidityScannerTaskHandler.java @@ -267,7 +267,7 @@ private void reconcileFocus(PrismObject focus, Task workerTask, Opera LOGGER.trace("Recomputing focus {}", focus); // We want reconcile option here. There may be accounts that are in wrong activation state. // We will not notice that unless we go with reconcile. - LensContext lensContext = contextFactory.createRecomputeContext(focus, ModelExecuteOptions.createReconcile(), workerTask, result); + LensContext lensContext = contextFactory.createRecomputeContext(focus, new ModelExecuteOptions(prismContext).reconcile(), workerTask, result); TimeValidityPolicyConstraintType constraint = getValidityPolicyConstraint(workerTask); if (hasNotifyAction(workerTask) && constraint != null) { EvaluatedPolicyRuleImpl policyRule = new EvaluatedPolicyRuleImpl(CloneUtil.clone(workerTask.getPolicyRule()), null, null, prismContext); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java index 167c9358b47..8cf726fcdda 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/RecomputeTaskHandler.java @@ -102,7 +102,7 @@ private ModelExecuteOptions getOptions(Task coordinatorTask) throws SchemaExcept return optionsFromTask; } else { // Make reconcile the default (for compatibility). - return ModelExecuteOptions.createReconcile(); + return ModelExecuteOptions.create(prismContext).reconcile(); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java index 5dd418ec1dc..c6f9608b7c2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationServiceImpl.java @@ -759,9 +759,9 @@ private void reactToChange(SynchronizationContext syncC } } - ModelExecuteOptions options = new ModelExecuteOptions(); - options.setReconcile(doReconciliation); - options.setLimitPropagation(syncCtx.isLimitPropagation()); + ModelExecuteOptions options = ModelExecuteOptions.create(prismContext) + .reconcile(doReconciliation) + .limitPropagation(syncCtx.isLimitPropagation()); final boolean willSynchronize = isSynchronize(reaction); LensContext lensContext; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/RecomputeTriggerHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/RecomputeTriggerHandler.java index a128ba05bb7..0f94063f090 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/RecomputeTriggerHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/trigger/RecomputeTriggerHandler.java @@ -8,6 +8,7 @@ import javax.annotation.PostConstruct; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.task.api.RunningTask; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.TriggerType; @@ -42,25 +43,21 @@ public class RecomputeTriggerHandler implements SingleTriggerHandler { @Autowired private TriggerHandlerRegistry triggerHandlerRegistry; @Autowired private Clockwork clockwork; @Autowired private ContextFactory contextFactory; + @Autowired private PrismContext prismContext; @PostConstruct private void initialize() { triggerHandlerRegistry.register(HANDLER_URI, this); } - /* (non-Javadoc) - * @see com.evolveum.midpoint.model.trigger.TriggerHandler#handle(com.evolveum.midpoint.prism.PrismObject) - */ @Override public void handle(PrismObject object, TriggerType trigger, RunningTask task, OperationResult result) { try { LOGGER.trace("Recomputing {}", object); // Reconcile option used for compatibility. TODO: do we need it? - LensContext lensContext = contextFactory.createRecomputeContext(object, ModelExecuteOptions.createReconcile(), task, result); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Recomputing of {}: context:\n{}", object, lensContext.debugDump()); - } + LensContext lensContext = contextFactory.createRecomputeContext(object, new ModelExecuteOptions(prismContext).reconcile(), task, result); + LOGGER.trace("Recomputing of {}: context:\n{}", object, lensContext.debugDumpLazily()); clockwork.run(lensContext, task, result); LOGGER.trace("Recomputing of {}: {}", object, result.getStatus()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java index 776f8a04a4a..c591889a079 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/AbstractSearchIterativeModelTaskHandler.java @@ -1,159 +1,158 @@ -/* - * Copyright (c) 2010-2019 Evolveum and contributors - * - * This work is dual-licensed under the Apache License 2.0 - * and European Union Public License. See LICENSE file for details. - */ -package com.evolveum.midpoint.model.impl.util; - -import java.util.Collection; - -import com.evolveum.midpoint.model.api.ModelAuthorizationAction; -import com.evolveum.midpoint.security.enforcer.api.AuthorizationParameters; -import org.springframework.beans.factory.annotation.Autowired; - -import com.evolveum.midpoint.model.api.ModelExecuteOptions; -import com.evolveum.midpoint.model.common.SystemObjectCache; -import com.evolveum.midpoint.model.impl.ModelObjectResolver; -import com.evolveum.midpoint.model.common.expression.ExpressionEnvironment; -import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismProperty; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; -import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; -import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; -import com.evolveum.midpoint.repo.common.task.AbstractSearchIterativeResultHandler; -import com.evolveum.midpoint.repo.common.task.AbstractSearchIterativeTaskHandler; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskRunResult; -import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; - -/** - * @author semancik - * - */ -public abstract class AbstractSearchIterativeModelTaskHandler> extends AbstractSearchIterativeTaskHandler { - - // WARNING! This task handler is efficiently singleton! - // It is a spring bean and it is supposed to handle all search task instances - // Therefore it must not have task-specific fields. It can only contain fields specific to - // all tasks of a specified type - // If you need to store fields specific to task instance or task run the ResultHandler is a good place to do that. - - @Autowired protected ModelObjectResolver modelObjectResolver; - @Autowired protected SecurityEnforcer securityEnforcer; - @Autowired protected ExpressionFactory expressionFactory; - @Autowired protected SystemObjectCache systemObjectCache; - - private static final Trace LOGGER = TraceManager.getTrace(AbstractSearchIterativeModelTaskHandler.class); - - protected AbstractSearchIterativeModelTaskHandler(String taskName, String taskOperationPrefix) { - super(taskName, taskOperationPrefix); - } - - @Override - protected ObjectQuery preProcessQuery(ObjectQuery query, Task coordinatorTask, OperationResult opResult) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { - // TODO consider which variables should go here (there's no focus, shadow, resource - only configuration) - if (ExpressionUtil.hasExpressions(query.getFilter())) { - PrismObject configuration = systemObjectCache.getSystemConfiguration(opResult); - ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, null, null, - configuration != null ? configuration.asObjectable() : null, prismContext); - try { - ExpressionEnvironment env = new ExpressionEnvironment<>(coordinatorTask, opResult); - ModelExpressionThreadLocalHolder.pushExpressionEnvironment(env); - query = ExpressionUtil.evaluateQueryExpressions(query, variables, getExpressionProfile(), expressionFactory, - prismContext, "evaluate query expressions", coordinatorTask, opResult); - } finally { - ModelExpressionThreadLocalHolder.popExpressionEnvironment(); - } - } - - return query; - } - - @Override - protected Integer countObjects(Class type, ObjectQuery query, Collection> queryOptions, Task coordinatorTask, OperationResult opResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { - return modelObjectResolver.countObjects(type, query, queryOptions, coordinatorTask, opResult); - } - - @Override - protected void searchIterative(Class type, ObjectQuery query, Collection> searchOptions, ResultHandler resultHandler, Task coordinatorTask, OperationResult opResult) - throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { - modelObjectResolver.searchIterative(type, query, searchOptions, resultHandler, coordinatorTask, opResult); - } - - protected T resolveObjectRef(Class type, TaskRunResult runResult, Task task, OperationResult opResult) { - String typeName = type.getSimpleName(); - String objectOid = task.getObjectOid(); - if (objectOid == null) { - LOGGER.error("Import: No {} OID specified in the task", typeName); - opResult.recordFatalError("No "+typeName+" OID specified in the task"); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); - return null; - } - - try { - return modelObjectResolver.getObject(type, objectOid, null, task, opResult); - } catch (ObjectNotFoundException ex) { - LOGGER.error("Handler: {} {} not found: {}", typeName, objectOid, ex.getMessage(), ex); - // This is bad. The resource does not exist. Permanent problem. - opResult.recordFatalError(typeName+" not found " + objectOid, ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); - return null; - } catch (SchemaException ex) { - LOGGER.error("Handler: Error dealing with schema: {}", ex.getMessage(), ex); - // Not sure about this. But most likely it is a misconfigured resource or connector - // It may be worth to retry. Error is fatal, but may not be permanent. - opResult.recordFatalError("Error dealing with schema: " + ex.getMessage(), ex); - runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); - return null; - } catch (RuntimeException ex) { - LOGGER.error("Handler: Internal Error: {}", ex.getMessage(), ex); - // Can be anything ... but we can't recover from that. - // It is most likely a programming error. Does not make much sense to retry. - opResult.recordFatalError("Internal Error: " + ex.getMessage(), ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); - return null; - } catch (CommunicationException ex) { - LOGGER.error("Handler: Error getting {} {}: {}", typeName, objectOid, ex.getMessage(), ex); - opResult.recordFatalError("Error getting "+typeName+" " + objectOid+": "+ex.getMessage(), ex); - runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); - return null; - } catch (ConfigurationException | ExpressionEvaluationException | SecurityViolationException ex) { - LOGGER.error("Handler: Error getting {} {}: {}", typeName, objectOid, ex.getMessage(), ex); - opResult.recordFatalError("Error getting "+typeName+" " + objectOid+": "+ex.getMessage(), ex); - runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); - return null; - } - } - - protected ModelExecuteOptions getExecuteOptionsFromTask(Task task) { - PrismProperty property = task.getExtensionPropertyOrClone(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); - return property != null ? ModelExecuteOptions.fromModelExecutionOptionsType(property.getRealValue()) : null; - } - - @Override - protected void checkRawAuthorization(Task task, OperationResult result) - throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, - ConfigurationException, ExpressionEvaluationException { - securityEnforcer.authorize(ModelAuthorizationAction.RAW_OPERATION.getUrl(), null, AuthorizationParameters.EMPTY, null, task, result); - } -} +/* + * Copyright (c) 2010-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.model.impl.util; + +import java.util.Collection; + +import com.evolveum.midpoint.model.api.ModelAuthorizationAction; +import com.evolveum.midpoint.security.enforcer.api.AuthorizationParameters; +import org.springframework.beans.factory.annotation.Autowired; + +import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.model.common.SystemObjectCache; +import com.evolveum.midpoint.model.impl.ModelObjectResolver; +import com.evolveum.midpoint.model.common.expression.ExpressionEnvironment; +import com.evolveum.midpoint.model.common.expression.ModelExpressionThreadLocalHolder; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; +import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; +import com.evolveum.midpoint.repo.common.task.AbstractSearchIterativeResultHandler; +import com.evolveum.midpoint.repo.common.task.AbstractSearchIterativeTaskHandler; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.task.api.TaskRunResult; +import com.evolveum.midpoint.task.api.TaskRunResult.TaskRunResultStatus; +import com.evolveum.midpoint.util.exception.CommunicationException; +import com.evolveum.midpoint.util.exception.ConfigurationException; +import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; +import com.evolveum.midpoint.util.exception.ObjectNotFoundException; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.util.exception.SecurityViolationException; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ModelExecuteOptionsType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; + +/** + * @author semancik + * + */ +public abstract class AbstractSearchIterativeModelTaskHandler> extends AbstractSearchIterativeTaskHandler { + + // WARNING! This task handler is efficiently singleton! + // It is a spring bean and it is supposed to handle all search task instances + // Therefore it must not have task-specific fields. It can only contain fields specific to + // all tasks of a specified type + // If you need to store fields specific to task instance or task run the ResultHandler is a good place to do that. + + @Autowired protected ModelObjectResolver modelObjectResolver; + @Autowired protected SecurityEnforcer securityEnforcer; + @Autowired protected ExpressionFactory expressionFactory; + @Autowired protected SystemObjectCache systemObjectCache; + + private static final Trace LOGGER = TraceManager.getTrace(AbstractSearchIterativeModelTaskHandler.class); + + protected AbstractSearchIterativeModelTaskHandler(String taskName, String taskOperationPrefix) { + super(taskName, taskOperationPrefix); + } + + @Override + protected ObjectQuery preProcessQuery(ObjectQuery query, Task coordinatorTask, OperationResult opResult) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException { + // TODO consider which variables should go here (there's no focus, shadow, resource - only configuration) + if (ExpressionUtil.hasExpressions(query.getFilter())) { + PrismObject configuration = systemObjectCache.getSystemConfiguration(opResult); + ExpressionVariables variables = ModelImplUtils.getDefaultExpressionVariables(null, null, null, + configuration != null ? configuration.asObjectable() : null, prismContext); + try { + ExpressionEnvironment env = new ExpressionEnvironment<>(coordinatorTask, opResult); + ModelExpressionThreadLocalHolder.pushExpressionEnvironment(env); + query = ExpressionUtil.evaluateQueryExpressions(query, variables, getExpressionProfile(), expressionFactory, + prismContext, "evaluate query expressions", coordinatorTask, opResult); + } finally { + ModelExpressionThreadLocalHolder.popExpressionEnvironment(); + } + } + + return query; + } + + @Override + protected Integer countObjects(Class type, ObjectQuery query, Collection> queryOptions, Task coordinatorTask, OperationResult opResult) throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { + return modelObjectResolver.countObjects(type, query, queryOptions, coordinatorTask, opResult); + } + + @Override + protected void searchIterative(Class type, ObjectQuery query, Collection> searchOptions, ResultHandler resultHandler, Task coordinatorTask, OperationResult opResult) + throws SchemaException, ObjectNotFoundException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { + modelObjectResolver.searchIterative(type, query, searchOptions, resultHandler, coordinatorTask, opResult); + } + + protected T resolveObjectRef(Class type, TaskRunResult runResult, Task task, OperationResult opResult) { + String typeName = type.getSimpleName(); + String objectOid = task.getObjectOid(); + if (objectOid == null) { + LOGGER.error("Import: No {} OID specified in the task", typeName); + opResult.recordFatalError("No "+typeName+" OID specified in the task"); + runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + return null; + } + + try { + return modelObjectResolver.getObject(type, objectOid, null, task, opResult); + } catch (ObjectNotFoundException ex) { + LOGGER.error("Handler: {} {} not found: {}", typeName, objectOid, ex.getMessage(), ex); + // This is bad. The resource does not exist. Permanent problem. + opResult.recordFatalError(typeName+" not found " + objectOid, ex); + runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + return null; + } catch (SchemaException ex) { + LOGGER.error("Handler: Error dealing with schema: {}", ex.getMessage(), ex); + // Not sure about this. But most likely it is a misconfigured resource or connector + // It may be worth to retry. Error is fatal, but may not be permanent. + opResult.recordFatalError("Error dealing with schema: " + ex.getMessage(), ex); + runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + return null; + } catch (RuntimeException ex) { + LOGGER.error("Handler: Internal Error: {}", ex.getMessage(), ex); + // Can be anything ... but we can't recover from that. + // It is most likely a programming error. Does not make much sense to retry. + opResult.recordFatalError("Internal Error: " + ex.getMessage(), ex); + runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + return null; + } catch (CommunicationException ex) { + LOGGER.error("Handler: Error getting {} {}: {}", typeName, objectOid, ex.getMessage(), ex); + opResult.recordFatalError("Error getting "+typeName+" " + objectOid+": "+ex.getMessage(), ex); + runResult.setRunResultStatus(TaskRunResultStatus.TEMPORARY_ERROR); + return null; + } catch (ConfigurationException | ExpressionEvaluationException | SecurityViolationException ex) { + LOGGER.error("Handler: Error getting {} {}: {}", typeName, objectOid, ex.getMessage(), ex); + opResult.recordFatalError("Error getting "+typeName+" " + objectOid+": "+ex.getMessage(), ex); + runResult.setRunResultStatus(TaskRunResultStatus.PERMANENT_ERROR); + return null; + } + } + + protected ModelExecuteOptions getExecuteOptionsFromTask(Task task) { + ModelExecuteOptionsType options = task.getExtensionContainerRealValueOrClone(SchemaConstants.MODEL_EXTENSION_EXECUTE_OPTIONS); + return options != null ? ModelExecuteOptions.fromModelExecutionOptionsType(options) : null; + } + + @Override + protected void checkRawAuthorization(Task task, OperationResult result) + throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, + ConfigurationException, ExpressionEvaluationException { + securityEnforcer.authorize(ModelAuthorizationAction.RAW_OPERATION.getUrl(), null, AuthorizationParameters.EMPTY, null, task, result); + } +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java index 9db150d2bb1..53c176d6fc0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/DeleteTaskHandler.java @@ -157,7 +157,7 @@ private TaskRunResult runInternal(RunningTask task) { ModelExecuteOptions execOptions; if (optionRaw) { searchOptions = SelectorOptions.createCollection(GetOperationOptions.createRaw()); - execOptions = ModelExecuteOptions.createRaw(); + execOptions = ModelExecuteOptions.create(prismContext).raw(); } else { searchOptions = null; execOptions = null; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java index a60c602dedd..6b37631038b 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/ModelImplUtils.java @@ -565,19 +565,12 @@ public static void clearRequestee(Task task) { setRequestee(task, (PrismObject) null); } - public static ModelExecuteOptions getModelExecuteOptions(@NotNull Task task) throws SchemaException { - PrismProperty item = task.getExtensionPropertyOrClone(SchemaConstants.C_MODEL_EXECUTE_OPTIONS); - if (item == null || item.isEmpty()) { + public static ModelExecuteOptions getModelExecuteOptions(@NotNull Task task) { + ModelExecuteOptionsType options = task.getExtensionContainerRealValueOrClone(SchemaConstants.C_MODEL_EXECUTE_OPTIONS); + if (options == null) { return null; - } else if (item.getValues().size() > 1) { - throw new SchemaException("Unexpected number of values for option 'modelExecuteOptions'."); } else { - ModelExecuteOptionsType modelExecuteOptionsType = item.getValues().iterator().next().getValue(); - if (modelExecuteOptionsType != null) { - return ModelExecuteOptions.fromModelExecutionOptionsType(modelExecuteOptionsType); - } else { - return null; - } + return ModelExecuteOptions.fromModelExecutionOptionsType(options); } } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestPolicyStateRecording.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestPolicyStateRecording.java index c44bc287f50..d5225ea2952 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestPolicyStateRecording.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestPolicyStateRecording.java @@ -24,7 +24,6 @@ import java.util.Collections; import java.util.List; -import static com.evolveum.midpoint.model.api.ModelExecuteOptions.createReconcile; import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.createAssignmentTo; import static org.testng.AssertJUnit.assertEquals; @@ -147,7 +146,8 @@ public void test120RecomputeJack() throws Exception { // WHEN when(); - executeChanges(prismContext.deltaFactory().object().createEmptyModifyDelta(UserType.class, USER_JACK_OID), createReconcile(), getTestTask(), getTestOperationResult()); + executeChanges(prismContext.deltaFactory().object().createEmptyModifyDelta(UserType.class, USER_JACK_OID), + executeOptions().reconcile(), getTestTask(), getTestOperationResult()); // THEN then(); diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestReconScript.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestReconScript.java index e7bca1e3126..dd5d90d4d99 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestReconScript.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestReconScript.java @@ -52,19 +52,19 @@ public void text001testReconcileScriptsWhenProvisioning() throws Exception { deltas.add(delta); task.setChannel(QNameUtil.qNameToUri(SchemaConstants.CHANGE_CHANNEL_RECON)); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, parentResult); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, parentResult); delta = createModifyUserReplaceDelta(USER_JACK_OID, UserType.F_FULL_NAME, new PolyString("tralala")); deltas = new ArrayList<>(); deltas.add(delta); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, parentResult); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, parentResult); delta = createModifyUserReplaceDelta(USER_BARBOSSA_OID, UserType.F_FULL_NAME, new PolyString("tralala")); deltas = new ArrayList<>(); deltas.add(delta); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, parentResult); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, parentResult); for (ScriptHistoryEntry script : getDummyResource().getScriptHistory()) { String userName = (String) script.getParams().get("midpoint_usercn"); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java index 9b75b547014..e7a0a430d41 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java @@ -247,7 +247,7 @@ public void test056RecomputeUserJackEffectiveEnable() throws Exception { assertEnableTimestampFocus(userJackBefore, null, start); // WHEN - modifyUserReplace(USER_JACK_OID, SchemaConstants.PATH_ACTIVATION_EFFECTIVE_STATUS, ModelExecuteOptions.createRaw(), task, result, ActivationStatusType.DISABLED); + modifyUserReplace(USER_JACK_OID, SchemaConstants.PATH_ACTIVATION_EFFECTIVE_STATUS, executeOptions().raw(), task, result, ActivationStatusType.DISABLED); PrismObject userJack = getUser(USER_JACK_OID); display("User after change execution", userJack); assertUserJack(userJack, "Jack Sparrow"); @@ -980,7 +980,7 @@ public void test147ModifyUserJackUnassignAccountDummyRedRaw() throws Exception { // WHEN when(); - modelService.executeChanges(MiscSchemaUtil.createCollection(userDelta), ModelExecuteOptions.createRaw(), task, result); + modelService.executeChanges(MiscSchemaUtil.createCollection(userDelta), executeOptions().raw(), task, result); // THEN then(); @@ -1175,7 +1175,7 @@ public void test152ModifyAccountsJackDisable() throws Exception { when(); ObjectDelta innocentDelta = createModifyUserReplaceDelta(USER_JACK_OID, UserType.F_LOCALITY, userJack.asObjectable().getLocality().toPolyString()); - modelService.executeChanges(MiscSchemaUtil.createCollection(innocentDelta), ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(MiscSchemaUtil.createCollection(innocentDelta), executeOptions().reconcile(), task, result); // THEN then(); @@ -1216,7 +1216,7 @@ public void test153ModifyAccountsJackEnable() throws Exception { ObjectDelta innocentDelta = createModifyUserReplaceDelta(USER_JACK_OID, UserType.F_LOCALITY, userJack.asObjectable().getLocality().toPolyString()); - modelService.executeChanges(MiscSchemaUtil.createCollection(innocentDelta), ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(MiscSchemaUtil.createCollection(innocentDelta), executeOptions().reconcile(), task, result); // THEN @@ -1793,7 +1793,7 @@ public void test231JackRecomputeReconcile() throws Exception { // WHEN when(); - recomputeUser(USER_JACK_OID, ModelExecuteOptions.createReconcile(), task, result); + recomputeUser(USER_JACK_OID, executeOptions().reconcile(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConnectorDummyFake.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConnectorDummyFake.java index 5b344903601..9b9bfa33719 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConnectorDummyFake.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConnectorDummyFake.java @@ -340,7 +340,7 @@ public void test300UpgradeRawAddDelete() throws Exception { getResourceDefinition(), connectorDummyOid); resourceDelta.addModification(connectorRefDeltaAdd); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN executeChanges(resourceDelta, options, task, result); @@ -370,7 +370,7 @@ public void test350DowngradeRawAddDelete() throws Exception { resourceDelta.addModification(connectorRefDeltaAdd); Collection> deltas = MiscSchemaUtil.createCollection(resourceDelta); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN modelService.executeChanges(deltas, options, task, result); @@ -399,7 +399,7 @@ public void test400UpgradeRawReplace() throws Exception { resourceDelta.addModification(connectorRefDeltaReplace); Collection> deltas = MiscSchemaUtil.createCollection(resourceDelta); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN modelService.executeChanges(deltas, options, task, result); @@ -427,7 +427,7 @@ public void test450DowngradeRawReplace() throws Exception { getResourceDefinition(), connectorDummyFakeOid); resourceDelta.addModification(connectorRefDeltaReplace); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN executeChanges(resourceDelta, options, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java index 5605002acb8..0e67c0d1968 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestConsistencySimple.java @@ -166,7 +166,7 @@ private void executeTest(FocusOperation focusOperation, ShadowOperation shadowOp ObjectDelta removeLinkRefDelta = deltaFor(UserType.class) .item(UserType.F_LINK_REF).replace() .asObjectDelta(USER_JACK_OID); - executeChanges(removeLinkRefDelta, ModelExecuteOptions.createRaw(), task, result); + executeChanges(removeLinkRefDelta, executeOptions().raw(), task, result); jack = getUser(USER_JACK_OID); assertEquals("Unexpected # of accounts for jack after linkRef removal", 0, jack.asObjectable().getLinkRef().size()); @@ -180,7 +180,7 @@ private void executeTest(FocusOperation focusOperation, ShadowOperation shadowOp .item(ShadowType.F_EXISTS).replace(Boolean.FALSE) .item(ShadowType.F_PRIMARY_IDENTIFIER_VALUE).replace() .asObjectDelta(shadowBefore.getOid()); - executeChanges(markAsDead, ModelExecuteOptions.createRaw(), task, result); + executeChanges(markAsDead, executeOptions().raw(), task, result); } assertNotNull("jack's shadow does not exist", getObject(ShadowType.class, shadowBefore.getOid())); } @@ -205,7 +205,7 @@ private void executeTest(FocusOperation focusOperation, ShadowOperation shadowOp case RECONCILE: ObjectDelta emptyDelta = prismContext.deltaFactory().object() .createEmptyModifyDelta(UserType.class, USER_JACK_OID); - modelService.executeChanges(MiscSchemaUtil.createCollection(emptyDelta), ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(MiscSchemaUtil.createCollection(emptyDelta), executeOptions().reconcile(), task, result); break; default: throw new IllegalArgumentException("focusOperation: " + focusOperation); @@ -272,7 +272,7 @@ private void cleanUpBeforeTest(Task task, OperationResult result) throws Excepti } ObjectDelta killLinkRefDelta = deltaFor(UserType.class) .item(UserType.F_LINK_REF).replace().asObjectDelta(USER_JACK_OID); - executeChanges(killLinkRefDelta, ModelExecuteOptions.createRaw(), task, result); + executeChanges(killLinkRefDelta, executeOptions().raw(), task, result); } List> jacksShadows = getJacksShadows(result); for (PrismObject shadow : jacksShadows) { diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLoggingConfiguration.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLoggingConfiguration.java index e8479b0b67a..cd5422a5607 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLoggingConfiguration.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestLoggingConfiguration.java @@ -156,7 +156,7 @@ public void test004OverwriteInitialConfiguration() throws Exception { tailer.assertMarkerLogged(LogfileTestTailer.LEVEL_TRACE, ProfilingDataManager.Subsystem.PROVISIONING.name()); ObjectDelta delta = DeltaFactory.Object.createAddDelta(systemConfiguration); - ModelExecuteOptions options = ModelExecuteOptions.createOverwrite(); + ModelExecuteOptions options = executeOptions().overwrite(); // WHEN modelService.executeChanges(MiscSchemaUtil.createCollection(delta), options, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java index ec6a37d6651..7620dfcd8df 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestModelServiceContract.java @@ -1000,7 +1000,7 @@ public void test130PreviewModifyUserJackAssignAccount() { deltas.add(accountAssignmentUserDelta); // WHEN - modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + modelInteractionService.previewChanges(deltas, executeOptions(), task, result); // THEN result.computeStatus(); @@ -2653,7 +2653,7 @@ public void test198ModifyUserJackRaw() throws Exception { Collection> deltas = MiscUtil.createCollection(objectDelta); // WHEN - modelService.executeChanges(deltas, ModelExecuteOptions.createRaw(), task, result); + modelService.executeChanges(deltas, executeOptions().raw(), task, result); // THEN result.computeStatus(); @@ -3012,7 +3012,7 @@ public void test240AddUserCharlesRaw() throws Exception { Collection> deltas = MiscSchemaUtil.createCollection(userDelta); // WHEN - modelService.executeChanges(deltas, ModelExecuteOptions.createRaw(), task, result); + modelService.executeChanges(deltas, executeOptions().raw(), task, result); // THEN result.computeStatus(); @@ -3054,7 +3054,7 @@ public void test241DeleteUserCharlesRaw() throws Exception { Collection> deltas = MiscSchemaUtil.createCollection(userDelta); // WHEN - modelService.executeChanges(deltas, ModelExecuteOptions.createRaw(), task, result); + modelService.executeChanges(deltas, executeOptions().raw(), task, result); // THEN assertSuccess(result); @@ -3162,7 +3162,7 @@ accountJackBlueOid, getDummyResourceController(RESOURCE_DUMMY_BLUE_NAME).getAttr "Queen Anne's Revenge"); deltas.add(accountDelta); - ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); + ModelExecuteOptions options = executeOptions().reconcile(); // WHEN modelService.executeChanges(deltas, options, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java index a20ea2738e0..5749bbeb7eb 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java @@ -9,7 +9,6 @@ import static java.util.Collections.singleton; import static org.testng.AssertJUnit.*; -import static com.evolveum.midpoint.model.api.ModelExecuteOptions.createEvaluateAllAssignmentRelationsOnRecompute; import static com.evolveum.midpoint.schema.constants.SchemaConstants.PATH_ACTIVATION_DISABLE_TIMESTAMP; import java.io.File; @@ -308,7 +307,7 @@ private void doPreview(Collection> deltas, display("Input deltas: ", deltas); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -326,7 +325,7 @@ private void doPreviewFail( try { // WHEN - modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + modelInteractionService.previewChanges(deltas, null, task, result); AssertJUnit.fail("Expected exception, but it haven't come"); } catch (SchemaException e) { displayExpectedException(e); @@ -445,7 +444,7 @@ public void test200ModifyUserGuybrushDeleteAccount() throws Exception { // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN then(); @@ -486,7 +485,7 @@ public void test210GuybrushAddAccount() throws Exception { // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN then(); @@ -537,7 +536,7 @@ public void test212ModifyUserAddAccountRef() throws Exception { // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN then(); @@ -616,7 +615,7 @@ public void test221PreviewJackAssignRolePirateReconcile() throws Exception { // WHEN when(); ModelContext modelContext = modelInteractionService.previewChanges(MiscSchemaUtil.createCollection(delta), - ModelExecuteOptions.createReconcile(), task, result); + executeOptions().reconcile(), task, result); // THEN then(); @@ -709,7 +708,6 @@ public void test230GuybrushAssignAccountDummy() throws Exception { createAssignmentAssignmentHolderDelta(UserType.class, USER_GUYBRUSH_OID, ROLE_PIRATE_OID, RoleType.COMPLEX_TYPE, null, null, null, true); - ModelExecuteOptions.createReconcile(); // WHEN when(); @@ -907,7 +905,7 @@ public void test234PreviewGuybrushAddRolePirateRecon() throws Exception { ObjectDelta delta = createAssignmentAssignmentHolderDelta(UserType.class, USER_GUYBRUSH_OID, ROLE_PIRATE_OID, RoleType.COMPLEX_TYPE, null, null, null, true); - ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); + ModelExecuteOptions options = executeOptions().reconcile(); // WHEN when(); @@ -1176,7 +1174,7 @@ public void test244PreviewGuybrushAddRolePirateRelativeRecon() throws Exception // WHEN when(); ModelContext modelContext = modelInteractionService.previewChanges(MiscSchemaUtil.createCollection(delta), - ModelExecuteOptions.createReconcile(), task, result); + executeOptions().reconcile(), task, result); // THEN then(); @@ -1288,7 +1286,7 @@ ACCOUNT_SHADOW_ELAINE_DUMMY_OID, getDummyResourceObject(), DummyResourceContolle display("Input deltas: ", deltas); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -1342,7 +1340,7 @@ public void test301ModifyElaineAccountDummyDeleteAdd() throws Exception { display("Input deltas: ", deltas); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -1398,7 +1396,7 @@ ACCOUNT_SHADOW_ELAINE_DUMMY_RED_OID, getDummyResourceObject(RESOURCE_DUMMY_RED_N // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN then(); @@ -1428,7 +1426,7 @@ public void test401ModifyElaineAccountDummyRedDeleteAdd() throws Exception { // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); displayDumpable("Preview context", modelContext); // THEN @@ -1455,7 +1453,7 @@ ACCOUNT_SHADOW_ELAINE_DUMMY_BLUE_OID, getDummyResourceObject(RESOURCE_DUMMY_BLUE display("Input deltas: ", deltas); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -1512,7 +1510,7 @@ public void test501ModifyElaineAccountDummyBlueDeleteAdd() throws Exception { display("Input deltas: ", deltas); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -1568,7 +1566,7 @@ public void test600ModifyElaineUserDummyReplace() throws Exception { // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN then(); @@ -1669,7 +1667,7 @@ ACCOUNT_SHADOW_ELAINE_DUMMY_BLUE_OID, getDummyResourceObject(RESOURCE_DUMMY_BLUE // WHEN when(); - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN then(); @@ -1760,7 +1758,7 @@ public void test620AddUserCapsize() throws Exception { Collection> deltas = MiscSchemaUtil.createCollection(userDelta); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -1847,7 +1845,7 @@ public void test630AddUserRogers() throws Exception { Collection> deltas = MiscSchemaUtil.createCollection(userDelta); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -1943,7 +1941,7 @@ public void test700DisableElaineAccountTwoResources() throws Exception { display("Input deltas: ", deltas); // WHEN - ModelContext modelContext = modelInteractionService.previewChanges(deltas, new ModelExecuteOptions(), task, result); + ModelContext modelContext = modelInteractionService.previewChanges(deltas, null, task, result); // THEN displayDumpable("Preview context", modelContext); @@ -2016,7 +2014,7 @@ public void test710PreviewGuybrushHavingRoleSailorOwner() throws Exception { // WHEN when(); ModelContext modelContext = modelInteractionService.previewChanges(singleton(empty), - createEvaluateAllAssignmentRelationsOnRecompute(), task, result); + executeOptions().evaluateAllAssignmentRelationsOnRecompute(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java index 5f13d966440..3148265fb6e 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestResources.java @@ -932,7 +932,7 @@ public void test761ModifyConfigurationStringRaw() throws Exception { // WHEN when(); - modelService.executeChanges(MiscSchemaUtil.createCollection(resourceDelta), ModelExecuteOptions.createRaw(), + modelService.executeChanges(MiscSchemaUtil.createCollection(resourceDelta), executeOptions().raw(), task, result); // THEN @@ -1013,7 +1013,7 @@ private void modifyConfigurationDiffExpressionRaw( // WHEN when(); - executeChanges(diffDelta, ModelExecuteOptions.createRaw(), task, result); + executeChanges(diffDelta, executeOptions().raw(), task, result); // THEN then(); @@ -1123,7 +1123,7 @@ private void singleModify(CarefulAnt ant, int iteration, Task task IntegrationTestTools.assertNoRepoThreadLocalCache(); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN modelService.executeChanges(deltas, options , task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestTolerantAttributes.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestTolerantAttributes.java index 7eda05a597a..3391245e0bb 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestTolerantAttributes.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestTolerantAttributes.java @@ -127,7 +127,7 @@ UserType.F_DESCRIPTION, getUserDefinition().findPropertyDefinition(UserType.F_DE // WHEN when(); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, result); // THEN then(); @@ -168,7 +168,7 @@ public void test102modifyAddAttributeTolerantPattern() throws Exception { userDelta.addModification(propertyDelta); Collection> deltas = (Collection) MiscUtil.createCollection(userDelta); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, result); result.computeStatus(); TestUtil.assertSuccess(result); @@ -214,7 +214,7 @@ public void test103modifyReplaceAttributeIntolerant() throws Exception { userDelta.addModification(propertyDelta); Collection> deltas = (Collection) MiscUtil.createCollection(userDelta); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, result); result.computeStatus(); TestUtil.assertSuccess(result); @@ -261,7 +261,7 @@ public void test104modifyReplaceAttributeTolerantPattern() throws Exception { userDelta.addModification(propertyDelta); Collection> deltas = (Collection) MiscUtil.createCollection(userDelta); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, result); result.computeStatus(); TestUtil.assertSuccess(result); @@ -311,7 +311,7 @@ public void test105ModifyAddNonTolerantAttribute() throws Exception { // WHEN when(); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java index 671873a68c8..64b73b24aea 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java @@ -2222,7 +2222,7 @@ public void test245ModifyUserRappLocalityUnderReconcile() throws Exception { ObjectDelta objectDelta = createModifyUserReplaceDelta(USER_RAPP_OID, UserType.F_LOCALITY, PrismTestUtil.createPolyString("Six feet under")); Collection> deltas = MiscSchemaUtil.createCollection(objectDelta); - ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); + ModelExecuteOptions options = executeOptions().reconcile(); // WHEN modelService.executeChanges(deltas, options, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplateWithRanges.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplateWithRanges.java index 3c559263c15..7d8ac47200a 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplateWithRanges.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplateWithRanges.java @@ -19,7 +19,6 @@ import org.springframework.test.context.ContextConfiguration; import org.testng.annotations.Test; -import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.util.PrismAsserts; @@ -249,7 +248,7 @@ public void test210RemoveUnit1() throws Exception { deltaFor(UserType.class) .item(UserType.F_ORGANIZATIONAL_UNIT).delete(PolyString.fromOrig("U1")) .asObjectDelta(USER_JACK_OID), - ModelExecuteOptions.createRaw(), task, result); + executeOptions().raw(), task, result); recomputeUser(USER_JACK_OID, task, result); @@ -286,7 +285,7 @@ public void test220RemoveUnit2AndNumber() throws Exception { deltaFor(UserType.class) .item(UserType.F_ORGANIZATIONAL_UNIT).delete(PolyString.fromOrig("U2")) .asObjectDelta(USER_JACK_OID), - ModelExecuteOptions.createRaw(), task, result); + executeOptions().raw(), task, result); executeChanges( deltaFor(UserType.class) @@ -323,7 +322,7 @@ public void test230RestoreNumber() throws Exception { deltaFor(UserType.class) .item(UserType.F_ORGANIZATION).add(PolyString.fromOrig("OU: nonsense")) .asObjectDelta(USER_JACK_OID), - ModelExecuteOptions.createRaw(), task, result); + executeOptions().raw(), task, result); executeChanges( deltaFor(UserType.class) @@ -626,7 +625,7 @@ private void changeManagerRaw(String id, Task task, OperationResult result) thro deltaFor(OrgType.class) .item(OrgType.F_EXTENSION, MANAGER_ID_QNAME).replace(id) .asObjectDelta(ORG_GOVERNOR_OFFICE_OID), - ModelExecuteOptions.createRaw(), task, result); + executeOptions().raw(), task, result); } private void changeEmployeeIdRaw(String id, Task initTask, OperationResult initResult) throws CommonException { @@ -634,6 +633,6 @@ private void changeEmployeeIdRaw(String id, Task initTask, OperationResult initR deltaFor(UserType.class) .item(UserType.F_EMPLOYEE_NUMBER).replace(id) .asObjectDelta(USER_ELAINE_OID), - ModelExecuteOptions.createRaw(), initTask, initResult); + executeOptions().raw(), initTask, initResult); } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java index a98a1d0f544..5c1cdbd8f04 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java @@ -826,8 +826,8 @@ public void test180LookupLanguagesReplaceObject() throws Exception { // WHEN when(); - ModelExecuteOptions options = ModelExecuteOptions.createOverwrite(); - options.setRaw(true); + ModelExecuteOptions options = executeOptions().overwrite(); + options.raw(true); modelService.executeChanges(MiscSchemaUtil.createCollection(delta), options, task, result); // THEN diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/AbstractImportTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/AbstractImportTest.java index 2c8a92926c3..9de92230056 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/AbstractImportTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/importer/AbstractImportTest.java @@ -688,7 +688,7 @@ public void test050ImportUserHermanOverwriteFullProcessing() throws Exception { ImportOptionsType importOptions = getDefaultImportOptions(); importOptions.setOverwrite(true); importOptions.setKeepOid(true); - importOptions.setModelExecutionOptions(new ModelExecuteOptionsType().raw(false)); + importOptions.setModelExecutionOptions(new ModelExecuteOptionsType(prismContext).raw(false)); dummyAuditService.clear(); @@ -730,7 +730,7 @@ public void test060ImportConstrainedWrongFullProcessing() throws Exception { ImportOptionsType importOptions = getDefaultImportOptions(); importOptions.setOverwrite(true); importOptions.setKeepOid(true); - importOptions.setModelExecutionOptions(new ModelExecuteOptionsType().raw(false)); + importOptions.setModelExecutionOptions(new ModelExecuteOptionsType(prismContext).raw(false)); dummyAuditService.clear(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java index b04af3a5c16..f8e1be25e95 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java @@ -277,7 +277,7 @@ public void test102ModifyUserFullNameRecon() throws Exception { ObjectDelta objectDelta = createModifyUserReplaceDelta(USER_JACK_OID, UserType.F_FULL_NAME, PrismTestUtil.createPolyString(CAPTAIN_JACK_FULL_NAME)); Collection> deltas = MiscSchemaUtil.createCollection(objectDelta); - modelService.executeChanges(deltas, ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(deltas, executeOptions().reconcile(), task, result); // THEN then(); @@ -2281,7 +2281,7 @@ public void test212ModifyUserLocalityRecon() throws Exception { ObjectDelta objectDelta = createModifyUserReplaceDelta(USER_GUYBRUSH_OID, UserType.F_LOCALITY, PrismTestUtil.createPolyString(LOCALITY_SCABB_ISLAND)); Collection> deltas = MiscSchemaUtil.createCollection(objectDelta); - ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); + ModelExecuteOptions options = executeOptions().reconcile(); modelService.executeChanges(deltas, options, task, result); // THEN @@ -2712,7 +2712,7 @@ public void test262ModifyUserLocalityRecon() throws Exception { ObjectDelta objectDelta = createModifyUserReplaceDelta(USER_GUYBRUSH_OID, UserType.F_LOCALITY, PrismTestUtil.createPolyString(LOCALITY_SCABB_ISLAND)); Collection> deltas = MiscSchemaUtil.createCollection(objectDelta); - ModelExecuteOptions options = ModelExecuteOptions.createReconcile(); + ModelExecuteOptions options = executeOptions().reconcile(); modelService.executeChanges(deltas, options, task, result); // THEN diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingInbound.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingInbound.java index 9fe69742816..9b484824abc 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingInbound.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingInbound.java @@ -310,7 +310,7 @@ public void test140ModifyMancombPhotoInRepo() throws Exception { ObjectDelta delta = deltaFor(UserType.class) .item(UserType.F_JPEG_PHOTO).replaceRealValues(singleton("cherry".getBytes(StandardCharsets.UTF_8))) .asObjectDelta(userMancomb.getOid()); - executeChanges(delta, ModelExecuteOptions.createReconcile(), task, result); + executeChanges(delta, executeOptions().reconcile(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/misc/TestTracing.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/misc/TestTracing.java index 5d00a30b3c5..b3de42c7594 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/misc/TestTracing.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/misc/TestTracing.java @@ -63,8 +63,8 @@ public void test100IllegalChars() throws Exception { OperationResult result = getTestOperationResult(); when(); - ModelExecuteOptions options = new ModelExecuteOptions(); - options.setTracingProfile(createModelAndProvisioningLoggingTracingProfile()); + ModelExecuteOptions options = executeOptions(); + options.tracingProfile(createModelAndProvisioningLoggingTracingProfile()); ObjectDelta delta = deltaFor(UserType.class) .item(UserType.F_ASSIGNMENT) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiResource.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiResource.java index 8f73629039e..32a1fc36bbf 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiResource.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/multi/TestMultiResource.java @@ -525,7 +525,7 @@ public void test224JackKillBeigeAccounAndRecompute() throws Exception { // WHEN when(); - recomputeUser(USER_JACK_OID, ModelExecuteOptions.createReconcile(), task, result); + recomputeUser(USER_JACK_OID, executeOptions().reconcile(), task, result); // THEN then(); @@ -640,7 +640,7 @@ public void test226JackKillBothAccountsAndRecompute() throws Exception { // WHEN when(); - recomputeUser(USER_JACK_OID, ModelExecuteOptions.createReconcile(), task, result); + recomputeUser(USER_JACK_OID, executeOptions().reconcile(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStruct.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStruct.java index 00db3b22efa..66a67c61cc3 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStruct.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStruct.java @@ -544,7 +544,7 @@ public void test232JackDestroyRefsAndRecompute() throws Exception { // WHEN when(); - recomputeUser(USER_JACK_OID, ModelExecuteOptions.createReconcile(), task, result); + recomputeUser(USER_JACK_OID, executeOptions().reconcile(), task, result); // THEN then(); @@ -579,8 +579,9 @@ public void test234JackDestroyRefsAndLightRecompute() throws Exception { partialProcessing.setObjectTemplateAfterAssignments(PartialProcessingTypeType.SKIP); partialProcessing.setProjection(PartialProcessingTypeType.SKIP); partialProcessing.setApprovals(PartialProcessingTypeType.SKIP); - ModelExecuteOptions options = ModelExecuteOptions.createPartialProcessing(partialProcessing); - options.setReconcileFocus(true); + ModelExecuteOptions options = executeOptions() + .partialProcessing(partialProcessing) + .reconcileFocus(true); // WHEN when(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStructCaribbean.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStructCaribbean.java index a901a7e061b..6b14b873841 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStructCaribbean.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/orgstruct/TestOrgStructCaribbean.java @@ -221,7 +221,7 @@ public void test106RecomputeDoT() throws Exception { // WHEN when(); modelService.recompute(OrgType.class, ORG_CARIBBEAN_DEPARTMENT_OF_THINGS_OID, - ModelExecuteOptions.createReconcileFocus(), task, result); + executeOptions().reconcileFocus(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java index dcff58de1f3..72b757f553b 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java @@ -189,7 +189,7 @@ public void test110JackAssignRolePirateValidToRaw() throws Exception { jackPirateValidTo = getTimestamp("PT10M"); activationType.setValidTo(jackPirateValidTo); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN when(); @@ -437,7 +437,7 @@ public void test130JackAssignRoleSailorValidToRaw() throws Exception { jackPirateValidTo = getTimestamp("PT10M"); activationType.setValidTo(jackPirateValidTo); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN when(); @@ -576,7 +576,7 @@ public void test140JackAssignRoleSailorValidToRaw() throws Exception { jackPirateValidTo = getTimestamp("PT10M"); activationType.setValidTo(jackPirateValidTo); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN when(); @@ -849,7 +849,7 @@ public void test161JackAssignRoleSailorValidToRaw() throws Exception { jackPirateValidTo = getTimestamp("PT10M"); activationType.setValidTo(jackPirateValidTo); - ModelExecuteOptions options = ModelExecuteOptions.createRaw(); + ModelExecuteOptions options = executeOptions().raw(); // WHEN when(); @@ -1140,7 +1140,7 @@ public void test180JackAssignRoleSailorValidToRaw() throws Exception { // WHEN when(); modifyUserAssignment(USER_JACK_OID, ROLE_STRONG_SAILOR_OID, RoleType.COMPLEX_TYPE, null, - task, null, activationType, true, ModelExecuteOptions.createRaw(), result); + task, null, activationType, true, executeOptions().raw(), result); // THEN then(); @@ -1170,7 +1170,7 @@ public void test182Forward15minAndAssignRaw() throws Exception { // WHEN when(); modifyUserAssignment(USER_JACK_OID, ROLE_STRONG_SAILOR_OID, RoleType.COMPLEX_TYPE, null, - task, null, null, true, ModelExecuteOptions.createRaw(), result); + task, null, null, true, executeOptions().raw(), result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbac.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbac.java index 896396b5978..15b136ded92 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbac.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbac.java @@ -2358,7 +2358,7 @@ public void test703JackModifyJudgeDeleteInducementHonorabilityRecompute() throws // WHEN when(); - recomputeUser(USER_JACK_OID, ModelExecuteOptions.createReconcile(getDefaultOptions()), task, result); + recomputeUser(USER_JACK_OID, ModelExecuteOptions.create(getDefaultOptions(), prismContext).reconcile(), task, result); // THEN then(); @@ -2610,7 +2610,7 @@ public void test755AddProjectAndRecomputeJack() throws Exception { // WHEN when(); - recomputeUser(USER_JACK_OID, ModelExecuteOptions.createReconcile(getDefaultOptions()), task, result); + recomputeUser(USER_JACK_OID, ModelExecuteOptions.create(getDefaultOptions(), prismContext).reconcile(), task, result); // THEN then(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacLightInitialProjection.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacLightInitialProjection.java index 48d4e9eb210..da123a0b43d 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacLightInitialProjection.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacLightInitialProjection.java @@ -24,7 +24,7 @@ public class TestRbacLightInitialProjection extends TestRbac { @Override protected ModelExecuteOptions getDefaultOptions() { - return ModelExecuteOptions.createInitialPartialProcessing( + return executeOptions().initialPartialProcessing( new PartialProcessingOptionsType().inbound(SKIP).projection(SKIP)); } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacNoInbounds.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacNoInbounds.java index 64a18c6c681..3cf7db37fef 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacNoInbounds.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestRbacNoInbounds.java @@ -23,7 +23,7 @@ public class TestRbacNoInbounds extends TestRbac { @Override protected ModelExecuteOptions getDefaultOptions() { - return ModelExecuteOptions.createPartialProcessing( + return executeOptions().partialProcessing( new PartialProcessingOptionsType().inbound(PartialProcessingTypeType.SKIP)); } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestSegregationOfDuties.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestSegregationOfDuties.java index f09d58f076c..811081e0802 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestSegregationOfDuties.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestSegregationOfDuties.java @@ -1606,7 +1606,7 @@ public void test950JackSelfExclusion() throws Exception { try { // This should die - ModelExecuteOptions options = new ModelExecuteOptions(); + ModelExecuteOptions options = executeOptions(); // options.setEvaluateAllAssignmentRelationsOnRecompute(true); assignRole(USER_JACK_OID, ROLE_SELF_EXCLUSION_OID, SchemaConstants.ORG_OWNER, options, task, result); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/AbstractSecurityTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/AbstractSecurityTest.java index d402efb124b..9757bc1fb3b 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/AbstractSecurityTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/AbstractSecurityTest.java @@ -823,7 +823,7 @@ protected void assertAddDeny() throws ObjectAlreadyExistsException, ObjectNotFou } protected void assertAddDenyRaw() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, IOException { - assertAddDeny(USER_DRAKE_FILE, ModelExecuteOptions.createRaw()); + assertAddDeny(USER_DRAKE_FILE, executeOptions().raw()); } protected void assertAddAllow() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException, IOException { @@ -832,7 +832,7 @@ protected void assertAddAllow() throws ObjectAlreadyExistsException, ObjectNotFo } protected void assertAddAllowRaw() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException, IOException { - assertAddAllow(USER_DRAKE_FILE, ModelExecuteOptions.createRaw()); + assertAddAllow(USER_DRAKE_FILE, executeOptions().raw()); } protected void assertModifyDeny() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { @@ -845,7 +845,7 @@ protected void assertModifyDeny() throws ObjectAlreadyExistsException, ObjectNot } protected void assertModifyDenyRaw() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { - assertModifyDenyOptions(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_SUFFIX, ModelExecuteOptions.createRaw(), PrismTestUtil.createPolyString("CSc")); + assertModifyDenyOptions(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_SUFFIX, executeOptions().raw(), PrismTestUtil.createPolyString("CSc")); } protected void assertModifyAllow() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { @@ -857,17 +857,17 @@ protected void assertModifyAllow() throws ObjectAlreadyExistsException, ObjectNo } protected void assertModifyAllowRaw() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { - assertModifyAllowOptions(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_SUFFIX, ModelExecuteOptions.createRaw(), PrismTestUtil.createPolyString("CSc")); + assertModifyAllowOptions(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_SUFFIX, executeOptions().raw(), PrismTestUtil.createPolyString("CSc")); } protected void assertDeleteDeny() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { assertDeleteDeny(UserType.class, USER_LARGO_OID); - assertDeleteDeny(UserType.class, USER_LECHUCK_OID, ModelExecuteOptions.createRaw()); + assertDeleteDeny(UserType.class, USER_LECHUCK_OID, executeOptions().raw()); } protected void assertDeleteAllow() throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { assertDeleteAllow(UserType.class, USER_LARGO_OID); - assertDeleteAllow(UserType.class, USER_LECHUCK_OID, ModelExecuteOptions.createRaw()); + assertDeleteAllow(UserType.class, USER_LECHUCK_OID, executeOptions().raw()); } protected void assertContainerSearch(Class type, ObjectQuery query, int expectedResults) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException { @@ -917,13 +917,13 @@ protected void assertPasswordChangeAllow(Class type, S } protected void assertModifyDenyRaw(Class type, String oid, ItemName propertyName, Object... newRealValue) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { - assertModifyDenyOptions(type, oid, propertyName, ModelExecuteOptions.createRaw(), newRealValue); + assertModifyDenyOptions(type, oid, propertyName, executeOptions().raw(), newRealValue); } protected void assertModifyDenyPartial(Class type, String oid, ItemName propertyName, Object... newRealValue) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { PartialProcessingOptionsType partialProcessing = new PartialProcessingOptionsType(); partialProcessing.setApprovals(PartialProcessingTypeType.SKIP); - assertModifyDenyOptions(type, oid, propertyName, ModelExecuteOptions.createPartialProcessing(partialProcessing), newRealValue); + assertModifyDenyOptions(type, oid, propertyName, executeOptions().partialProcessing(partialProcessing), newRealValue); } protected void assertModifyDeny(Class type, String oid, ItemPath itemPath, Object... newRealValue) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException { @@ -955,7 +955,7 @@ protected void assertModifyAllow(Class type, String oi protected void assertModifyAllowPartial(Class type, String oid, ItemName propertyName, Object... newRealValue) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { PartialProcessingOptionsType partialProcessing = new PartialProcessingOptionsType(); partialProcessing.setApprovals(PartialProcessingTypeType.SKIP); - assertModifyAllowOptions(type, oid, propertyName, ModelExecuteOptions.createPartialProcessing(partialProcessing), newRealValue); + assertModifyAllowOptions(type, oid, propertyName, executeOptions().partialProcessing(partialProcessing), newRealValue); } protected void assertModifyAllowOptions(Class type, String oid, ItemPath itemPath, ModelExecuteOptions options, Object... newRealValue) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/TestSecurityBasic.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/TestSecurityBasic.java index e90b759f0cc..7b76394e822 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/TestSecurityBasic.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/security/TestSecurityBasic.java @@ -578,10 +578,10 @@ public void test207rAutzJackObjectFilterCaribbeanRole() throws Exception { assertAddDeny(); assertModifyAllow(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_PREFIX, PrismTestUtil.createPolyString("Captain")); - assertModifyAllowOptions(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_PREFIX, ModelExecuteOptions.createRaw(), PrismTestUtil.createPolyString("Raw Captain")); + assertModifyAllowOptions(UserType.class, USER_JACK_OID, UserType.F_HONORIFIC_PREFIX, executeOptions().raw(), PrismTestUtil.createPolyString("Raw Captain")); assertModifyDeny(UserType.class, USER_GUYBRUSH_OID, UserType.F_HONORIFIC_PREFIX, PrismTestUtil.createPolyString("Pirate")); assertModifyAllow(UserType.class, USER_BARBOSSA_OID, UserType.F_HONORIFIC_PREFIX, PrismTestUtil.createPolyString("Mutineer")); - assertModifyAllowOptions(UserType.class, USER_BARBOSSA_OID, UserType.F_HONORIFIC_PREFIX, ModelExecuteOptions.createRaw(), PrismTestUtil.createPolyString("Raw Mutineer")); + assertModifyAllowOptions(UserType.class, USER_BARBOSSA_OID, UserType.F_HONORIFIC_PREFIX, executeOptions().raw(), PrismTestUtil.createPolyString("Raw Mutineer")); assertDeleteDeny(); diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index 3607ba91b4f..867a5c28c37 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -363,7 +363,7 @@ protected void importObjectFromFile(File file, ImportOptionsType options, Task t protected void importObjectsFromFileNotRaw(File file, Task task, OperationResult result) throws FileNotFoundException { ImportOptionsType options = MiscSchemaUtil.getDefaultImportOptions(); - ModelExecuteOptionsType modelOptions = new ModelExecuteOptionsType(); + ModelExecuteOptionsType modelOptions = new ModelExecuteOptionsType(prismContext); modelOptions.setRaw(false); options.setModelExecutionOptions(modelOptions); importObjectFromFile(file, options, task, result); @@ -962,7 +962,7 @@ protected void unassignAllRoles(String userOid, boolean useRawPlusRecompute) thr ObjectDelta userDelta = prismContext.deltaFactory().object() .createModifyDelta(userOid, modifications, UserType.class); Collection> deltas = MiscSchemaUtil.createCollection(userDelta); - modelService.executeChanges(deltas, useRawPlusRecompute ? ModelExecuteOptions.createRaw() : null, task, result); + modelService.executeChanges(deltas, useRawPlusRecompute ? executeOptions().raw() : null, task, result); result.computeStatus(); TestUtil.assertSuccess(result); @@ -3964,7 +3964,7 @@ protected void deleteObjectRaw( ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { ObjectDelta delta = prismContext.deltaFactory().object().createDeleteDelta(type, oid); - executeChanges(delta, ModelExecuteOptions.createRaw(), task, result); + executeChanges(delta, executeOptions().raw(), task, result); } protected void deleteObject(Class type, String oid) @@ -4002,7 +4002,7 @@ protected void forceDeleteObject( ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { ObjectDelta delta = prismContext.deltaFactory().object().createDeleteDelta(type, oid); - ModelExecuteOptions options = ModelExecuteOptions.createForce(); + ModelExecuteOptions options = ModelExecuteOptions.create(prismContext).force(); executeChanges(delta, options, task, result); } @@ -4820,7 +4820,7 @@ protected void modifyRoleAddInducementTarget( .createModificationAddContainer(RoleType.class, roleOid, RoleType.F_INDUCEMENT, inducement); ModelExecuteOptions options = nullToEmpty(defaultOptions); - options.setReconcileAffected(reconcileAffected); + options.reconcileAffected(reconcileAffected); executeChanges(roleDelta, options, getTestTask(), result); result.computeStatus(); if (reconcileAffected) { @@ -4982,7 +4982,7 @@ protected void modifyRoleDeleteInducement(String roleOid, long inducementId, boo .createModificationDeleteContainer(RoleType.class, roleOid, RoleType.F_INDUCEMENT, inducement); ModelExecuteOptions options = nullToEmpty(defaultOptions); - options.setReconcileAffected(reconcileAffected); + options.reconcileAffected(reconcileAffected); executeChanges(roleDelta, options, task, result); result.computeStatus(); if (reconcileAffected) { @@ -4994,7 +4994,7 @@ protected void modifyRoleDeleteInducement(String roleOid, long inducementId, boo @NotNull protected ModelExecuteOptions nullToEmpty(ModelExecuteOptions options) { - return options != null ? options : new ModelExecuteOptions(); + return options != null ? options : executeOptions(); } protected void modifyUserAddAccount(String userOid, File accountFile, Task task, OperationResult result) throws SchemaException, IOException, ObjectAlreadyExistsException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, SecurityViolationException { @@ -5275,12 +5275,12 @@ protected void reconcileUser(String oid, Task task, OperationResult result) protected void reconcileUser(String oid, ModelExecuteOptions options, Task task, OperationResult result) throws CommunicationException, ObjectAlreadyExistsException, ExpressionEvaluationException, PolicyViolationException, SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException { ObjectDelta emptyDelta = prismContext.deltaFactory().object().createEmptyModifyDelta(UserType.class, oid); - modelService.executeChanges(MiscSchemaUtil.createCollection(emptyDelta), ModelExecuteOptions.createReconcile(options), task, result); + modelService.executeChanges(MiscSchemaUtil.createCollection(emptyDelta), ModelExecuteOptions.create(options, prismContext).reconcile(), task, result); } protected void reconcileOrg(String oid, Task task, OperationResult result) throws CommunicationException, ObjectAlreadyExistsException, ExpressionEvaluationException, PolicyViolationException, SchemaException, SecurityViolationException, ConfigurationException, ObjectNotFoundException { ObjectDelta emptyDelta = prismContext.deltaFactory().object().createEmptyModifyDelta(OrgType.class, oid); - modelService.executeChanges(MiscSchemaUtil.createCollection(emptyDelta), ModelExecuteOptions.createReconcile(), task, result); + modelService.executeChanges(MiscSchemaUtil.createCollection(emptyDelta), executeOptions().reconcile(), task, result); } protected void assertRefEquals(String message, ObjectReferenceType expected, ObjectReferenceType actual) { @@ -6224,7 +6224,7 @@ protected void assertAddDeny(File file) throws ObjectAlreadyExistsException, Obj } protected void assertAddDenyRaw(File file) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, IOException { - assertAddDeny(file, ModelExecuteOptions.createRaw()); + assertAddDeny(file, executeOptions().raw()); } protected void assertAddDeny(File file, ModelExecuteOptions options) throws ObjectAlreadyExistsException, ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, PolicyViolationException, IOException { @@ -6571,4 +6571,8 @@ protected void refresh(TestResource resource, Task tas ConfigurationException, ExpressionEvaluationException { resource.object = modelService.getObject(resource.object.getCompileTimeClass(), resource.oid, null, task, result); } + + protected ModelExecuteOptions executeOptions() { + return ModelExecuteOptions.create(prismContext); + } } diff --git a/model/rest-impl/src/main/java/com/evolveum/midpoint/rest/impl/ModelRestController.java b/model/rest-impl/src/main/java/com/evolveum/midpoint/rest/impl/ModelRestController.java index 625063c1af3..8e70d22806a 100644 --- a/model/rest-impl/src/main/java/com/evolveum/midpoint/rest/impl/ModelRestController.java +++ b/model/rest-impl/src/main/java/com/evolveum/midpoint/rest/impl/ModelRestController.java @@ -315,7 +315,7 @@ public ResponseEntity addObject( return createErrorResponseBuilder(HttpStatus.BAD_REQUEST, parentResult); } - ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options); + ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options, prismContext); String oid; ResponseEntity response; @@ -402,11 +402,11 @@ public ResponseEntity addObject( return createErrorResponseBuilder(HttpStatus.BAD_REQUEST, parentResult); } - ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options); + ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options, prismContext); if (modelExecuteOptions == null) { - modelExecuteOptions = ModelExecuteOptions.createOverwrite(); + modelExecuteOptions = ModelExecuteOptions.create(prismContext).overwrite(); } else if (!ModelExecuteOptions.isOverwrite(modelExecuteOptions)) { - modelExecuteOptions.setOverwrite(Boolean.TRUE); + modelExecuteOptions.overwrite(Boolean.TRUE); } String oid; @@ -453,7 +453,7 @@ public ResponseEntity deleteObject( .body(parentResult.getMessage()); } - ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options); + ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options, prismContext); model.deleteObject(clazz, id, modelExecuteOptions, task, parentResult); response = createResponse(HttpStatus.NO_CONTENT, parentResult); @@ -490,7 +490,7 @@ public ResponseEntity modifyObjectPatch( Class clazz = ObjectTypes.getClassFromRestType(type); ResponseEntity response; try { - ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options); + ModelExecuteOptions modelExecuteOptions = ModelExecuteOptions.fromRestOptions(options, prismContext); Collection modifications = DeltaConvertor.toModifications(modificationType, clazz, prismContext); model.modifyObject(clazz, oid, modifications, modelExecuteOptions, task, parentResult); response = createResponse(HttpStatus.NO_CONTENT, parentResult); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTestPolicy.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTestPolicy.java index 104a8b84c49..512d67270f0 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTestPolicy.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/AbstractWfTestPolicy.java @@ -440,7 +440,7 @@ protected LensContext createModelContext(OperationResult result) throws Excep fillContextWithFocus(lensContext, focus); addFocusDeltaToContext(lensContext, testDetails2.getFocusDelta()); if (immediate) { - lensContext.setOptions(ModelExecuteOptions.createExecuteImmediatelyAfterApproval()); + lensContext.setOptions(executeOptions().executeImmediatelyAfterApproval()); } return lensContext; } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/assignments/TestAssignmentsAdvanced.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/assignments/TestAssignmentsAdvanced.java index 1db88ec04d4..602f6f99810 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/assignments/TestAssignmentsAdvanced.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/assignments/TestAssignmentsAdvanced.java @@ -1261,8 +1261,9 @@ private void previewAssignRolesToJack(boolean immediate, boolean also24) throws .item(UserType.F_DESCRIPTION).replace(testName) .asObjectDelta(userJackOid); - ModelExecuteOptions options = immediate ? ModelExecuteOptions.createExecuteImmediatelyAfterApproval() : new ModelExecuteOptions(); - options.setPartialProcessing(new PartialProcessingOptionsType().approvals(PROCESS)); + ModelExecuteOptions options = executeOptions() + .executeImmediatelyAfterApproval(immediate) + .partialProcessing(new PartialProcessingOptionsType().approvals(PROCESS)); ModelContext modelContext = modelInteractionService .previewChanges(singleton(primaryDelta), options, task, result); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/objects/TestObjectLifecycleApprovalGlobal.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/objects/TestObjectLifecycleApprovalGlobal.java index 47116a722f3..718c52a23e4 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/objects/TestObjectLifecycleApprovalGlobal.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/objects/TestObjectLifecycleApprovalGlobal.java @@ -88,7 +88,7 @@ public void test500CreateRoleJudge() throws Exception { protected LensContext createModelContext(OperationResult result) throws Exception { LensContext lensContext = createLensContext(RoleType.class); addFocusDeltaToContext(lensContext, addObjectDelta); - lensContext.setOptions(ModelExecuteOptions.createExecuteImmediatelyAfterApproval()); + lensContext.setOptions(executeOptions().executeImmediatelyAfterApproval()); return lensContext; } @@ -181,7 +181,7 @@ public void test510AddInducementsToJudge() throws Exception { protected LensContext createModelContext(OperationResult result) throws Exception { LensContext lensContext = createLensContext(RoleType.class); addFocusDeltaToContext(lensContext, judgeDelta); - lensContext.setOptions(ModelExecuteOptions.createExecuteImmediatelyAfterApproval()); + lensContext.setOptions(executeOptions().executeImmediatelyAfterApproval()); return lensContext; } @@ -273,7 +273,7 @@ public void test520DeleteRoleJudge() throws Exception { protected LensContext createModelContext(OperationResult result) throws Exception { LensContext lensContext = createLensContext(RoleType.class); addFocusDeltaToContext(lensContext, deleteDelta); - lensContext.setOptions(ModelExecuteOptions.createExecuteImmediatelyAfterApproval()); + lensContext.setOptions(executeOptions().executeImmediatelyAfterApproval()); return lensContext; } @@ -337,7 +337,7 @@ public void test600CreateRoleCaptain() throws Exception { protected LensContext createModelContext(OperationResult result) throws Exception { LensContext lensContext = createLensContext(RoleType.class); addFocusDeltaToContext(lensContext, addObjectDelta); - lensContext.setOptions(ModelExecuteOptions.createExecuteImmediatelyAfterApproval()); + lensContext.setOptions(executeOptions().executeImmediatelyAfterApproval()); return lensContext; } @@ -437,7 +437,7 @@ public void test610DeleteInducementsFromCaptain() throws Exception { protected LensContext createModelContext(OperationResult result) throws Exception { LensContext lensContext = createLensContext(RoleType.class); addFocusDeltaToContext(lensContext, captainDelta); - lensContext.setOptions(ModelExecuteOptions.createExecuteImmediatelyAfterApproval()); + lensContext.setOptions(executeOptions().executeImmediatelyAfterApproval()); return lensContext; } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java index b316cd19942..91d6e067e8d 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestMiscellaneous.java @@ -112,7 +112,7 @@ public void test100RequesterComment() throws Exception { ObjectDelta userDelta = createAssignmentUserDelta(userJackOid, ROLE_SAILOR.oid, RoleType.COMPLEX_TYPE, null, null, null, true); Collection> deltas = MiscSchemaUtil.createCollection(userDelta); - modelService.executeChanges(deltas, ModelExecuteOptions.createRequestBusinessContext(businessContext), task, result); + modelService.executeChanges(deltas, executeOptions().requestBusinessContext(businessContext), task, result); assertNotAssignedRole(userJackOid, ROLE_SAILOR.oid, result); @@ -177,8 +177,8 @@ public void test105RequesterCommentImmediate() throws Exception { ObjectDelta userDelta = createAssignmentUserDelta(userJackOid, ROLE_CAPTAIN.oid, RoleType.COMPLEX_TYPE, null, null, null, true); Collection> deltas = MiscSchemaUtil.createCollection(userDelta); - ModelExecuteOptions options = ModelExecuteOptions.createRequestBusinessContext(businessContext); - options.setExecuteImmediatelyAfterApproval(true); + ModelExecuteOptions options = executeOptions().requestBusinessContext(businessContext); + options.executeImmediatelyAfterApproval(true); modelService.executeChanges(deltas, options, task, result); assertNotAssignedRole(userJackOid, ROLE_CAPTAIN.oid, result); @@ -236,8 +236,8 @@ public void test110RequestPrunedRole() throws Exception { // GIVEN - ModelExecuteOptions options = ModelExecuteOptions - .createPartialProcessing(new PartialProcessingOptionsType().approvals(PartialProcessingTypeType.SKIP)); + ModelExecuteOptions options = executeOptions().partialProcessing( + new PartialProcessingOptionsType().approvals(PartialProcessingTypeType.SKIP)); assignRole(userJackOid, ROLE_GOLD.oid, options, task, result); assertAssignedRole(getUser(userJackOid), ROLE_GOLD.oid); @@ -352,7 +352,7 @@ public void test250SkippingApprovals() throws Exception { .item(UserType.F_ASSIGNMENT) .add(ObjectTypeUtil.createAssignmentTo(ROLE_CAPTAIN.oid, ObjectTypes.ROLE, prismContext)) .asObjectDelta(userJackOid); - ModelExecuteOptions options = ModelExecuteOptions.createPartialProcessing( + ModelExecuteOptions options = executeOptions().partialProcessing( new PartialProcessingOptionsType().approvals(PartialProcessingTypeType.SKIP)); modelService.executeChanges(Collections.singletonList(delta), options, task, result); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestParallelApprovals.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestParallelApprovals.java index e69fc4ddd9d..8fbbccde46a 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestParallelApprovals.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestParallelApprovals.java @@ -45,7 +45,6 @@ import java.util.Collection; import java.util.List; -import static com.evolveum.midpoint.model.api.ModelExecuteOptions.createExecuteImmediatelyAfterApproval; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; import static org.testng.AssertJUnit.assertEquals; @@ -129,7 +128,7 @@ public void test100ParallelApprovals() throws Exception { ObjectTypeUtil.createAssignmentTo(roleRole52aOid, ObjectTypes.ROLE, prismContext), ObjectTypeUtil.createAssignmentTo(roleRole53aOid, ObjectTypes.ROLE, prismContext)) .asObjectDeltaCast(userJackOid); - executeChanges(assignDelta, createExecuteImmediatelyAfterApproval(), task, result); // should start approval processes + executeChanges(assignDelta, executeOptions().executeImmediatelyAfterApproval(), task, result); // should start approval processes assertNotAssignedRole(userJackOid, roleRole51aOid, result); assertNotAssignedRole(userJackOid, roleRole52aOid, result); assertNotAssignedRole(userJackOid, roleRole53aOid, result); @@ -182,7 +181,7 @@ public void test110ParallelApprovalsAdd() throws Exception { .assignment(ObjectTypeUtil.createAssignmentTo(roleRole51aOid, ObjectTypes.ROLE, prismContext)) .assignment(ObjectTypeUtil.createAssignmentTo(roleRole52aOid, ObjectTypes.ROLE, prismContext)) .assignment(ObjectTypeUtil.createAssignmentTo(roleRole53aOid, ObjectTypes.ROLE, prismContext)); - executeChanges(DeltaFactory.Object.createAddDelta(alice.asPrismObject()), createExecuteImmediatelyAfterApproval(), task, result); // should start approval processes + executeChanges(DeltaFactory.Object.createAddDelta(alice.asPrismObject()), executeOptions().executeImmediatelyAfterApproval(), task, result); // should start approval processes display("Task after operation", task); CaseType rootCase = testHelper.getRootCase(result); @@ -240,14 +239,14 @@ public void test120ParallelApprovalsInTwoOperations() throws Exception { ObjectTypeUtil.createAssignmentTo(roleRole50aOid, ObjectTypes.ROLE, prismContext), ObjectTypeUtil.createAssignmentTo(roleRole51aOid, ObjectTypes.ROLE, prismContext)) .asObjectDeltaCast(userBobOid); - executeChanges(assignDelta1, createExecuteImmediatelyAfterApproval(), task1, result1); // should start approval processes + executeChanges(assignDelta1, executeOptions().executeImmediatelyAfterApproval(), task1, result1); // should start approval processes ObjectDelta assignDelta2 = prismContext.deltaFor(UserType.class) .item(UserType.F_ASSIGNMENT).add( ObjectTypeUtil.createAssignmentTo(roleRole50aOid, ObjectTypes.ROLE, prismContext), ObjectTypeUtil.createAssignmentTo(roleRole52aOid, ObjectTypes.ROLE, prismContext), ObjectTypeUtil.createAssignmentTo(roleRole53aOid, ObjectTypes.ROLE, prismContext)) .asObjectDeltaCast(userBobOid); - executeChanges(assignDelta2, createExecuteImmediatelyAfterApproval(), task2, result2); // should start approval processes + executeChanges(assignDelta2, executeOptions().executeImmediatelyAfterApproval(), task2, result2); // should start approval processes assertNotAssignedRole(userBobOid, roleRole51aOid, result0); assertNotAssignedRole(userBobOid, roleRole52aOid, result0); assertNotAssignedRole(userBobOid, roleRole53aOid, result0); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestPreview.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestPreview.java index 8fb882b1cec..7147492d12c 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestPreview.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/other/TestPreview.java @@ -90,7 +90,7 @@ public void test100PurePreview() throws Exception { Task task = getTestTask(); OperationResult result = getTestOperationResult(); - ModelExecuteOptions options = new ModelExecuteOptions(); + ModelExecuteOptions options = executeOptions(); options.getOrCreatePartialProcessing().setApprovals(PartialProcessingTypeType.PROCESS); when(); diff --git a/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/ad/AbstractAdLdapMultidomainTest.java b/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/ad/AbstractAdLdapMultidomainTest.java index bfccc2c70fb..969c8f5cee6 100644 --- a/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/ad/AbstractAdLdapMultidomainTest.java +++ b/testing/conntest/src/test/java/com/evolveum/midpoint/testing/conntest/ad/AbstractAdLdapMultidomainTest.java @@ -1195,7 +1195,7 @@ public void test238DisableUserBarbossaRawAndReconcile() throws Exception { OperationResult result = task.getResult(); modifyUserReplace(USER_BARBOSSA_OID, SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS, - ModelExecuteOptions.createRaw(), task, result, ActivationStatusType.DISABLED); + executeOptions().raw(), task, result, ActivationStatusType.DISABLED); // WHEN when(); @@ -1220,7 +1220,7 @@ public void test239EnableUserBarbossaRawAndReconcile() throws Exception { OperationResult result = task.getResult(); modifyUserReplace(USER_BARBOSSA_OID, SchemaConstants.PATH_ACTIVATION_ADMINISTRATIVE_STATUS, - ModelExecuteOptions.createRaw(), task, result, ActivationStatusType.ENABLED); + executeOptions().raw(), task, result, ActivationStatusType.ENABLED); // WHEN when(); diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java index 5be109cd4d2..54c0deeea18 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/RestServiceInitializer.java @@ -118,13 +118,13 @@ public void initSystem(Task initTask, OperationResult result) throws Exception { InternalsConfig.encryptionChecks = false; PrismObject superRole = parseObject(ROLE_SUPERUSER_FILE); - addObject(superRole, ModelExecuteOptions.createOverwrite(), initTask, result); + addObject(superRole, executeOptions().overwrite(), initTask, result); PrismObject endRole = parseObject(ROLE_ENDUSER_FILE); - addObject(endRole, ModelExecuteOptions.createOverwrite(), initTask, result); + addObject(endRole, executeOptions().overwrite(), initTask, result); addObject(ROLE_REST_FILE, initTask, result); addObject(ROLE_READER_FILE, initTask, result); PrismObject adminUser = parseObject(USER_ADMINISTRATOR_FILE); - addObject(adminUser, ModelExecuteOptions.createOverwrite(), initTask, result); + addObject(adminUser, executeOptions().overwrite(), initTask, result); addObject(USER_NOBODY_FILE, initTask, result); addObject(USER_CYCLOPS_FILE, initTask, result); addObject(USER_SOMEBODY_FILE, initTask, result); @@ -135,7 +135,7 @@ public void initSystem(Task initTask, OperationResult result) throws Exception { addObject(VALUE_POLICY_SECURITY_ANSWER, initTask, result); addObject(SECURITY_POLICY, initTask, result); PrismObject systemConfig = parseObject(SYSTEM_CONFIGURATION_FILE); - addObject(systemConfig, ModelExecuteOptions.createOverwrite(), initTask, result); + addObject(systemConfig, executeOptions().overwrite(), initTask, result); // TODO remove in 2021 - this should be covered in super.super.initSystem(...) // dummyAuditService = DummyAuditService.getInstance(); diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java index eff71c0d3dc..732f01c232b 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestAbstractRestService.java @@ -1035,7 +1035,7 @@ public void test518validateValueImplicitPassword() throws Exception { Task task = getTestTask(); OperationResult result = task.getResult(); PrismObject secPolicyNoHistory = parseObject(SECURITY_POLICY_NO_HISTORY); - addObject(secPolicyNoHistory, ModelExecuteOptions.createOverwrite(), task, result); + addObject(secPolicyNoHistory, executeOptions().overwrite(), task, result); try { WebClient client = prepareClient(); client.path("/users/" + USER_DARTHADDER_OID + "/validate"); @@ -1055,7 +1055,7 @@ public void test518validateValueImplicitPassword() throws Exception { getDummyAuditService().assertLoginLogout(SchemaConstants.CHANNEL_REST_URI); } finally { PrismObject secPolicy = parseObject(SECURITY_POLICY); - addObject(secPolicy, ModelExecuteOptions.createOverwrite(), task, result); + addObject(secPolicy, executeOptions().overwrite(), task, result); } } diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java index 3585521f5da..f2ae6518418 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java @@ -2036,7 +2036,7 @@ public void test283GetObjectNoFetchShadowAndRecompute() throws Exception { //WHEN when(); - recomputeUser(USER_DONALD_OID, ModelExecuteOptions.createReconcile(), task, parentResult); + recomputeUser(USER_DONALD_OID, executeOptions().reconcile(), task, parentResult); //THEN then(); @@ -2103,7 +2103,7 @@ public void test284ModifyObjectAssignToGroupCommunicationProblem() throws Except //THEN openDJController.assumeRunning(); - recomputeUser(USER_DONALD_OID, ModelExecuteOptions.createReconcile(), task, parentResult); + recomputeUser(USER_DONALD_OID, executeOptions().reconcile(), task, parentResult); assertModelShadow(shadowOid) .attributes() @@ -2509,7 +2509,7 @@ public void test601GetDiscoveryModifyCommunicationProblemDirectAccount() throws // modifyResourceAvailabilityStatus(AvailabilityStatusType.UP, parentResult); ObjectDelta emptyAliceDelta = prismContext.deltaFactory().object() .createEmptyDelta(UserType.class, USER_ALICE_OID, ChangeType.MODIFY); - modelService.executeChanges(MiscSchemaUtil.createCollection(emptyAliceDelta), ModelExecuteOptions.createReconcile(), task, parentResult); + modelService.executeChanges(MiscSchemaUtil.createCollection(emptyAliceDelta), executeOptions().reconcile(), task, parentResult); accountOid = assertUserOneAccountRef(USER_ALICE_OID); //and then try to get account -> result is that the modifications will be applied to the account diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/ldap/TestLdapVirtualGroup.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/ldap/TestLdapVirtualGroup.java index 0dee835672b..71f4203036d 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/ldap/TestLdapVirtualGroup.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/ldap/TestLdapVirtualGroup.java @@ -194,7 +194,7 @@ public void test090AddItRoleHR() throws Exception { when(); display("recompute role " + ROLE_IT_HR_NAME); - modelService.recompute(RoleType.class, ROLE_IT_HR_OID, ModelExecuteOptions.createReconcile(), task, result); + modelService.recompute(RoleType.class, ROLE_IT_HR_OID, executeOptions().reconcile(), task, result); // THEN then(); From 973fb84cb7615721cbba0557e731eca793c907a6 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 26 May 2020 16:13:51 +0200 Subject: [PATCH 6/9] Add draft of "recompute members" test scenario This utilizes new "recompute turn off button". A part of MID-5967 implementation. --- .../midpoint/prism/impl/ItemImpl.java | 5 +- .../model/api/ModelExecuteOptions.java | 12 ++ .../impl/expr/MidpointFunctionsImpl.java | 11 ++ .../model/intest/TestMemberRecompute.java | 154 ++++++++++++++++++ .../member-recompute/archetype-department.xml | 39 +++++ .../resources/member-recompute/org-cc.xml | 16 ++ .../resources/member-recompute/org-dcs.xml | 16 ++ .../member-recompute/org-it-staff.xml | 13 ++ .../member-recompute/system-configuration.xml | 27 +++ .../member-recompute/template-user.xml | 29 ++++ .../src/test/resources/schema/linked.xsd | 34 ++++ 11 files changed, 354 insertions(+), 2 deletions(-) create mode 100644 model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java create mode 100644 model/model-intest/src/test/resources/member-recompute/archetype-department.xml create mode 100644 model/model-intest/src/test/resources/member-recompute/org-cc.xml create mode 100644 model/model-intest/src/test/resources/member-recompute/org-dcs.xml create mode 100644 model/model-intest/src/test/resources/member-recompute/org-it-staff.xml create mode 100644 model/model-intest/src/test/resources/member-recompute/system-configuration.xml create mode 100644 model/model-intest/src/test/resources/member-recompute/template-user.xml create mode 100644 model/model-intest/src/test/resources/schema/linked.xsd diff --git a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java index 45598181049..384c910613b 100644 --- a/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java +++ b/infra/prism-impl/src/main/java/com/evolveum/midpoint/prism/impl/ItemImpl.java @@ -235,10 +235,11 @@ public Object getRealValue() { * Type override, also for compatibility. */ public X getRealValue(Class type) { - if (getValue() == null) { + V singleValue = getValue(); + if (singleValue == null) { return null; } - Object value = getValue().getRealValue(); + Object value = singleValue.getRealValue(); if (value == null) { return null; } diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java index 09f3fb94581..39f9e26e9d6 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java @@ -6,8 +6,10 @@ */ package com.evolveum.midpoint.model.api; +import com.evolveum.midpoint.prism.Item; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.path.ItemName; +import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.AbstractOptions; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -87,6 +89,16 @@ public static boolean is(ModelExecuteOptions options, ItemName itemName, boolean return value != null ? value : defaultValue; } + @SuppressWarnings("WeakerAccess") + public T getExtensionOptionValue(ItemName name, Class clazz) { + Item item = content.asPrismContainerValue().findItem(ItemPath.create(F_EXTENSION, name)); + return item != null ? item.getRealValue(clazz) : null; + } + + public static T getExtensionOptionValue(ModelExecuteOptions options, ItemName name, Class clazz) { + return options != null ? options.getExtensionOptionValue(name, clazz) : null; + } + //region Specific methods public Boolean getForce() { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index fcd2f3e2353..3d350c24f77 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -30,8 +30,11 @@ import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; +import com.evolveum.midpoint.prism.path.ItemName; + import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; +import org.apache.commons.lang3.BooleanUtils; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -2055,4 +2058,12 @@ public void createRecomputeTrigger(Class type, String oid) .asItemDeltas(); repositoryService.modifyObject(type, oid, itemDeltas, result); } + + public boolean extensionOptionIsNotFalse(String localName) { + return BooleanUtils.isNotFalse(getBooleanExtensionOption(localName)); + } + + public Boolean getBooleanExtensionOption(String localName) { + return ModelExecuteOptions.getExtensionOptionValue(getModelContext().getOptions(), new ItemName(localName), Boolean.class); + } } diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java new file mode 100644 index 00000000000..3f399ad9b16 --- /dev/null +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java @@ -0,0 +1,154 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.model.intest; + +import java.io.File; + +import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; + +import com.evolveum.midpoint.util.exception.*; + +import org.jetbrains.annotations.NotNull; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ContextConfiguration; +import org.testng.annotations.Test; + +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.test.TestResource; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; + +import javax.xml.namespace.QName; + +/** + * Various tests related to recomputation (or other treatment) of members of changed abstract roles. + * See also https://wiki.evolveum.com/display/midPoint/Linked+objects. + */ +@ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) +@DirtiesContext(classMode = ClassMode.AFTER_CLASS) +public class TestMemberRecompute extends AbstractEmptyModelIntegrationTest { + + public static final File TEST_DIR = new File("src/test/resources/member-recompute"); + + private static final String NS_LINKED = "http://midpoint.evolveum.com/xml/ns/samples/linked"; + private static final QName RECOMPUTE_MEMBERS_NAME = new QName(NS_LINKED, "recomputeMembers"); + + private static final File SYSTEM_CONFIGURATION_FILE = new File(TEST_DIR, "system-configuration.xml"); + + private static final TestResource TEMPLATE_USER = new TestResource<>(TEST_DIR, "template-user.xml", "7d6bf307-58c2-4ea9-8599-19586623b41a"); + private static final TestResource ARCHETYPE_DEPARTMENT = new TestResource<>(TEST_DIR, "archetype-department.xml", "b685545e-995f-45e0-8d32-92cd3781ef54"); + + private static final TestResource ORG_DCS = new TestResource<>(TEST_DIR, "org-dcs.xml", "67720733-9de6-47da-b856-ce063c4a6659"); + private static final TestResource ORG_CC = new TestResource<>(TEST_DIR, "org-cc.xml", "08a8fe26-e8b6-4005-b23d-e7dc1472b209"); + private static final TestResource ORG_IT_STAFF = new TestResource<>(TEST_DIR, "org-it-staff.xml", "51726874-de60-42f1-aab4-a4afb0702833"); + + @SuppressWarnings("FieldCanBeLocal") private final int DCS_USERS = 20; + @SuppressWarnings("FieldCanBeLocal") private final int CC_USERS = 10; + + @Override + public void initSystem(Task initTask, OperationResult initResult) throws Exception { + super.initSystem(initTask, initResult); + + addObject(TEMPLATE_USER, initTask, initResult); + addObject(ARCHETYPE_DEPARTMENT, initTask, initResult); + addObject(ORG_DCS, initTask, initResult); + addObject(ORG_CC, initTask, initResult); + addObject(ORG_IT_STAFF, initTask, initResult); + + createUsers("user-dcs-%04d", DCS_USERS, initTask, initResult, ORG_DCS, ORG_IT_STAFF); + createUsers("user-cc-%04d", CC_USERS, initTask, initResult, ORG_CC, ORG_IT_STAFF); + +// predefinedTestMethodTracing = PredefinedTestMethodTracing.MODEL_LOGGING; + } + + private void createUsers(String namePattern, int count, Task task, OperationResult result, TestResource... targets) + throws CommonException { + for (int i = 0; i < count; i++) { + UserType user = new UserType(prismContext) + .name(String.format(namePattern, i)); + for (TestResource target : targets) { + user.getAssignment().add(ObjectTypeUtil.createAssignmentTo(target.object, SchemaConstants.ORG_DEFAULT)); + } + addObject(user.asPrismObject(), task, result); + } + } + + @Override + protected File getSystemConfigurationFile() { + return SYSTEM_CONFIGURATION_FILE; + } + + @Test + public void test000Sanity() throws Exception { + assertUserByUsername("user-dcs-0000", "after init") + .display() + .assertCostCenter("07210"); + assertUserByUsername("user-cc-0000", "after init") + .display() + .assertCostCenter("07330"); + } + + @Test + public void test100ChangeCostCenter() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = getTestOperationResult(); + + when(); + ObjectDelta delta = deltaFor(OrgType.class) + .item(OrgType.F_COST_CENTER).replace("07999") + .asObjectDelta(ORG_DCS.oid); + executeChanges(delta, null, task, result); + + then(); + assertSuccess(result); + assertUserAfterByUsername("user-dcs-0000") + .assertCostCenter("07999"); + assertUserAfterByUsername("user-cc-0000") + .assertCostCenter("07330"); + } + + @Test + public void test110ChangeCostCenterNoRecompute() throws Exception { + given(); + Task task = getTestTask(); + OperationResult result = getTestOperationResult(); + + when(); + ObjectDelta delta = deltaFor(OrgType.class) + .item(OrgType.F_COST_CENTER).replace("07777") + .asObjectDelta(ORG_DCS.oid); + + executeChanges(delta, doNotRecompute(), task, result); + + then(); + assertSuccess(result); + assertUserAfterByUsername("user-dcs-0000") + .assertCostCenter("07999"); + assertUserAfterByUsername("user-cc-0000") + .assertCostCenter("07330"); + } + + @NotNull + private ModelExecuteOptions doNotRecompute() throws SchemaException { + ModelExecuteOptionsType optionsBean = new ModelExecuteOptionsType(prismContext); + //noinspection unchecked + PrismPropertyDefinition recomputeDef = prismContext.getSchemaRegistry().findPropertyDefinitionByElementName(RECOMPUTE_MEMBERS_NAME); + PrismProperty recomputeProp = recomputeDef.instantiate(); + recomputeProp.setRealValue(false); + optionsBean.asPrismContainerValue().findOrCreateContainer(ModelExecuteOptionsType.F_EXTENSION) + .createNewValue() + .add(recomputeProp); + return ModelExecuteOptions.fromModelExecutionOptionsType(optionsBean); + } +} diff --git a/model/model-intest/src/test/resources/member-recompute/archetype-department.xml b/model/model-intest/src/test/resources/member-recompute/archetype-department.xml new file mode 100644 index 00000000000..daa71d1371c --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/archetype-department.xml @@ -0,0 +1,39 @@ + + + + department + + + + + + costCenter + + + + + + + + + + + + + + + + + + + + diff --git a/model/model-intest/src/test/resources/member-recompute/org-cc.xml b/model/model-intest/src/test/resources/member-recompute/org-cc.xml new file mode 100644 index 00000000000..73b7cc53310 --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/org-cc.xml @@ -0,0 +1,16 @@ + + + + cc + + + + 07330 + Computing Center + diff --git a/model/model-intest/src/test/resources/member-recompute/org-dcs.xml b/model/model-intest/src/test/resources/member-recompute/org-dcs.xml new file mode 100644 index 00000000000..f99c1b60eaa --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/org-dcs.xml @@ -0,0 +1,16 @@ + + + + dcs + + + + 07210 + Department of Computer Science + diff --git a/model/model-intest/src/test/resources/member-recompute/org-it-staff.xml b/model/model-intest/src/test/resources/member-recompute/org-it-staff.xml new file mode 100644 index 00000000000..79eea281e53 --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/org-it-staff.xml @@ -0,0 +1,13 @@ + + + + it-staff + + 999999 + diff --git a/model/model-intest/src/test/resources/member-recompute/system-configuration.xml b/model/model-intest/src/test/resources/member-recompute/system-configuration.xml new file mode 100644 index 00000000000..8954f714d5f --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/system-configuration.xml @@ -0,0 +1,27 @@ + + + + + + + SystemConfiguration + + UserType + + + + diff --git a/model/model-intest/src/test/resources/member-recompute/template-user.xml b/model/model-intest/src/test/resources/member-recompute/template-user.xml new file mode 100644 index 00000000000..876c8971340 --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/template-user.xml @@ -0,0 +1,29 @@ + + + + template-user + + costCenter + + afterAssignments + strong + + + + + + diff --git a/model/model-intest/src/test/resources/schema/linked.xsd b/model/model-intest/src/test/resources/schema/linked.xsd new file mode 100644 index 00000000000..aa22b13c0dc --- /dev/null +++ b/model/model-intest/src/test/resources/schema/linked.xsd @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + From 929fb55d04992e8bc245bf3cbba67996f8a7656e Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 26 May 2020 18:25:08 +0200 Subject: [PATCH 7/9] Add draft implementation of asynchronous scripting Scripts can be now run in background. Very preliminary/experimental code. A part of MID-5967 implementation. --- .../xml/ns/public/common/common-policy-3.xsd | 101 ++++++++++++ .../AsynchronousScriptExecutor.java | 94 +++++++++++ .../IterativeScriptingTaskCreator.java | 148 ++++++++++++++++++ .../PolicyRuleScriptExecutor.java | 114 ++------------ .../scriptExecutor/ScriptingTaskCreator.java | 14 ++ .../SynchronousScriptExecutor.java | 140 +++++++++++++++++ model/model-intest/pom.xml | 4 + .../model/intest/TestMemberRecompute.java | 20 +++ .../member-recompute/archetype-club.xml | 39 +++++ .../member-recompute/archetype-department.xml | 21 +++ .../task-template-recompute-members.xml | 16 ++ .../model-intest/testng-integration-full.xml | 1 + 12 files changed, 613 insertions(+), 99 deletions(-) create mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/AsynchronousScriptExecutor.java create mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/IterativeScriptingTaskCreator.java create mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/ScriptingTaskCreator.java create mode 100644 model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/SynchronousScriptExecutor.java create mode 100644 model/model-intest/src/test/resources/member-recompute/archetype-club.xml create mode 100644 model/model-intest/src/test/resources/member-recompute/task-template-recompute-members.xml diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd index 8e12427bab0..c847c6080c5 100644 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-policy-3.xsd @@ -2067,6 +2067,13 @@ + + + + Options for asynchronous script execution. + + + @@ -2729,6 +2736,7 @@ + 4.2 true @@ -2804,6 +2812,99 @@ + + + + + + Options for asynchronous script execution. + + + 4.2 + true + + + + + + + Mode of execution. + + + + + + Task template to use. + + EXPERIMENTAL. + + + TaskType + + + + + + + Task customizer: an expression that takes a task and customizes its content. + Input variable: task (of TaskType). + Output: TaskType that should be used. + This is the final step in task preparation. So the task is executed in the form + that is prepared by this expression. + + EXPERIMENTAL. + + + + + + + + + + Mode of asynchronous script execution. + EXPERIMENTAL. + + + + 4.2 + true + + + + + + + Uses iterative scripting handler. This is the default. + + + + + + + + + + Uses single-run scripting action. Input for this action contains + references to objects that should serve as bulk action inputs. + + + + + + + + + + Uses single-run scripting action without any explicit input. + + + + + + + + diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/AsynchronousScriptExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/AsynchronousScriptExecutor.java new file mode 100644 index 00000000000..324cdc3d606 --- /dev/null +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/AsynchronousScriptExecutor.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; + +import com.evolveum.midpoint.model.api.ModelExecuteOptions; +import com.evolveum.midpoint.model.api.ModelService; +import com.evolveum.midpoint.model.impl.lens.EvaluatedPolicyRuleImpl; +import com.evolveum.midpoint.model.impl.lens.LensContext; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.delta.DeltaFactory; +import com.evolveum.midpoint.prism.delta.ObjectDelta; +import com.evolveum.midpoint.prism.delta.ObjectDeltaCollectionsUtil; +import com.evolveum.midpoint.schema.ObjectDeltaOperation; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +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.xml.ns._public.common.common_3.*; + +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.Set; + +import static java.util.Collections.singleton; +import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; + +/** + * Executes scripts asynchronously. + */ +@Component +public class AsynchronousScriptExecutor { + + private static final Trace LOGGER = TraceManager.getTrace(AsynchronousScriptExecutor.class); + + private static final String OP_SUBMIT_SCRIPT = AsynchronousScriptExecutor.class.getName() + ".submitScript"; + + @Autowired private PolicyRuleScriptExecutor policyRuleScriptExecutor; + @Autowired private PrismContext prismContext; + @Autowired private ModelService modelService; + + public void execute(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, LensContext context, + Task task, OperationResult parentResult) { + AsynchronousScriptExecutionType asynchronousExecution = action.getAsynchronous(); + assert asynchronousExecution != null; + + if (action.getExecuteScript().size() != 1) { + throw new IllegalArgumentException("Expected exactly one 'executeScript' element in policy action, got " + + action.getExecuteScript().size() + " in " + action); + } + + OperationResult result = parentResult.createSubresult(OP_SUBMIT_SCRIPT); // cannot be minor because of background task OID + try { + ExecuteScriptType executeScript = action.getExecuteScript().get(0); + TaskType newTask; + switch (defaultIfNull(asynchronousExecution.getExecutionMode(), AsynchronousScriptExecutionModeType.ITERATIVE)) { + case ITERATIVE: + newTask = new IterativeScriptingTaskCreator(policyRuleScriptExecutor, context) + .create(executeScript, action, task, result); + break; +// case SINGLE_RUN: +// newTask = new SingleRunScriptingTaskCreator().create(); +// break; +// case SINGLE_RUN_NO_INPUT: +// newTask = new SingleRunScriptingTaskCreator().create(); +// break; + default: + throw new AssertionError(asynchronousExecution.getExecutionMode()); + } + + Set> deltas = singleton(DeltaFactory.Object.createAddDelta(newTask.asPrismObject())); + ModelExecuteOptions options = new ModelExecuteOptions(prismContext).preAuthorized(); + Collection> operations = modelService.executeChanges(deltas, options, task, result); + String oid = ObjectDeltaOperation.findAddDeltaOid(operations, newTask.asPrismObject()); + System.out.println("New task OID = " + oid); + result.setAsynchronousOperationReference(oid); + + } catch (Throwable t) { + result.recordFatalError(t); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't submit script for asynchronous execution: {}", t, action); + } finally { + result.computeStatusIfUnknown(); + } + } +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/IterativeScriptingTaskCreator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/IterativeScriptingTaskCreator.java new file mode 100644 index 00000000000..9b9389994ef --- /dev/null +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/IterativeScriptingTaskCreator.java @@ -0,0 +1,148 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; + +import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.createObjectRef; +import static com.evolveum.midpoint.xml.ns._public.common.common_3.TaskExecutionStatusType.RUNNABLE; + +import java.util.ArrayList; +import java.util.List; +import javax.xml.namespace.QName; + +import org.jetbrains.annotations.NotNull; + +import com.evolveum.midpoint.model.api.ModelPublicConstants; +import com.evolveum.midpoint.model.impl.lens.LensContext; +import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.security.api.MidPointPrincipal; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; +import com.evolveum.prism.xml.ns._public.query_3.QueryType; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; + +/** + * Creates an iterative scripting task. + */ +class IterativeScriptingTaskCreator extends ScriptingTaskCreator { + + @NotNull private final PolicyRuleScriptExecutor beans; + @NotNull private final LensContext context; + + IterativeScriptingTaskCreator(@NotNull PolicyRuleScriptExecutor policyRuleScriptExecutor, @NotNull LensContext context) { + beans = policyRuleScriptExecutor; + this.context = context; + } + + public TaskType create(ExecuteScriptType executeScript, ScriptExecutionPolicyActionType action, Task task, + OperationResult result) throws SecurityViolationException, ObjectNotFoundException, SchemaException, + CommunicationException, ConfigurationException, ExpressionEvaluationException { + if (executeScript.getInput() != null) { + throw new UnsupportedOperationException("Explicit input with iterative task execution is not supported yet."); + } + + MidPointPrincipal principal = beans.securityContextManager.getPrincipal(); + if (principal == null) { + throw new SecurityViolationException("No current user"); + } + AsynchronousScriptExecutionType asynchronousExecution = action.getAsynchronous(); + TaskType newTask; + if (asynchronousExecution.getTaskTemplateRef() != null) { + newTask = beans.modelObjectResolver.resolve(asynchronousExecution.getTaskTemplateRef(), TaskType.class, + null, "task template", task, result); + } else { + newTask = new TaskType(beans.prismContext); + newTask.setName(PolyStringType.fromOrig("Execute script")); + newTask.setRecurrence(TaskRecurrenceType.SINGLE); + } + newTask.setName(PolyStringType.fromOrig(newTask.getName().getOrig() + " " + (int) (Math.random() * 10000))); + newTask.setOid(null); + newTask.setTaskIdentifier(null); + newTask.setOwnerRef(createObjectRef(principal.getFocus(), beans.prismContext)); + newTask.setExecutionStatus(RUNNABLE); + newTask.setHandlerUri(ModelPublicConstants.ITERATIVE_SCRIPT_EXECUTION_TASK_HANDLER_URI); + + //noinspection unchecked + PrismPropertyDefinition objectTypeDef = beans.prismContext.getSchemaRegistry() + .findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_OBJECT_TYPE); + PrismProperty objectTypeProp = objectTypeDef.instantiate(); + objectTypeProp.setRealValue(AssignmentHolderType.COMPLEX_TYPE); + newTask.asPrismObject().addExtensionItem(objectTypeProp); + + //noinspection unchecked + PrismPropertyDefinition queryDef = beans.prismContext.getSchemaRegistry() + .findPropertyDefinitionByElementName(SchemaConstants.MODEL_EXTENSION_OBJECT_QUERY); + PrismProperty queryProp = queryDef.instantiate(); + queryProp.setRealValue(createQuery(action)); + newTask.asPrismObject().addExtensionItem(queryProp); + + //noinspection unchecked + PrismPropertyDefinition executeScriptDef = beans.prismContext.getSchemaRegistry() + .findPropertyDefinitionByElementName(SchemaConstants.SE_EXECUTE_SCRIPT); + PrismProperty executeScriptProp = executeScriptDef.instantiate(); + executeScriptProp.setRealValue(executeScript.clone()); + newTask.asPrismObject().addExtensionItem(executeScriptProp); + + return newTask; + } + + private QueryType createQuery(ScriptExecutionPolicyActionType action) throws SchemaException { + ObjectFilter filter = createFilter(action); + SearchFilterType filterBean = beans.prismContext.getQueryConverter().createSearchFilterType(filter); + return new QueryType() + .filter(filterBean); + } + + private ObjectFilter createFilter(ScriptExecutionPolicyActionType action) { + ScriptExecutionObjectType objectSpec = action.getObject(); + if (objectSpec == null) { + return createCurrentFilter(); + } else { + List filters = new ArrayList<>(); + if (objectSpec.getCurrentObject() != null) { + filters.add(createCurrentFilter()); // TODO selector + } + for (LinkSourceObjectSelectorType linkSource : objectSpec.getLinkSource()) { + filters.add(createLinkSourceFilter(linkSource)); + } + if (!objectSpec.getLinkTarget().isEmpty()) { + throw new UnsupportedOperationException("Link targets are not supported yet"); + } + if (filters.isEmpty()) { + return createCurrentFilter(); + } else if (filters.size() == 1) { + return filters.get(0); + } else { + return beans.prismContext.queryFactory().createOr(filters); + } + } + } + + // TODO selector + private ObjectFilter createLinkSourceFilter(LinkSourceObjectSelectorType linkSource) { + return beans.prismContext.queryFor(AssignmentHolderType.class) + .item(AssignmentHolderType.F_ROLE_MEMBERSHIP_REF).ref(getFocusOid()) + .buildFilter(); + } + + private ObjectFilter createCurrentFilter() { + return beans.prismContext.queryFor(AssignmentHolderType.class) + .id(getFocusOid()) + .buildFilter(); + } + + private String getFocusOid() { + return context.getFocusContextRequired().getOid(); + } +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java index 92f0734211f..6be6edea178 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/PolicyRuleScriptExecutor.java @@ -6,55 +6,48 @@ */ package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; -import java.util.*; +import com.evolveum.midpoint.model.impl.ModelObjectResolver; +import com.evolveum.midpoint.security.api.SecurityContextManager; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; -import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; -import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.impl.lens.EvaluatedPolicyRuleImpl; import com.evolveum.midpoint.model.impl.lens.LensContext; import com.evolveum.midpoint.model.impl.lens.LensFocusContext; import com.evolveum.midpoint.model.impl.lens.assignments.EvaluatedAssignmentImpl; -import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.RelationRegistry; -import com.evolveum.midpoint.schema.constants.ExpressionConstants; -import com.evolveum.midpoint.schema.expression.VariablesMap; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.util.MiscUtil; -import com.evolveum.midpoint.util.exception.*; -import com.evolveum.midpoint.util.logging.LoggingUtils; +import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; -import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ValueListType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ScriptExecutionPolicyActionType; /** * Executes scripts defined in scriptExecution policy action. * Designed to be called during FINAL stage, just like notification action. * - * HIGHLY EXPERIMENTAL + * TODO We should merge equivalent policy rules so that e.g. recomputation is not done multiple times. */ @Component public class PolicyRuleScriptExecutor { private static final Trace LOGGER = TraceManager.getTrace(PolicyRuleScriptExecutor.class); - private static final String OP_EXECUTE_SCRIPT = PolicyRuleScriptExecutor.class.getName() + ".executeScript"; - @Autowired PrismContext prismContext; @Autowired RelationRegistry relationRegistry; - @Autowired private ScriptingExpressionEvaluator scriptingExpressionEvaluator; + @Autowired private SynchronousScriptExecutor synchronousScriptExecutor; + @Autowired private AsynchronousScriptExecutor asynchronousScriptExecutor; @Autowired @Qualifier("cacheRepositoryService") RepositoryService repositoryService; + @Autowired SecurityContextManager securityContextManager; + @Autowired ModelObjectResolver modelObjectResolver; public void execute(@NotNull LensContext context, Task task, OperationResult result) throws SchemaException { @@ -84,91 +77,14 @@ private void executeRuleScriptingActions(EvaluatedPolicyRuleImpl rule, LensConte } } - private void executeScriptingAction(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, LensContext context, Task task, OperationResult parentResult) { + private void executeScriptingAction(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, + LensContext context, Task task, OperationResult parentResult) { LOGGER.debug("Executing policy action scripts ({}) in action: {}\non rule:{}", action.getExecuteScript().size(), action, rule.debugDumpLazily()); - List executeScript = action.getExecuteScript(); - for (ExecuteScriptType executeScriptBean : executeScript) { - executeScript(action, rule, context, task, parentResult, executeScriptBean); - } - } - - private void executeScript(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, LensContext context, - Task task, OperationResult parentResult, ExecuteScriptType specifiedExecuteScriptBean) { - OperationResult result = parentResult.createSubresult(OP_EXECUTE_SCRIPT); - try { - ExecuteScriptType realExecuteScriptBean; - if (specifiedExecuteScriptBean.getInput() == null && context.getFocusContext() != null) { - ValueListType input = createScriptInput(action, rule, context, context.getFocusContext(), result); - realExecuteScriptBean = specifiedExecuteScriptBean.clone().input(input); - } else { - realExecuteScriptBean = specifiedExecuteScriptBean; - } - VariablesMap initialVariables = createInitialVariables(action, rule, context); - scriptingExpressionEvaluator.evaluateExpression(realExecuteScriptBean, initialVariables, false, task, result); - } catch (Throwable t) { - result.recordFatalError("Couldn't execute script policy action: " + t.getMessage(), t); - LoggingUtils.logUnexpectedException(LOGGER, "Couldn't execute script with id={} in scriptExecution policy action '{}' (rule '{}'): {}", - t, action.getId(), action.getName(), rule.getName(), t.getMessage()); - } finally { - result.computeStatusIfUnknown(); - } - } - - private ValueListType createScriptInput(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, - LensContext context, LensFocusContext focusContext, OperationResult result) - throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, - ConfigurationException, ExpressionEvaluationException { - ScriptExecutionObjectType object = action.getObject(); - if (object == null) { - return createInput(MiscUtil.singletonOrEmptyList(focusContext.getObjectAny())); + if (action.getAsynchronous() != null) { + asynchronousScriptExecutor.execute(action, rule, context, task, parentResult); } else { - Map> objectsMap = new HashMap<>(); // using OID-keyed map to avoid duplicates - if (object.getCurrentObject() != null) { - PrismObject current = focusContext.getObjectAny(); - if (matches(current, object.getCurrentObject())) { - objectsMap.put(current.getOid(), current); - } - } - if (!object.getLinkTarget().isEmpty()) { - try (LinkTargetFinder targetFinder = new LinkTargetFinder(this, context, rule, result)) { - for (LinkTargetObjectSelectorType linkTargetSelector : object.getLinkTarget()) { - addObjects(objectsMap, targetFinder.getTargets(linkTargetSelector)); - } - } - } - if (!object.getLinkSource().isEmpty()) { - try (LinkSourceFinder sourceFinder = new LinkSourceFinder(this, context, result)) { - addObjects(objectsMap, sourceFinder.getSources(object.getLinkSource())); - } - } - return createInput(objectsMap.values()); + synchronousScriptExecutor.execute(action, rule, context, task, parentResult); } } - - private boolean matches(PrismObject object, ObjectSelectorType selector) throws CommunicationException, - ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, - ExpressionEvaluationException { - //noinspection unchecked - return repositoryService.selectorMatches(selector, (PrismObject) object, null, LOGGER, "current object"); - } - - private void addObjects(Map> objectsMap, List> objects) { - objects.forEach(o -> objectsMap.put(o.getOid(), o)); - } - - private ValueListType createInput(Collection> objects) { - ValueListType input = new ValueListType(); - objects.forEach(o -> input.getValue().add(o.getValue().clone())); - return input; - } - - private VariablesMap createInitialVariables(ScriptExecutionPolicyActionType action, EvaluatedPolicyRule rule, - LensContext context) { - VariablesMap rv = new VariablesMap(); - rv.put(ExpressionConstants.VAR_POLICY_ACTION, action, ScriptExecutionPolicyActionType.class); - rv.put(ExpressionConstants.VAR_POLICY_RULE, rule, EvaluatedPolicyRule.class); - rv.put(ExpressionConstants.VAR_MODEL_CONTEXT, context, ModelContext.class); - return rv; - } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/ScriptingTaskCreator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/ScriptingTaskCreator.java new file mode 100644 index 00000000000..dffbee8c5e4 --- /dev/null +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/ScriptingTaskCreator.java @@ -0,0 +1,14 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; + +/** + * + */ +abstract class ScriptingTaskCreator { +} diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/SynchronousScriptExecutor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/SynchronousScriptExecutor.java new file mode 100644 index 00000000000..f937149a9df --- /dev/null +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/scriptExecutor/SynchronousScriptExecutor.java @@ -0,0 +1,140 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ + +package com.evolveum.midpoint.model.impl.lens.projector.policy.scriptExecutor; + +import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; +import com.evolveum.midpoint.model.api.context.ModelContext; +import com.evolveum.midpoint.model.impl.lens.EvaluatedPolicyRuleImpl; +import com.evolveum.midpoint.model.impl.lens.LensContext; +import com.evolveum.midpoint.model.impl.lens.LensFocusContext; +import com.evolveum.midpoint.model.impl.scripting.ScriptingExpressionEvaluator; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.constants.ExpressionConstants; +import com.evolveum.midpoint.schema.expression.VariablesMap; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.util.exception.*; +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.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ExecuteScriptType; +import com.evolveum.midpoint.xml.ns._public.model.scripting_3.ValueListType; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + */ +@Component +public class SynchronousScriptExecutor { + + private static final Trace LOGGER = TraceManager.getTrace(SynchronousScriptExecutor.class); + + private static final String OP_EXECUTE_SCRIPT = SynchronousScriptExecutor.class.getName() + ".executeScript"; + + @Autowired private PolicyRuleScriptExecutor policyRuleScriptExecutor; + @Autowired private ScriptingExpressionEvaluator scriptingExpressionEvaluator; + @Autowired @Qualifier("cacheRepositoryService") RepositoryService repositoryService; + + void execute(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, LensContext context, Task task, + OperationResult parentResult) { + List executeScript = action.getExecuteScript(); + for (ExecuteScriptType executeScriptBean : executeScript) { + executeScript(action, rule, context, task, parentResult, executeScriptBean); + } + } + + private void executeScript(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, LensContext context, + Task task, OperationResult parentResult, ExecuteScriptType specifiedExecuteScriptBean) { + OperationResult result = parentResult.createSubresult(OP_EXECUTE_SCRIPT); + try { + ExecuteScriptType realExecuteScriptBean; + if (specifiedExecuteScriptBean.getInput() == null && context.getFocusContext() != null) { + ValueListType input = createScriptInput(action, rule, context, context.getFocusContext(), result); + realExecuteScriptBean = specifiedExecuteScriptBean.clone().input(input); + } else { + realExecuteScriptBean = specifiedExecuteScriptBean; + } + VariablesMap initialVariables = createInitialVariables(action, rule, context); + scriptingExpressionEvaluator.evaluateExpression(realExecuteScriptBean, initialVariables, false, task, result); + } catch (Throwable t) { + result.recordFatalError("Couldn't execute script policy action: " + t.getMessage(), t); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't execute script with id={} in scriptExecution policy action '{}' (rule '{}'): {}", + t, action.getId(), action.getName(), rule.getName(), t.getMessage()); + } finally { + result.computeStatusIfUnknown(); + } + } + + private ValueListType createScriptInput(ScriptExecutionPolicyActionType action, EvaluatedPolicyRuleImpl rule, + LensContext context, LensFocusContext focusContext, OperationResult result) + throws CommunicationException, ObjectNotFoundException, SchemaException, SecurityViolationException, + ConfigurationException, ExpressionEvaluationException { + ScriptExecutionObjectType object = action.getObject(); + if (object == null) { + return createInput(MiscUtil.singletonOrEmptyList(focusContext.getObjectAny())); + } else { + Map> objectsMap = new HashMap<>(); // using OID-keyed map to avoid duplicates + if (object.getCurrentObject() != null) { + PrismObject current = focusContext.getObjectAny(); + if (matches(current, object.getCurrentObject())) { + objectsMap.put(current.getOid(), current); + } + } + if (!object.getLinkTarget().isEmpty()) { + try (LinkTargetFinder targetFinder = new LinkTargetFinder(policyRuleScriptExecutor, context, rule, result)) { + for (LinkTargetObjectSelectorType linkTargetSelector : object.getLinkTarget()) { + addObjects(objectsMap, targetFinder.getTargets(linkTargetSelector)); + } + } + } + if (!object.getLinkSource().isEmpty()) { + try (LinkSourceFinder sourceFinder = new LinkSourceFinder(policyRuleScriptExecutor, context, result)) { + addObjects(objectsMap, sourceFinder.getSources(object.getLinkSource())); + } + } + return createInput(objectsMap.values()); + } + } + + private boolean matches(PrismObject object, ObjectSelectorType selector) throws CommunicationException, + ObjectNotFoundException, SchemaException, SecurityViolationException, ConfigurationException, + ExpressionEvaluationException { + //noinspection unchecked + return repositoryService.selectorMatches(selector, (PrismObject) object, null, LOGGER, "current object"); + } + + private void addObjects(Map> objectsMap, List> objects) { + objects.forEach(o -> objectsMap.put(o.getOid(), o)); + } + + private ValueListType createInput(Collection> objects) { + ValueListType input = new ValueListType(); + objects.forEach(o -> input.getValue().add(o.getValue().clone())); + return input; + } + + private VariablesMap createInitialVariables(ScriptExecutionPolicyActionType action, EvaluatedPolicyRule rule, + LensContext context) { + VariablesMap rv = new VariablesMap(); + rv.put(ExpressionConstants.VAR_POLICY_ACTION, action, ScriptExecutionPolicyActionType.class); + rv.put(ExpressionConstants.VAR_POLICY_RULE, rule, EvaluatedPolicyRule.class); + rv.put(ExpressionConstants.VAR_MODEL_CONTEXT, context, ModelContext.class); + return rv; + } +} diff --git a/model/model-intest/pom.xml b/model/model-intest/pom.xml index 64b6969d7d6..085b0f58497 100644 --- a/model/model-intest/pom.xml +++ b/model/model-intest/pom.xml @@ -340,6 +340,10 @@ spring-aop test + + org.jetbrains + annotations + diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java index 3f399ad9b16..55f11419971 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMemberRecompute.java @@ -30,6 +30,8 @@ import javax.xml.namespace.QName; +import static org.assertj.core.api.Assertions.assertThat; + /** * Various tests related to recomputation (or other treatment) of members of changed abstract roles. * See also https://wiki.evolveum.com/display/midPoint/Linked+objects. @@ -52,6 +54,8 @@ public class TestMemberRecompute extends AbstractEmptyModelIntegrationTest { private static final TestResource ORG_CC = new TestResource<>(TEST_DIR, "org-cc.xml", "08a8fe26-e8b6-4005-b23d-e7dc1472b209"); private static final TestResource ORG_IT_STAFF = new TestResource<>(TEST_DIR, "org-it-staff.xml", "51726874-de60-42f1-aab4-a4afb0702833"); + private static final TestResource TASK_TEMPLATE_RECOMPUTE_MEMBERS = new TestResource<>(TEST_DIR, "task-template-recompute-members.xml", "9c50ac7e-73c0-45cf-85e7-9a94959242f9"); + @SuppressWarnings("FieldCanBeLocal") private final int DCS_USERS = 20; @SuppressWarnings("FieldCanBeLocal") private final int CC_USERS = 10; @@ -59,8 +63,11 @@ public class TestMemberRecompute extends AbstractEmptyModelIntegrationTest { public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); + addObject(TASK_TEMPLATE_RECOMPUTE_MEMBERS, initTask, initResult); + addObject(TEMPLATE_USER, initTask, initResult); addObject(ARCHETYPE_DEPARTMENT, initTask, initResult); + addObject(ORG_DCS, initTask, initResult); addObject(ORG_CC, initTask, initResult); addObject(ORG_IT_STAFF, initTask, initResult); @@ -112,6 +119,16 @@ public void test100ChangeCostCenter() throws Exception { then(); assertSuccess(result); + + String taskOid = result.findAsynchronousOperationReference(); + assertThat(taskOid).as("background task OID").isNotNull(); + + Task recomputeTask = waitForTaskFinish(taskOid, false); + assertTask(recomputeTask, "recompute task after") + .display() + .assertSuccess() + .assertClosed(); + assertUserAfterByUsername("user-dcs-0000") .assertCostCenter("07999"); assertUserAfterByUsername("user-cc-0000") @@ -131,6 +148,9 @@ public void test110ChangeCostCenterNoRecompute() throws Exception { executeChanges(delta, doNotRecompute(), task, result); + String taskOid = result.findAsynchronousOperationReference(); + assertThat(taskOid).as("background task OID").isNull(); + then(); assertSuccess(result); assertUserAfterByUsername("user-dcs-0000") diff --git a/model/model-intest/src/test/resources/member-recompute/archetype-club.xml b/model/model-intest/src/test/resources/member-recompute/archetype-club.xml new file mode 100644 index 00000000000..3148fae0ff0 --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/archetype-club.xml @@ -0,0 +1,39 @@ + + + + club + + + + + + costCenter + + + + + + + + + + + + + + + + + + + + diff --git a/model/model-intest/src/test/resources/member-recompute/archetype-department.xml b/model/model-intest/src/test/resources/member-recompute/archetype-department.xml index daa71d1371c..9c627f31b03 100644 --- a/model/model-intest/src/test/resources/member-recompute/archetype-department.xml +++ b/model/model-intest/src/test/resources/member-recompute/archetype-department.xml @@ -9,9 +9,17 @@ xmlns:s="http://midpoint.evolveum.com/xml/ns/public/model/scripting-3" oid="b685545e-995f-45e0-8d32-92cd3781ef54"> department + + It is expected that any user has zero or single department. Cost center for department + members is copied from the cost center of the department. + + + When department cost center changes, members must be recomputed + (unless explicitly disabled in execution options). + costCenter @@ -25,6 +33,19 @@ + + iterative + + + + + diff --git a/model/model-intest/src/test/resources/member-recompute/task-template-recompute-members.xml b/model/model-intest/src/test/resources/member-recompute/task-template-recompute-members.xml new file mode 100644 index 00000000000..ee6011234bd --- /dev/null +++ b/model/model-intest/src/test/resources/member-recompute/task-template-recompute-members.xml @@ -0,0 +1,16 @@ + + + + Recompute members + + 2 + + waiting + single + diff --git a/model/model-intest/testng-integration-full.xml b/model/model-intest/testng-integration-full.xml index bd661ce986c..604e6e725f6 100644 --- a/model/model-intest/testng-integration-full.xml +++ b/model/model-intest/testng-integration-full.xml @@ -70,6 +70,7 @@ + From c06aabb26e2b5fc62182d80b6cfc5475c126b6ea Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Tue, 26 May 2020 20:00:00 +0200 Subject: [PATCH 8/9] Spring context XMLs cleanup, mostly unused schemas --- .../resources/ctx-certification-test-main.xml | 19 ++-------- .../test/resources/ctx-model-test-main.xml | 19 ++-------- .../test/resources/ctx-model-test-no-repo.xml | 23 +++--------- .../test/resources/ctx-model-unit-test.xml | 37 ++++++++----------- .../resources/ctx-model-intest-test-main.xml | 22 +++-------- .../test/resources/ctx-notifications-test.xml | 28 ++++---------- .../test/resources/ctx-workflow-test-main.xml | 19 ++-------- .../src/main/resources/ctx-provisioning.xml | 32 +++++----------- .../resources/ctx-provisioning-test-main.xml | 23 ++---------- .../ctx-provisioning-test-no-repo.xml | 23 ++---------- .../test/resources/ctx-provisioning-test.xml | 30 +++++---------- .../src/main/resources/ctx-ucf-builtin.xml | 32 +++++----------- .../src/main/resources/ctx-ucf-connid.xml | 32 +++++----------- .../test/resources/ctx-ucf-connid-test.xml | 29 +++++---------- .../src/test/resources/ctx-audit-test.xml | 29 ++++----------- .../resources/ctx-repo-common-test-main.xml | 22 ++--------- .../test/resources/ctx-repo-common-test.xml | 27 ++++---------- .../test/resources/ctx-security-test-main.xml | 22 ++--------- .../src/test/resources/ctx-security-test.xml | 29 +++++---------- .../test/resources/ctx-conntest-test-main.xml | 23 ++---------- .../src/test/resources/ctx-conntest-test.xml | 31 +++++----------- .../test/resources/ctx-longtest-test-main.xml | 23 ++---------- .../src/test/resources/ctx-longtest-test.xml | 31 +++++----------- .../test/resources/ctx-story-test-main.xml | 22 ++--------- .../src/test/resources/ctx-story-test.xml | 30 +++++---------- 25 files changed, 172 insertions(+), 485 deletions(-) diff --git a/model/certification-impl/src/test/resources/ctx-certification-test-main.xml b/model/certification-impl/src/test/resources/ctx-certification-test-main.xml index 04a4dc7ab60..d9f8c4d9cac 100644 --- a/model/certification-impl/src/test/resources/ctx-certification-test-main.xml +++ b/model/certification-impl/src/test/resources/ctx-certification-test-main.xml @@ -7,22 +7,9 @@ ~ and European Union Public License. See LICENSE file for details. --> + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/model/model-impl/src/test/resources/ctx-model-test-main.xml b/model/model-impl/src/test/resources/ctx-model-test-main.xml index 05a378c9a63..df981ea6ed1 100644 --- a/model/model-impl/src/test/resources/ctx-model-test-main.xml +++ b/model/model-impl/src/test/resources/ctx-model-test-main.xml @@ -7,22 +7,9 @@ ~ and European Union Public License. See LICENSE file for details. --> + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/model/model-impl/src/test/resources/ctx-model-test-no-repo.xml b/model/model-impl/src/test/resources/ctx-model-test-no-repo.xml index f998ba08639..2aaa31940ce 100644 --- a/model/model-impl/src/test/resources/ctx-model-test-no-repo.xml +++ b/model/model-impl/src/test/resources/ctx-model-test-no-repo.xml @@ -6,22 +6,9 @@ ~ and European Union Public License. See LICENSE file for details. --> + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> @@ -36,6 +23,6 @@ - - + diff --git a/model/model-impl/src/test/resources/ctx-model-unit-test.xml b/model/model-impl/src/test/resources/ctx-model-unit-test.xml index b3828516b8d..5cbeded4914 100644 --- a/model/model-impl/src/test/resources/ctx-model-unit-test.xml +++ b/model/model-impl/src/test/resources/ctx-model-unit-test.xml @@ -6,28 +6,23 @@ ~ and European Union Public License. See LICENSE file for details. --> + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> - - - - + - + + + + diff --git a/model/model-intest/src/test/resources/ctx-model-intest-test-main.xml b/model/model-intest/src/test/resources/ctx-model-intest-test-main.xml index c014d121d61..f323df233c0 100644 --- a/model/model-intest/src/test/resources/ctx-model-intest-test-main.xml +++ b/model/model-intest/src/test/resources/ctx-model-intest-test-main.xml @@ -7,22 +7,12 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> diff --git a/model/notifications-impl/src/test/resources/ctx-notifications-test.xml b/model/notifications-impl/src/test/resources/ctx-notifications-test.xml index f96cdea5d4d..a8913071c9b 100644 --- a/model/notifications-impl/src/test/resources/ctx-notifications-test.xml +++ b/model/notifications-impl/src/test/resources/ctx-notifications-test.xml @@ -6,25 +6,13 @@ ~ and European Union Public License. See LICENSE file for details. --> - - - - + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> + + diff --git a/model/workflow-impl/src/test/resources/ctx-workflow-test-main.xml b/model/workflow-impl/src/test/resources/ctx-workflow-test-main.xml index 8e523dd620c..b823a386c4f 100644 --- a/model/workflow-impl/src/test/resources/ctx-workflow-test-main.xml +++ b/model/workflow-impl/src/test/resources/ctx-workflow-test-main.xml @@ -8,22 +8,9 @@ --> + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/provisioning/provisioning-impl/src/main/resources/ctx-provisioning.xml b/provisioning/provisioning-impl/src/main/resources/ctx-provisioning.xml index 72b7501faf7..f183515a059 100644 --- a/provisioning/provisioning-impl/src/main/resources/ctx-provisioning.xml +++ b/provisioning/provisioning-impl/src/main/resources/ctx-provisioning.xml @@ -6,28 +6,16 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - - - - + + + diff --git a/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-main.xml b/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-main.xml index 2cb12bf8078..b5cb3d41482 100644 --- a/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-main.xml +++ b/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-main.xml @@ -6,24 +6,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> @@ -38,5 +24,4 @@ - diff --git a/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-no-repo.xml b/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-no-repo.xml index 7619abb910c..48bdae43e58 100644 --- a/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-no-repo.xml +++ b/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test-no-repo.xml @@ -7,24 +7,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> @@ -32,5 +18,4 @@ - diff --git a/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test.xml b/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test.xml index 927899977e4..9ba11a0e4cb 100644 --- a/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test.xml +++ b/provisioning/provisioning-impl/src/test/resources/ctx-provisioning-test.xml @@ -6,28 +6,16 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - - + + class="com.evolveum.midpoint.repo.sql.testing.LightweightIdentifierGeneratorMock"/> diff --git a/provisioning/ucf-impl-builtin/src/main/resources/ctx-ucf-builtin.xml b/provisioning/ucf-impl-builtin/src/main/resources/ctx-ucf-builtin.xml index 440731e04af..b6576a6b7b9 100644 --- a/provisioning/ucf-impl-builtin/src/main/resources/ctx-ucf-builtin.xml +++ b/provisioning/ucf-impl-builtin/src/main/resources/ctx-ucf-builtin.xml @@ -6,28 +6,16 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - - - - + + + diff --git a/provisioning/ucf-impl-connid/src/main/resources/ctx-ucf-connid.xml b/provisioning/ucf-impl-connid/src/main/resources/ctx-ucf-connid.xml index 30e94648a87..912d47bace3 100644 --- a/provisioning/ucf-impl-connid/src/main/resources/ctx-ucf-connid.xml +++ b/provisioning/ucf-impl-connid/src/main/resources/ctx-ucf-connid.xml @@ -6,28 +6,16 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - - - - + + + diff --git a/provisioning/ucf-impl-connid/src/test/resources/ctx-ucf-connid-test.xml b/provisioning/ucf-impl-connid/src/test/resources/ctx-ucf-connid-test.xml index 00e48519422..07a501026df 100644 --- a/provisioning/ucf-impl-connid/src/test/resources/ctx-ucf-connid-test.xml +++ b/provisioning/ucf-impl-connid/src/test/resources/ctx-ucf-connid-test.xml @@ -7,29 +7,18 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - + + class="com.evolveum.midpoint.repo.sql.testing.LightweightIdentifierGeneratorMock"/> diff --git a/repo/audit-impl/src/test/resources/ctx-audit-test.xml b/repo/audit-impl/src/test/resources/ctx-audit-test.xml index b3cbdd93bd7..d407b38b2ae 100644 --- a/repo/audit-impl/src/test/resources/ctx-audit-test.xml +++ b/repo/audit-impl/src/test/resources/ctx-audit-test.xml @@ -6,27 +6,14 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - - + - diff --git a/repo/repo-common/src/test/resources/ctx-repo-common-test-main.xml b/repo/repo-common/src/test/resources/ctx-repo-common-test-main.xml index 3bba1ab7048..c7a3dcc682d 100644 --- a/repo/repo-common/src/test/resources/ctx-repo-common-test-main.xml +++ b/repo/repo-common/src/test/resources/ctx-repo-common-test-main.xml @@ -6,24 +6,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/repo/repo-common/src/test/resources/ctx-repo-common-test.xml b/repo/repo-common/src/test/resources/ctx-repo-common-test.xml index 907eaeef30c..b9684c25c09 100644 --- a/repo/repo-common/src/test/resources/ctx-repo-common-test.xml +++ b/repo/repo-common/src/test/resources/ctx-repo-common-test.xml @@ -6,25 +6,14 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - + diff --git a/repo/security-impl/src/test/resources/ctx-security-test-main.xml b/repo/security-impl/src/test/resources/ctx-security-test-main.xml index 635920e5592..f95efddaee7 100644 --- a/repo/security-impl/src/test/resources/ctx-security-test-main.xml +++ b/repo/security-impl/src/test/resources/ctx-security-test-main.xml @@ -6,24 +6,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/repo/security-impl/src/test/resources/ctx-security-test.xml b/repo/security-impl/src/test/resources/ctx-security-test.xml index a2d098bca4e..9ba11a0e4cb 100644 --- a/repo/security-impl/src/test/resources/ctx-security-test.xml +++ b/repo/security-impl/src/test/resources/ctx-security-test.xml @@ -6,27 +6,16 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - + + class="com.evolveum.midpoint.repo.sql.testing.LightweightIdentifierGeneratorMock"/> diff --git a/testing/conntest/src/test/resources/ctx-conntest-test-main.xml b/testing/conntest/src/test/resources/ctx-conntest-test-main.xml index 4ed23ab35a6..02850d44258 100644 --- a/testing/conntest/src/test/resources/ctx-conntest-test-main.xml +++ b/testing/conntest/src/test/resources/ctx-conntest-test-main.xml @@ -6,24 +6,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> @@ -39,5 +25,4 @@ - diff --git a/testing/conntest/src/test/resources/ctx-conntest-test.xml b/testing/conntest/src/test/resources/ctx-conntest-test.xml index d4678f55dfd..f3f540eec3a 100644 --- a/testing/conntest/src/test/resources/ctx-conntest-test.xml +++ b/testing/conntest/src/test/resources/ctx-conntest-test.xml @@ -6,27 +6,14 @@ ~ and European Union Public License. See LICENSE file for details. --> - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> + + diff --git a/testing/longtest/src/test/resources/ctx-longtest-test-main.xml b/testing/longtest/src/test/resources/ctx-longtest-test-main.xml index d7746b52c9a..9272a362671 100644 --- a/testing/longtest/src/test/resources/ctx-longtest-test-main.xml +++ b/testing/longtest/src/test/resources/ctx-longtest-test-main.xml @@ -6,24 +6,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> @@ -39,5 +25,4 @@ - diff --git a/testing/longtest/src/test/resources/ctx-longtest-test.xml b/testing/longtest/src/test/resources/ctx-longtest-test.xml index aa292c23e49..55d7263c3d9 100644 --- a/testing/longtest/src/test/resources/ctx-longtest-test.xml +++ b/testing/longtest/src/test/resources/ctx-longtest-test.xml @@ -6,27 +6,14 @@ ~ and European Union Public License. See LICENSE file for details. --> - - - - + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> + + diff --git a/testing/story/src/test/resources/ctx-story-test-main.xml b/testing/story/src/test/resources/ctx-story-test-main.xml index 5a097c447e4..f7e22ad17a4 100644 --- a/testing/story/src/test/resources/ctx-story-test-main.xml +++ b/testing/story/src/test/resources/ctx-story-test-main.xml @@ -6,24 +6,10 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd" + default-lazy-init="false"> diff --git a/testing/story/src/test/resources/ctx-story-test.xml b/testing/story/src/test/resources/ctx-story-test.xml index 718c3577363..6bb7a18670d 100644 --- a/testing/story/src/test/resources/ctx-story-test.xml +++ b/testing/story/src/test/resources/ctx-story-test.xml @@ -6,27 +6,15 @@ ~ and European Union Public License. See LICENSE file for details. --> + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans + http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/context + http://www.springframework.org/schema/context/spring-context-3.0.xsd" + default-lazy-init="false"> - - - + + From b92f2587382e2bab12b6fcd839263b8a4266eab2 Mon Sep 17 00:00:00 2001 From: Richard Richter Date: Wed, 27 May 2020 09:19:08 +0200 Subject: [PATCH 9/9] fixes of prerequisit(i)es and i(n)s(t)all typos --- INSTALL | 8 ++++---- INSTALL-dist | 4 ++-- pom.xml | 2 +- .../main/java/com/evolveum/midpoint/task/api/Task.java | 4 ++-- .../midpoint/task/quartzimpl/TestTaskManagerContract.java | 6 +++--- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/INSTALL b/INSTALL index c87284394ea..ecc96cf0103 100644 --- a/INSTALL +++ b/INSTALL @@ -5,20 +5,20 @@ This file contains quick install guide. For Full commented installation manual g https://wiki.evolveum.com/display/midPoint/midPoint+Development+Snapshot -1. Pre-requisities: +1. Prerequisites: 1. Java (JDK) 11 2. Apache Maven 3 3. midPoint source code retrieved via Git 2. Compile sources - + 2.1 Building sources with tests Execute the following maven command: mvn install - + Note: building midPoint with the tests takes considerably long time (approx. 1 hour) 2.2 Building sources without tests @@ -31,7 +31,7 @@ After the build is complete the distribution archives are available in: dist/target/ -2.4 Insall the distribution +2.4 Install the distribution Unpack the distribution package to a convenient place (e.g. /opt/midpoint) diff --git a/INSTALL-dist b/INSTALL-dist index bb05c1649c7..48da960dc84 100644 --- a/INSTALL-dist +++ b/INSTALL-dist @@ -1,12 +1,12 @@ INSTALLING MIDPOINT FROM BINARY DISTRIBUTION -------------------------------------------- -This file contains quick installation guide. Full installation guide +This file contains quick installation guide. Full installation guide and release notes can be found at: https://wiki.evolveum.com/display/midPoint/midPoint+Releases -1. Pre-requisities: +1. Prerequisites: Java (JRE) 11 diff --git a/pom.xml b/pom.xml index f3b3e5932f8..4b2aa9be882 100644 --- a/pom.xml +++ b/pom.xml @@ -57,7 +57,7 @@ Running unit+IT tests of a selected module (-pl) with output to stdout: mvn clean install -DredirectTestOutputToFile=false -pl model/model-intest - Running GUI tests from Schrodinger module only with custom location of ChromeDriver (Chrome must be istalled too): + Running GUI tests from Schrodinger module only with custom location of ChromeDriver (Chrome must be installed too): mvn clean install -P -dist -DskipTests -DskipSchrodingerTests=false -DwebdriverLocation=/c/work/tools/bin/chromedriver.exe --> diff --git a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java index eb3f75b493c..b7a2a0f6c88 100644 --- a/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java +++ b/repo/task-api/src/main/java/com/evolveum/midpoint/task/api/Task.java @@ -790,10 +790,10 @@ default List listSubtasksDeeply(OperationResult result) throws SchemaExcep /** * List all prerequisite tasks for the current tasks, i.e. tasks that must complete before this one can proceed. - * If A is on the list of prerequisities of B (THIS), it means that B is on list of dependents of A (i.e. + * If A is on the list of prerequisites of B (THIS), it means that B is on list of dependents of A (i.e. * B waits for A to complete). * - * Again, implicit prerequisities (children) are not listed here. + * Again, implicit prerequisites (children) are not listed here. */ List listPrerequisiteTasks(OperationResult parentResult) throws SchemaException; diff --git a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestTaskManagerContract.java b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestTaskManagerContract.java index 3738b42bea1..a45553c82f9 100644 --- a/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestTaskManagerContract.java +++ b/repo/task-quartz-impl/src/test/java/com/evolveum/midpoint/task/quartzimpl/TestTaskManagerContract.java @@ -760,9 +760,9 @@ public void test016WaitForSubtasks() throws Exception { Task firstPrerequisiteTask = taskManager.createTaskInstance( addObjectFromFile(taskFilename("-prerequisite-1")), result); - List prerequisities = rootTask.listPrerequisiteTasks(result); - assertEquals("Wrong # of prerequisite tasks", 1, prerequisities.size()); - assertEquals("Wrong OID of prerequisite task", firstPrerequisiteTask.getOid(), prerequisities.get(0).getOid()); + List prerequisites = rootTask.listPrerequisiteTasks(result); + assertEquals("Wrong # of prerequisite tasks", 1, prerequisites.size()); + assertEquals("Wrong OID of prerequisite task", firstPrerequisiteTask.getOid(), prerequisites.get(0).getOid()); Task secondPrerequisiteTask = taskManager.createTaskInstance(); secondPrerequisiteTask.setName("Second prerequisite");