Skip to content

Commit

Permalink
Focus mappings in assignments. Only partially tested.
Browse files Browse the repository at this point in the history
  • Loading branch information
semancik committed Apr 22, 2014
1 parent 7dd435f commit 9da6902
Show file tree
Hide file tree
Showing 14 changed files with 496 additions and 205 deletions.
47 changes: 24 additions & 23 deletions infra/schema/src/main/resources/xml/ns/public/common/common-2a.xsd
Expand Up @@ -2634,6 +2634,14 @@
</xsd:documentation>
</xsd:annotation>
</xsd:element>

<xsd:element name="focusMappings" type="tns:MappingsType" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
Set of mappings that are applied to a focus in addition to object template.
</xsd:documentation>
</xsd:annotation>
</xsd:element>

</xsd:choice>

Expand Down Expand Up @@ -2662,6 +2670,22 @@
</xsd:complexType>

<xsd:element name="assignment" type="tns:AssignmentType"/>

<xsd:complexType name="MappingsType">
<xsd:annotation>
<xsd:documentation>
Genric set of mappings.
</xsd:documentation>
<xsd:appinfo>
<a:container/>
</xsd:appinfo>
</xsd:annotation>
<xsd:sequence>
<xsd:element ref="tns:description" minOccurs="0"/>
<xsd:element name="mapping" type="tns:MappingType" minOccurs="0" maxOccurs="unbounded">
</xsd:element>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="ActivationType">
<xsd:annotation>
Expand Down Expand Up @@ -6703,29 +6727,6 @@
</xsd:documentation>
</xsd:annotation>
</xsd:element>
<xsd:element name="accountConstruction" type="tns:ConstructionType" minOccurs="0"
maxOccurs="unbounded">
<xsd:annotation>
<xsd:documentation>
. This should no longer be used. It will disappear.

Defines an account that the user should have.
It defines the resource and account type. Such
account will be created (if it does not yet
exist) and will be linked to the user.
Usual outbound expressions from the resource
definition are used to set-up the account
parameters.

This may be non-systemic short-term solution. We
need a way how "assign" the account to the user
correctly.
</xsd:documentation>
<xsd:appinfo>
<a:deprecated>true</a:deprecated>
</xsd:appinfo>
</xsd:annotation>
</xsd:element>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
Expand Down
Expand Up @@ -23,6 +23,7 @@

