Skip to content

Commit

Permalink
fixing MID-5488 - only single archetype is supported (cherry-picked f…
Browse files Browse the repository at this point in the history
…rom f449107)
  • Loading branch information
katkav committed Jan 14, 2020
1 parent f65a92d commit fb27a58
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 21 deletions.
Expand Up @@ -7,9 +7,13 @@
package com.evolveum.midpoint.model.common;

import java.util.List;
import java.util.stream.Collectors;

import javax.xml.namespace.QName;

import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand All @@ -23,16 +27,6 @@
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.ArchetypePolicyType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ArchetypeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentHolderType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateModelType;
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;

/**
* Component that can efficiently determine archetypes for objects.
Expand Down Expand Up @@ -60,16 +54,42 @@ public <O extends AssignmentHolderType> ObjectReferenceType determineArchetypeRe
if (!assignmentHolder.canRepresent(AssignmentHolderType.class)) {
return null;
}
List<ObjectReferenceType> archetypeRefs = ((AssignmentHolderType)assignmentHolder.asObjectable()).getArchetypeRef();

List<ObjectReferenceType> archetypeAssignmentsRef = determineArchetypesFromAssignments(assignmentHolder.asObjectable());

if (CollectionUtils.isNotEmpty(archetypeAssignmentsRef)) {
if (archetypeAssignmentsRef.size() > 1) {
throw new SchemaException("Only a single archetype for an object is supported: "+assignmentHolder);
}
}

List<ObjectReferenceType> archetypeRefs = assignmentHolder.asObjectable().getArchetypeRef();
if (archetypeRefs == null || archetypeRefs.isEmpty()) {
return null;
}
if (archetypeRefs.size() > 1) {
throw new SchemaException("Only a single archetype for an object is supported: "+assignmentHolder);
}

//check also assignments

return archetypeRefs.get(0);
}

private <O extends AssignmentHolderType> List<ObjectReferenceType> determineArchetypesFromAssignments(O assignmentHolder) {
List<AssignmentType> assignments = assignmentHolder.getAssignment();
return assignments.stream()
.filter(a -> {
ObjectReferenceType target = a.getTargetRef();
if (target == null) {
return false;
}
return QNameUtil.match(ArchetypeType.COMPLEX_TYPE, target.getType());
})
.map(archetypeAssignment -> archetypeAssignment.getTargetRef())
.collect(Collectors.toList());
}

public <O extends AssignmentHolderType> PrismObject<ArchetypeType> determineArchetype(PrismObject<O> assignmentHolder, OperationResult result) throws SchemaException, ConfigurationException {
return determineArchetype(assignmentHolder, null, result);
}
Expand Down
Expand Up @@ -43,7 +43,6 @@
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.Validate;
Expand All @@ -52,7 +51,6 @@
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;
import java.util.*;

/**
Expand Down Expand Up @@ -203,14 +201,17 @@ public <O extends ObjectType> void applySchemasAndSecurity(PrismObject<O> object
}
}

ObjectTemplateType objectTemplateType;
try {
objectTemplateType = determineObjectTemplate(object, AuthorizationPhaseType.REQUEST, result);
} catch (ConfigurationException | ObjectNotFoundException e) {
result.recordFatalError(e);
throw e;
// we do not need to process object template when processing REQUEST in RAW mode.
if (!GetOperationOptions.isRaw(rootOptions)) {
ObjectTemplateType objectTemplateType;
try {
objectTemplateType = determineObjectTemplate(object, AuthorizationPhaseType.REQUEST, result);
} catch (ConfigurationException | SchemaException | ObjectNotFoundException e) {
result.recordFatalError(e);
throw e;
}
applyObjectTemplateToObject(object, objectTemplateType, result);
}
applyObjectTemplateToObject(object, objectTemplateType, result);

if (CollectionUtils.isNotEmpty(options)) {
Map<DefinitionProcessingOption, Collection<UniformItemPath>> definitionProcessing = SelectorOptions.extractOptionValues(options, (o) -> o.getDefinitionProcessing(), prismContext);
Expand Down
Expand Up @@ -1091,7 +1091,7 @@ private <V extends PrismValue, D extends ItemDefinition, F extends AssignmentHol
}

public <F extends ObjectType> void processMembershipAndDelegatedRefs(LensContext<F> context,
OperationResult result) throws SchemaException, PolicyViolationException {
OperationResult result) throws SchemaException, PolicyViolationException, ConfigurationException {
LensFocusContext<F> focusContext = context.getFocusContext();
if (focusContext == null || !AssignmentHolderType.class.isAssignableFrom(focusContext.getObjectTypeClass())) {
return;
Expand All @@ -1114,6 +1114,10 @@ public <F extends ObjectType> void processMembershipAndDelegatedRefs(LensContext
}
}

if (shouldBeArchetypeRefs.size() > 1) {
throw new ConfigurationException("Only single archetype supported. Attemting to add " + shouldBeArchetypeRefs.size() + ": " + shouldBeArchetypeRefs);
}

setReferences(focusContext, AssignmentHolderType.F_ROLE_MEMBERSHIP_REF, shouldBeRoleRefs);
setReferences(focusContext, AssignmentHolderType.F_DELEGATED_REF, shouldBeDelegatedRefs);
setReferences(focusContext, AssignmentHolderType.F_ARCHETYPE_REF, shouldBeArchetypeRefs);
Expand Down
Expand Up @@ -976,6 +976,30 @@ public void test205GetGuybryshCompiledUserProfileActiveEmployeesView() throws Ex

}

@Test
public void test300jackAssignArchetypeRaw() throws Exception {
final String TEST_NAME = "test300jackAssignArchetypeRaw";
displayTestTitle(TEST_NAME);

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

// WHEN
displayWhen(TEST_NAME);

try {
assignArchetype(USER_JACK_OID, ARCHETYPE_CONTRACTOR_OID, task, result);
} catch (SchemaException e) {
// expected
}

assertUserAfter(USER_JACK_OID).assignments()
.by()
.targetOid(ARCHETYPE_CONTRACTOR_OID)
.targetType(ArchetypeType.COMPLEX_TYPE)
.assertNone();
}

// TODO: object template in archetype
// TODO: correct application of object template for new object (not yet stored)

Expand Down

0 comments on commit fb27a58

Please sign in to comment.