diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelElementContext.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelElementContext.java index 55aaa8602d4..ab4718e11af 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelElementContext.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/ModelElementContext.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.schema.ObjectDeltaOperation; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.jetbrains.annotations.NotNull; @@ -67,4 +68,5 @@ public interface ModelElementContext extends Serializable, Collection getPolicyRules(); boolean isOfType(Class aClass); + } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/ArchetypeManager.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/ArchetypeManager.java index ee955761e9b..13f91c41bb0 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/ArchetypeManager.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/ArchetypeManager.java @@ -83,7 +83,7 @@ public PrismObject determineArch return determineArchetype(assignmentHolder, null, result); } - private PrismObject determineArchetype(PrismObject assignmentHolder, String explicitArchetypeOid, OperationResult result) throws SchemaException, ConfigurationException { + public PrismObject determineArchetype(PrismObject assignmentHolder, String explicitArchetypeOid, OperationResult result) throws SchemaException, ConfigurationException { String archetypeOid; if (explicitArchetypeOid != null) { archetypeOid = explicitArchetypeOid; 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 d4931dc1b56..28b4f55af94 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 @@ -1834,6 +1834,16 @@ public boolean hasArchetype(O object, String archetypeOid if (!(object instanceof AssignmentHolderType)) { return archetypeOid == null; } + + LensContext lensContext = ModelExpressionThreadLocalHolder.getLensContext(); + if (lensContext != null) { + LensFocusContext focusContext = lensContext.getFocusContext(); + ArchetypeType archetypeType = focusContext.getArchetype(); + if (archetypeType != null) { + return archetypeType.getOid().equals(archetypeOid); + } + } + List archetypeRefs = ((AssignmentHolderType)object).getArchetypeRef(); if (archetypeOid == null) { return archetypeRefs.isEmpty(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java index 668e6b59768..90d8e22f3e5 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensFocusContext.java @@ -58,6 +58,7 @@ public class LensFocusContext extends LensElementContext secondaryDeltas = new ObjectDeltaWaves<>(); transient private ArchetypePolicyType archetypePolicyType; + transient private ArchetypeType archetype; // extracted from the template(s) // this is not to be serialized into XML, but let's not mark it as transient @@ -83,6 +84,14 @@ public void setArchetypePolicyType(ArchetypePolicyType objectPolicyConfiguration this.archetypePolicyType = objectPolicyConfigurationType; } + public ArchetypeType getArchetype() { + return archetype; + } + + public void setArchetype(ArchetypeType archetype) { + this.archetype = archetype; + } + public LifecycleStateModelType getLifecycleModel() { if (archetypePolicyType == null) { return null; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java index 82dc45d6887..9b35e92bafb 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/ContextLoader.java @@ -28,6 +28,8 @@ import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import net.sf.ehcache.CacheOperationOutcomes.GetAllOutcome; + import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; @@ -462,6 +464,35 @@ private ArchetypePolicyType determineArchetypePolicy(Lens return null; } PrismObject object = context.getFocusContext().getObjectAny(); + String explicitArchetypeOid = determineExplicitArchetypeOid(context); + return archetypeManager.determineArchetypePolicy(object, explicitArchetypeOid, result); + } + + public ArchetypeType updateArchetype(LensContext context, Task task, OperationResult result) throws SchemaException, ConfigurationException { + PrismObject systemConfiguration = context.getSystemConfiguration(); + if (systemConfiguration == null) { + return null; + } + if (context.getFocusContext() == null) { + return null; + } + + PrismObject object = context.getFocusContext().getObjectAny(); + + String explicitArchetypeOid = determineExplicitArchetypeOid(context); + PrismObject archetype = archetypeManager.determineArchetype(object, explicitArchetypeOid, result); + ArchetypeType archetypeType = null; + if (archetype != null) { + archetypeType = archetype.asObjectable(); + } + + context.getFocusContext().setArchetype(archetypeType); + + return archetypeType; + } + + private String determineExplicitArchetypeOid(LensContext context) { + PrismObject object = context.getFocusContext().getObjectAny(); String explicitArchetypeOid = null; // Used in cases where archetype assignment haven't had the change to be processed yet. // E.g. in case that we are creating a new object with archetype assignment @@ -477,7 +508,7 @@ private ArchetypePolicyType determineArchetypePolicy(Lens } } } - return archetypeManager.determineArchetypePolicy(object, explicitArchetypeOid, result); + return explicitArchetypeOid; } public void updateArchetypePolicy(LensContext context, Task task, OperationResult result) throws SchemaException, ConfigurationException { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentHolderProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentHolderProcessor.java index c29de106a5a..e5015843d19 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentHolderProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentHolderProcessor.java @@ -206,6 +206,7 @@ private void processFocusFocus(LensContext if (consistencyChecks) context.checkConsistence(); context.recomputeFocus(); contextLoader.updateArchetypePolicy(context, task, result); + contextLoader.updateArchetype(context, task, result); medic.traceContext(LOGGER, activityDescription, "inbound", false, context, false); if (consistencyChecks) context.checkConsistence(); },