import com.evolveum.midpoint.common.ActivationComputer;
import com.evolveum.midpoint.model.common.expression.ObjectDeltaObject;
import com.evolveum.midpoint.model.common.mapping.Mapping;
import com.evolveum.midpoint.model.common.mapping.MappingFactory;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Item;
Expand Down Expand Up @@ -53,6 +54,8 @@
import com.evolveum.midpoint.xml.ns._public.common.common_2a.AuthorizationType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.ConstructionType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.MappingType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.MappingsType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.OrgType;
Expand Down Expand Up @@ -212,6 +215,13 @@ private void evaluateAssignment(EvaluatedAssignment evalAssignment, AssignmentPa
assignmentPath, assignmentPathSegment.getOrderOneObject(), task, result);
}

} else if (assignmentType.getFocusMappings() != null) {

if (evaluateConstructions && assignmentPathSegment.isEvaluateConstructions()) {
evaluateMappings(evalAssignment, assignmentPathSegment, source, sourceDescription,
assignmentPath, assignmentPathSegment.getOrderOneObject(), task, result);
}

} else if (assignmentType.getTarget() != null) {

evaluateTarget(evalAssignment, assignmentPathSegment, assignmentType.getTarget(), source, null, sourceDescription,
Expand Down Expand Up @@ -266,6 +276,28 @@ private void evaluateConstruction(EvaluatedAssignment evaluatedAssignment, Assig

evaluatedAssignment.addConstruction(construction);
}

private void evaluateMappings(EvaluatedAssignment evaluatedAssignment, AssignmentPathSegment assignmentPathSegment, ObjectType source, String sourceDescription,
AssignmentPath assignmentPath, ObjectType orderOneObject, Task task, OperationResult result) throws SchemaException, ExpressionEvaluationException, ObjectNotFoundException {
assertSource(source, evaluatedAssignment);


AssignmentType assignmentType = assignmentPathSegment.getAssignmentType();
MappingsType mappingsType = assignmentType.getFocusMappings();

LOGGER.trace("Evaluate focus mappings '{}' in {} ({} mappings)",
new Object[]{mappingsType.getDescription(), source, mappingsType.getMapping().size()});

for (MappingType mappingType: mappingsType.getMapping()) {
Mapping mapping = LensUtil.createFocusMapping(mappingFactory, lensContext, mappingType, source, userOdo, now, sourceDescription, result);
if (mapping == null) {
continue;
}
// TODO: time constratins?
LensUtil.evaluateMapping(mapping, lensContext, task, result);
evaluatedAssignment.addFocusMapping(mapping);
}
}

private void evaluateTargetRef(EvaluatedAssignment assignment, AssignmentPathSegment assignmentPathSegment, ObjectReferenceType targetRef, ObjectType source,
String sourceDescription, AssignmentPath assignmentPath, Task task, OperationResult result) throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException {
Expand Down
Expand Up @@ -18,14 +18,17 @@
import java.util.ArrayList;
import java.util.Collection;

import com.evolveum.midpoint.model.common.mapping.Mapping;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.security.api.Authorization;
import com.evolveum.midpoint.util.DebugDumpable;
import com.evolveum.midpoint.util.DebugUtil;
import com.evolveum.midpoint.util.exception.ObjectNotFoundException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.OrgType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.ResourceType;

Expand All @@ -35,25 +38,27 @@
*
* @author Radovan Semancik
*/
public class EvaluatedAssignment implements DebugDumpable {
public class EvaluatedAssignment<F extends FocusType> implements DebugDumpable {

private Collection<Construction> constructions;
private Collection<Construction<F>> constructions;
private Collection<PrismReferenceValue> orgRefVals;
private Collection<Authorization> authorizations;
private Collection<Mapping<? extends PrismPropertyValue<?>>> focusMappings;
private boolean isValid;

public EvaluatedAssignment() {
constructions = new ArrayList<Construction>();
orgRefVals = new ArrayList<PrismReferenceValue>();
authorizations = new ArrayList<Authorization>();
constructions = new ArrayList<>();
orgRefVals = new ArrayList<>();
authorizations = new ArrayList<>();
focusMappings = new ArrayList<>();
}

public Collection<Construction> getConstructions() {
public Collection<Construction<F>> getConstructions() {
return constructions;
}

public void addConstruction(Construction accpuntContruction) {
constructions.add(accpuntContruction);
public void addConstruction(Construction<F> contruction) {
constructions.add(contruction);
}

public Collection<PrismReferenceValue> getOrgRefVals() {
Expand All @@ -72,6 +77,14 @@ public void addAuthorization(Authorization authorization) {
authorizations.add(authorization);
}

public Collection<Mapping<? extends PrismPropertyValue<?>>> getFocusMappings() {
return focusMappings;
}

public void addFocusMapping(Mapping<? extends PrismPropertyValue<?>> focusMapping) {
this.focusMappings.add(focusMapping);
}

public boolean isValid() {
return isValid;
}
Expand All @@ -82,7 +95,7 @@ public void setValid(boolean isValid) {

public Collection<ResourceType> getResources(OperationResult result) throws ObjectNotFoundException, SchemaException {
Collection<ResourceType> resources = new ArrayList<ResourceType>();
for (Construction acctConstr: constructions) {
for (Construction<F> acctConstr: constructions) {
resources.add(acctConstr.getResource(result));
}
return resources;
Expand All @@ -102,7 +115,7 @@ public String debugDump(int indent) {
if (!constructions.isEmpty()) {
sb.append("\n");
DebugUtil.debugDumpLabel(sb, "Constructions", indent+1);
for (Construction ac: constructions) {
for (Construction<F> ac: constructions) {
sb.append("\n");
sb.append(ac.debugDump(indent+2));
}
Expand All @@ -125,12 +138,21 @@ public String debugDump(int indent) {
sb.append(autz.toString());
}
}
if (!focusMappings.isEmpty()) {
sb.append("\n");
DebugUtil.debugDumpLabel(sb, "Focus Mappings", indent+1);
for (Mapping<? extends PrismPropertyValue<?>> mapping: focusMappings) {
sb.append("\n");
DebugUtil.indentDebugDump(sb, indent+2);
sb.append(mapping.toString());
}
}
return sb.toString();
}

@Override
public String toString() {
return "EvaluatedAssignment(acc=" + constructions + "; org="+orgRefVals+"; autz="+authorizations+")";
return "EvaluatedAssignment(acc=" + constructions + "; org="+orgRefVals+"; autz="+authorizations+"; "+focusMappings.size()+" focus mappings)";
}

}
Expand Up @@ -23,6 +23,7 @@
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ItemDelta;
Expand All @@ -39,6 +40,7 @@
import com.evolveum.midpoint.xml.ns._public.common.common_2a.FocusType;
import com.evolveum.midpoint.xml.ns._public.common.common_2a.ObjectType;
import com.evolveum.midpoint.xml.ns._public.model.model_context_2.LensFocusContextType;

import org.apache.commons.lang.StringUtils;

/**
Expand Down Expand Up @@ -216,6 +218,25 @@ public void adopt(PrismContext prismContext) throws SchemaException {
secondaryDeltas.adopt(prismContext);
}
}

public void applyProjectionWaveSecondaryDeltas(Collection<ItemDelta<? extends PrismValue>> itemDeltas) throws SchemaException {
ObjectDelta<O> wavePrimaryDelta = getProjectionWavePrimaryDelta();
ObjectDelta<O> waveSecondaryDelta = getProjectionWaveSecondaryDelta();
for (ItemDelta<? extends PrismValue> itemDelta: itemDeltas) {
if (itemDelta != null && !itemDelta.isEmpty()) {
if (wavePrimaryDelta == null || !wavePrimaryDelta.containsModification(itemDelta)) {
if (waveSecondaryDelta == null) {
waveSecondaryDelta = new ObjectDelta<O>(getObjectTypeClass(), ChangeType.MODIFY, getPrismContext());
if (getObjectNew() != null && getObjectNew().getOid() != null){
waveSecondaryDelta.setOid(getObjectNew().getOid());
}
setProjectionWaveSecondaryDelta(waveSecondaryDelta);
}
waveSecondaryDelta.mergeModification(itemDelta);
}
}
}
}

@Override
public LensFocusContext<O> clone(LensContext lensContext) {
Expand Down

0 comments on commit 9da6902

Please sign in to comment.