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 416bde895fb..fe8ba5212ea 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 @@ -39,6 +39,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.PropertyConstraintType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; @@ -98,16 +99,56 @@ public ArchetypePolicyType determineArchetypePolicy(Prism if (object == null) { return null; } + ArchetypePolicyType archetypePolicy = null; if (object.canRepresent(AssignmentHolderType.class)) { PrismObject archetype = determineArchetype((PrismObject) object, result); if (archetype != null) { - return archetype.asObjectable().getArchetypePolicy(); + archetypePolicy = archetype.asObjectable().getArchetypePolicy(); } } // No archetype for this object. Try to find appropriate system configuration section for this object. - return determineObjectPolicyConfiguration(object, result); + ObjectPolicyConfigurationType objectPolicy = determineObjectPolicyConfiguration(object, result); + // TODO: cache the result of the merge + return merge(archetypePolicy, objectPolicy); } + private ArchetypePolicyType merge(ArchetypePolicyType archetypePolicy, ObjectPolicyConfigurationType objectPolicy) { + if (archetypePolicy == null && objectPolicy == null) { + return null; + } + if (archetypePolicy == null) { + return objectPolicy.clone(); + } + if (objectPolicy == null) { + return archetypePolicy.clone(); + } + ArchetypePolicyType resultPolicy = archetypePolicy.clone(); + if (archetypePolicy.getApplicablePolicies() == null && objectPolicy.getApplicablePolicies() != null) { + resultPolicy.setApplicablePolicies(objectPolicy.getApplicablePolicies().clone()); + } + if (archetypePolicy.getConflictResolution() == null && objectPolicy.getConflictResolution() != null) { + resultPolicy.setConflictResolution(objectPolicy.getConflictResolution().clone()); + } + if (archetypePolicy.getDisplay() == null && objectPolicy.getDisplay() != null) { + resultPolicy.setDisplay(objectPolicy.getDisplay().clone()); + } + if (archetypePolicy.getExpressionProfile() == null && objectPolicy.getExpressionProfile() != null) { + resultPolicy.setExpressionProfile(objectPolicy.getExpressionProfile()); + } + if (archetypePolicy.getLifecycleStateModel() == null && objectPolicy.getLifecycleStateModel() != null) { + resultPolicy.setLifecycleStateModel(objectPolicy.getLifecycleStateModel().clone()); + } + if (archetypePolicy.getObjectTemplateRef() == null && objectPolicy.getObjectTemplateRef() != null) { + resultPolicy.setObjectTemplateRef(objectPolicy.getObjectTemplateRef().clone()); + } + if (archetypePolicy.getPropertyConstraint().isEmpty()) { + for (PropertyConstraintType objPropertyConstraint : objectPolicy.getPropertyConstraint()) { + resultPolicy.getPropertyConstraint().add(objPropertyConstraint.clone()); + } + } + return resultPolicy; + } + public ObjectPolicyConfigurationType determineObjectPolicyConfiguration(PrismObject object, OperationResult result) throws SchemaException, ConfigurationException { if (object == null) { return null; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/archetypes/TestArchetypes.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/archetypes/TestArchetypes.java index 5e11b510b04..a57ec2e0b51 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/archetypes/TestArchetypes.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/archetypes/TestArchetypes.java @@ -16,6 +16,8 @@ package com.evolveum.midpoint.model.intest.archetypes; import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNotNull; +import static org.testng.AssertJUnit.assertTrue; import java.io.File; @@ -27,6 +29,9 @@ import com.evolveum.midpoint.model.api.authentication.CompiledUserProfile; import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.PrismPropertyDefinition; +import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -36,6 +41,13 @@ import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.util.exception.CommonException; +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.xml.ns._public.common.common_3.ActivationStatusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; @@ -114,6 +126,24 @@ protected File getSystemConfigurationFile() { return SYSTEM_CONFIGURATION_ARCHETYPES_FILE; } + /** + * Test sanity of test setup. User jack, without any archetype. + */ + @Test + public void test020SanityJack() throws Exception { + final String TEST_NAME = "test020SanityJack"; + displayTestTitle(TEST_NAME); + + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + PrismObject user = assertUserBefore(USER_JACK_OID) + .assertFullName(USER_JACK_FULL_NAME) + .getObject(); + + assertEditSchema(user); + } + @Test public void test050AddArchetypeTest() throws Exception { final String TEST_NAME = "test050AddArchetypeTest"; @@ -229,6 +259,9 @@ public void test100AssignJackArchetypeEmployee() throws Exception { .displayType() .assertLabel(ARCHETYPE_EMPLOYEE_DISPLAY_LABEL) .assertPluralLabel(ARCHETYPE_EMPLOYEE_DISPLAY_PLURAL_LABEL); + + // MID-5277 + assertEditSchema(userAfter); } private String costCenterEmployee() { @@ -671,4 +704,16 @@ public void test205GetGuybryshCompiledUserProfileActiveEmployeesView() throws Ex // TODO: assignmentRelation (assertArchetypeSpec) + protected void assertEditSchema(PrismObject user) throws CommonException { + PrismObjectDefinition editDef = getEditObjectDefinition(user); + + // This has overridden lookup def in object template + PrismPropertyDefinition preferredLanguageDef = editDef.findPropertyDefinition(UserType.F_PREFERRED_LANGUAGE); + assertNotNull("No definition for preferredLanguage in user", preferredLanguageDef); + assertEquals("Wrong preferredLanguage displayName", "Language", preferredLanguageDef.getDisplayName()); + assertTrue("preferredLanguage not readable", preferredLanguageDef.canRead()); + PrismReferenceValue valueEnumerationRef = preferredLanguageDef.getValueEnumerationRef(); + assertNotNull("No valueEnumerationRef for preferredLanguage", valueEnumerationRef); + assertEquals("Wrong valueEnumerationRef OID for preferredLanguage", LOOKUP_LANGUAGES_OID, valueEnumerationRef.getOid()); + } } diff --git a/model/model-intest/src/test/resources/archetypes/user-template-archetypes-global.xml b/model/model-intest/src/test/resources/archetypes/user-template-archetypes-global.xml index 34da4c28846..49169c3d699 100644 --- a/model/model-intest/src/test/resources/archetypes/user-template-archetypes-global.xml +++ b/model/model-intest/src/test/resources/archetypes/user-template-archetypes-global.xml @@ -1,6 +1,6 @@