Skip to content

Commit

Permalink
Merging of object policy (system config) and archetype policy (MID-5277)
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed May 6, 2019
1 parent dedd74c commit 9033ad8
Show file tree
Hide file tree
Showing 3 changed files with 95 additions and 3 deletions.
Expand Up @@ -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;

Expand Down Expand Up @@ -98,16 +99,56 @@ public <O extends ObjectType> ArchetypePolicyType determineArchetypePolicy(Prism
if (object == null) {
return null;
}
ArchetypePolicyType archetypePolicy = null;
if (object.canRepresent(AssignmentHolderType.class)) {
PrismObject<ArchetypeType> archetype = determineArchetype((PrismObject<? extends AssignmentHolderType>) 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 <O extends ObjectType> ObjectPolicyConfigurationType determineObjectPolicyConfiguration(PrismObject<O> object, OperationResult result) throws SchemaException, ConfigurationException {
if (object == null) {
return null;
Expand Down
Expand Up @@ -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;

Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<UserType> user = assertUserBefore(USER_JACK_OID)
.assertFullName(USER_JACK_FULL_NAME)
.getObject();

assertEditSchema(user);
}

@Test
public void test050AddArchetypeTest() throws Exception {
final String TEST_NAME = "test050AddArchetypeTest";
Expand Down Expand Up @@ -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() {
Expand Down Expand Up @@ -671,4 +704,16 @@ public void test205GetGuybryshCompiledUserProfileActiveEmployeesView() throws Ex

// TODO: assignmentRelation (assertArchetypeSpec)

protected void assertEditSchema(PrismObject<UserType> user) throws CommonException {
PrismObjectDefinition<UserType> editDef = getEditObjectDefinition(user);

// This has overridden lookup def in object template
PrismPropertyDefinition<String> 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());
}
}
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
~ Copyright (c) 2010-2018 Evolveum
~ Copyright (c) 2010-2019 Evolveum
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
Expand Down Expand Up @@ -41,4 +41,10 @@
</mapping>
</item>

<item>
<ref>preferredLanguage</ref>
<displayName>Language</displayName>
<valueEnumerationRef oid="70000000-0000-0000-1111-000000000001" type="LookupTableType"/>
</item>

</objectTemplate>

0 comments on commit 9033ad8

Please sign in to comment.