Skip to content

Commit

Permalink
Merge branch 'master' of github.com:Evolveum/midpoint
Browse files Browse the repository at this point in the history
  • Loading branch information
1azyman committed Nov 2, 2017
2 parents 40af67c + 11c0890 commit 174e971
Show file tree
Hide file tree
Showing 13 changed files with 269 additions and 103 deletions.
5 changes: 4 additions & 1 deletion dist/src/main/bin/start.sh
@@ -1 +1,4 @@
# TODO
#!/bin/bash
echo "Starting midPoint"
path=$(cd $(dirname "$0") && pwd -P)/$(basename "$1")
java -jar -Xms1024M -Xmx2048M -Dmidpoint.home=$path../var $path../lib/midpoint.war
Expand Up @@ -1919,7 +1919,7 @@ public static void merge(Collection<? extends ItemDelta> modifications, ItemDelt
((Collection)modifications).add(delta);
}

public static void mergeAll(Collection<? extends ItemDelta> modifications, Collection<? extends ItemDelta> deltasToMerge) {
public static void mergeAll(Collection<? extends ItemDelta<?,?>> modifications, Collection<? extends ItemDelta<?,?>> deltasToMerge) {
if (deltasToMerge == null) {
return;
}
Expand Down
Expand Up @@ -25,32 +25,14 @@
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPathSegment;
import com.evolveum.midpoint.prism.path.NameItemPathSegment;

import com.evolveum.midpoint.util.QNameUtil;
import org.jetbrains.annotations.NotNull;
import org.w3c.dom.Element;

import com.evolveum.midpoint.prism.ComplexTypeDefinition;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.Item;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.Objectable;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.prism.PrismPropertyValue;
import com.evolveum.midpoint.prism.PrismReference;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.PrismValue;
import com.evolveum.midpoint.prism.OriginType;
import com.evolveum.midpoint.prism.Visitable;
import com.evolveum.midpoint.prism.Visitor;
import com.evolveum.midpoint.prism.delta.ChangeType;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.DeltaSetTriple;
Expand Down Expand Up @@ -1172,6 +1154,10 @@ public static <T> void assertEqualsCollectionUnordered(String message, Collectio
"; was "+actualCollection;
}

public static <T> void assertEqualsCollectionUnordered(String message, Collection<T> expected, Collection<T> real) {
assertEquals(message, new HashSet<>(expected), new HashSet<>(real));
}

public static void assertOrigEqualsPolyStringCollectionUnordered(String message, Collection<PolyStringType> actualCollection, String... expectedValues) {
List<PolyStringType> expectedCollection = new ArrayList<>();
for (String expectedValue : expectedValues) {
Expand Down Expand Up @@ -1299,4 +1285,9 @@ private static void assertHasNoObject(PrismReferenceValue prv) {
assertNull("Resolved object present in " + prv + ": " + prv.getObject(), prv.getObject());
}

public static void assertReferenceOids(String message, Collection<String> expectedOids,
Collection<? extends Referencable> realReferences) {
Set<String> realOids = realReferences.stream().map(r -> r.getOid()).collect(Collectors.toSet());
assertEquals(message, new HashSet<>(expectedOids), realOids);
}
}
Expand Up @@ -101,7 +101,7 @@ public static void assertFocusDefinition(ComplexTypeDefinition complexTypeDefini
assertFalse("Metadata is runtime", metadataContainer.isRuntimeSchema());
assertFalse("Metadata is dynamic", metadataContainer.isDynamic());
assertTrue("Metadata is NOT operational", metadataContainer.isOperational());
assertEquals("Metadata size", 13, metadataContainer.getDefinitions().size());
assertEquals("Metadata size", 23, metadataContainer.getDefinitions().size());

PrismReferenceDefinition tenantRefDef = complexTypeDefinition.findItemDefinition(UserType.F_TENANT_REF, PrismReferenceDefinition.class);
PrismAsserts.assertDefinition(tenantRefDef, UserType.F_TENANT_REF, ObjectReferenceType.COMPLEX_TYPE, 0, 1);
Expand Down
Expand Up @@ -46,7 +46,7 @@
* Handles a "ModelOperation task" - executes a given model operation in a context
* of the task (i.e., in most cases, asynchronously).
*
* The context of the model operation (i.e., model context) is stored in task extension property
* The context of the model operation (i.e., model context) is stored in task property
* called "modelContext". When this handler is executed, the context is retrieved, unwrapped from
* its XML representation, and the model operation is (re)started.
*
Expand Down
Expand Up @@ -15,13 +15,14 @@
*/
package com.evolveum.midpoint.model.impl.lens;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.*;

import javax.xml.datatype.XMLGregorianCalendar;

import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder;
import com.evolveum.midpoint.prism.path.IdItemPathSegment;
import com.evolveum.midpoint.prism.path.ItemPath.CompareResult;
import com.evolveum.midpoint.prism.path.ItemPathSegment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

Expand All @@ -30,13 +31,10 @@
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContext;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.prism.PrismReferenceValue;
import com.evolveum.midpoint.prism.delta.ContainerDelta;
import com.evolveum.midpoint.prism.delta.ItemDelta;
import com.evolveum.midpoint.prism.delta.ObjectDelta;
import com.evolveum.midpoint.prism.delta.PropertyDelta;
import com.evolveum.midpoint.prism.delta.ReferenceDelta;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.constants.SchemaConstants;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -53,6 +51,8 @@
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import static com.evolveum.midpoint.prism.path.ItemPath.CompareResult.EQUIVALENT;
import static com.evolveum.midpoint.prism.path.ItemPath.CompareResult.SUPERPATH;
import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.createObjectRef;
import static java.util.Collections.emptySet;
import static java.util.Collections.singleton;
Expand All @@ -73,7 +73,7 @@ public class OperationalDataManager {
@Autowired(required = false)
private WorkflowManager workflowManager;

@Autowired(required = true)
@Autowired
private PrismContext prismContext;

public <F extends ObjectType> void applyRequestMetadata(LensContext<F> context,
Expand All @@ -82,7 +82,6 @@ public <F extends ObjectType> void applyRequestMetadata(LensContext<F> context,
MetadataType requestMetadata = new MetadataType();
applyRequestMetadata(context, requestMetadata, now, task);
context.setRequestMetadata(requestMetadata);

}

public <T extends ObjectType, F extends ObjectType> void applyMetadataAdd(LensContext<F> context,
Expand All @@ -105,23 +104,18 @@ public <T extends ObjectType, F extends ObjectType> void applyMetadataAdd(LensCo
metadataType.getCreateApprovalComment().addAll(workflowManager.getApproverComments(task, result));
}

metadataType.setCreateTaskRef(task.getOid() != null ? createObjectRef(task.getTaskPrismObject()) : null);

if (objectToAdd.canRepresent(FocusType.class)) {
applyAssignmentMetadataObject((LensContext<? extends FocusType>) context, objectToAdd, now, task, result);
}

}

public <T extends ObjectType, F extends ObjectType> void applyMetadataModify(ObjectDelta<T> objectDelta,
LensElementContext<T> objectContext, Class objectTypeClass,
XMLGregorianCalendar now, Task task, LensContext<F> context,
OperationResult result) throws SchemaException {

PrismObjectDefinition<T> def = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(objectTypeClass);

ItemDelta.mergeAll(objectDelta.getModifications(),
createModifyMetadataDeltas(context, new ItemPath(ObjectType.F_METADATA), def, now, task));
createModifyMetadataDeltas(context, new ItemPath(ObjectType.F_METADATA), objectTypeClass, now, task));

List<PrismReferenceValue> approverReferenceValues = new ArrayList<>();
List<String> approverComments = new ArrayList<>();
Expand All @@ -131,13 +125,11 @@ public <T extends ObjectType, F extends ObjectType> void applyMetadataModify(Obj
}
approverComments.addAll(workflowManager.getApproverComments(task, result));
}
if (!approverReferenceValues.isEmpty()) {
ItemDelta.mergeAll(objectDelta.getModifications(),
DeltaBuilder.deltaFor(objectTypeClass, prismContext)
.item(ObjectType.F_METADATA, MetadataType.F_MODIFY_APPROVER_REF).replace(approverReferenceValues)
.item(ObjectType.F_METADATA, MetadataType.F_MODIFY_APPROVAL_COMMENT).replaceRealValues(approverComments)
.asItemDeltas());
}
ItemDelta.mergeAll(objectDelta.getModifications(),
DeltaBuilder.deltaFor(objectTypeClass, prismContext)
.item(ObjectType.F_METADATA, MetadataType.F_MODIFY_APPROVER_REF).replace(approverReferenceValues)
.item(ObjectType.F_METADATA, MetadataType.F_MODIFY_APPROVAL_COMMENT).replaceRealValues(approverComments)
.asItemDeltas());
if (FocusType.class.isAssignableFrom(objectTypeClass)) {
applyAssignmentMetadataDelta((LensContext) context,
(ObjectDelta)objectDelta, now, task, result);
Expand All @@ -154,7 +146,6 @@ private <F extends FocusType, T extends ObjectType> void applyAssignmentMetadata
applyAssignmentValueMetadataAdd(context, assignmentContainerValue, "ADD", now, task, result);
}
}

}

private <F extends FocusType> void applyAssignmentMetadataDelta(LensContext<F> context, ObjectDelta<F> objectDelta,
Expand All @@ -166,11 +157,15 @@ private <F extends FocusType> void applyAssignmentMetadataDelta(LensContext<F> c

if (objectDelta.isAdd()) {
applyAssignmentMetadataObject(context, objectDelta.getObjectToAdd(), now, task, result);

} else {

// see also ApprovalMetadataHelper.addAssignmentApprovalMetadataOnObjectModify
Set<Long> processedIds = new HashSet<>();
List<ItemDelta<?,?>> assignmentMetadataDeltas = new ArrayList<>();
for (ItemDelta<?,?> itemDelta: objectDelta.getModifications()) {
if (itemDelta.getPath().equivalent(SchemaConstants.PATH_ASSIGNMENT)) {
ItemPath deltaPath = itemDelta.getPath();
CompareResult comparison = deltaPath.compareComplex(SchemaConstants.PATH_ASSIGNMENT);
if (comparison == EQUIVALENT) {
// whole assignment is being added/replaced (or deleted but we are not interested in that)
ContainerDelta<AssignmentType> assignmentDelta = (ContainerDelta<AssignmentType>)itemDelta;
if (assignmentDelta.getValuesToAdd() != null) {
for (PrismContainerValue<AssignmentType> assignmentContainerValue: assignmentDelta.getValuesToAdd()) {
Expand All @@ -182,12 +177,23 @@ private <F extends FocusType> void applyAssignmentMetadataDelta(LensContext<F> c
applyAssignmentValueMetadataAdd(context, assignmentContainerValue, "MOD/replace", now, task, result);
}
}
} else if (comparison == SUPERPATH) {
ItemPathSegment secondSegment = deltaPath.rest().first();
if (!(secondSegment instanceof IdItemPathSegment)) {
throw new IllegalStateException("Assignment modification contains no assignment ID. Offending path = " + deltaPath);
}
Long id = ((IdItemPathSegment) secondSegment).getId();
if (id == null) {
throw new IllegalStateException("Assignment modification contains no assignment ID. Offending path = " + deltaPath);
}
if (processedIds.add(id)) {
assignmentMetadataDeltas.addAll(createModifyMetadataDeltas(context,
new ItemPath(FocusType.F_ASSIGNMENT, id, AssignmentType.F_METADATA), context.getFocusClass(), now, task));
}
}
// TODO: assignment modification
}

ItemDelta.mergeAll(objectDelta.getModifications(), assignmentMetadataDeltas);
}

}

private <F extends FocusType> void applyAssignmentValueMetadataAdd(LensContext<F> context,
Expand All @@ -203,8 +209,8 @@ private <F extends FocusType> void applyAssignmentValueMetadataAdd(LensContext<F

transplantRequestMetadata(context, metadataType);

// This applies the effective status only to assginments that are completely new (whole container is added/replaced)
// The effectiveStatus of existing assignments is processes in FocusProcessor.processAssignmentActivation()
// This applies the effective status only to assignments that are completely new (whole container is added/replaced)
// The effectiveStatus of existing assignments is processed in FocusProcessor.processAssignmentActivation()
// We cannot process that here. Because this code is not even triggered when there is no delta. So recompute will not work.
ActivationType activationType = assignmentType.getActivation();
ActivationStatusType effectiveStatus = activationComputer.getEffectiveStatus(assignmentType.getLifecycleState(), activationType);
Expand Down Expand Up @@ -253,30 +259,18 @@ private <F extends ObjectType> void applyCreateMetadata(LensContext<F> context,
if (task.getOwner() != null) {
metaData.setCreatorRef(createObjectRef(task.getOwner()));
}
metaData.setCreateTaskRef(task.getOid() != null ? createObjectRef(task.getTaskPrismObject()) : null);
}

public <F extends ObjectType, T extends ObjectType> Collection<ItemDelta<?,?>> createModifyMetadataDeltas(LensContext<F> context,
ItemPath metadataPath, PrismObjectDefinition<T> def, XMLGregorianCalendar now, Task task) throws SchemaException {
Collection<ItemDelta<?,?>> deltas = new ArrayList<>();
String channel = LensUtil.getChannel(context, task);
if (channel != null) {
PropertyDelta<String> delta = PropertyDelta.createModificationReplaceProperty(metadataPath.subPath(MetadataType.F_MODIFY_CHANNEL), def, channel);
deltas.add(delta);
}
PropertyDelta<XMLGregorianCalendar> delta = PropertyDelta.createModificationReplaceProperty(metadataPath.subPath(MetadataType.F_MODIFY_TIMESTAMP), def, now);
deltas.add(delta);
if (task.getOwner() != null) {
ReferenceDelta refDelta = ReferenceDelta.createModificationReplace(
metadataPath.subPath(MetadataType.F_MODIFIER_REF), def, task.getOwner().getOid());
deltas.add(refDelta);
}
deltas.addAll(
DeltaBuilder.deltaFor(def.getCompileTimeClass(), prismContext)
.item(metadataPath.subPath(MetadataType.F_MODIFY_TASK_REF))
.replaceRealValues(
task.getOid() != null ? singleton(createObjectRef(task.getTaskPrismObject())) : emptySet())
.asItemDeltas());
return deltas;
ItemPath metadataPath, Class<T> objectType, XMLGregorianCalendar now, Task task) throws SchemaException {
return DeltaBuilder.deltaFor(objectType, prismContext)
.item(metadataPath.subPath(MetadataType.F_MODIFY_CHANNEL)).replace(LensUtil.getChannel(context, task))
.item(metadataPath.subPath(MetadataType.F_MODIFY_TIMESTAMP)).replace(now)
.item(metadataPath.subPath(MetadataType.F_MODIFIER_REF)).replace(createObjectRef(task.getOwner()))
.item(metadataPath.subPath(MetadataType.F_MODIFY_TASK_REF)).replaceRealValues(
task.getOid() != null ? singleton(createObjectRef(task.getTaskPrismObject())) : emptySet())
.asItemDeltas();
}

}
Expand Up @@ -372,7 +372,7 @@ protected void validateProtectedStringValue(ProtectedStringType value) throws Po
private void addMetadataDelta() throws SchemaException {
Collection<? extends ItemDelta<?, ?>> metaDeltas = metadataManager.createModifyMetadataDeltas(
context, getCredentialsContainerPath().subPath(AbstractCredentialType.F_METADATA),
context.getFocusContext().getObjectDefinition(), now, task);
context.getFocusClass(), now, task);
for (ItemDelta<?, ?> metaDelta : metaDeltas) {
context.getFocusContext().swallowToSecondaryDelta(metaDelta);
}
Expand Down
Expand Up @@ -413,7 +413,7 @@ private <F extends FocusType> void applyMetadata(LensContext<F> context,
} else if (projectionContext.isModify()) {
ContainerDelta<MetadataType> metadataDelta = accountDelta.findContainerDelta(SchemaConstants.PATH_PASSWORD_METADATA);
if (metadataDelta == null) {
Collection<? extends ItemDelta<?,?>> modifyMetadataDeltas = operationalDataManager.createModifyMetadataDeltas(context, SchemaConstants.PATH_PASSWORD_METADATA, projectionContext.getObjectDefinition(), now, task);
Collection<? extends ItemDelta<?,?>> modifyMetadataDeltas = operationalDataManager.createModifyMetadataDeltas(context, SchemaConstants.PATH_PASSWORD_METADATA, projectionContext.getObjectTypeClass(), now, task);
for (ItemDelta itemDelta: modifyMetadataDeltas) {
itemDelta.setOriginTypeRecursive(OriginType.OUTBOUND);
projectionContext.swallowToSecondaryDelta(itemDelta);
Expand Down

0 comments on commit 174e971

Please sign in to comment.