From e7b9f62fc4305304d5398cb434c6ba3240f230b7 Mon Sep 17 00:00:00 2001 From: "Katarina Valalikova (katkav)" Date: Wed, 30 Jul 2014 11:04:41 +0200 Subject: [PATCH] fixing MID-2013 (setting corrent value for intent while recociling, process also (newly created) shadows without intent).. --- .../RefinedObjectClassDefinition.java | 17 +++-- .../impl/sync/SynchronizationService.java | 74 +++++++++++++++---- .../midpoint/model/impl/util/Utils.java | 2 +- 3 files changed, 69 insertions(+), 24 deletions(-) diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java index 5cc3d3b8db8..12517f5c97b 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/refinery/RefinedObjectClassDefinition.java @@ -768,15 +768,16 @@ public boolean matches(ShadowType shadowType) { return false; } } - if (shadowType.getIntent() == null) { - if (isDefault) { - return true; - } else { - return false; - } - } else { + if (shadowType.getIntent() != null) { +// if (isDefault) { +// return true; +// } else { +// return false; +// } +// } else { return MiscUtil.equals(intent, shadowType.getIntent()); - } + } + return true; } @Override diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java index 1fa13c97793..a194ae65e62 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/SynchronizationService.java @@ -47,6 +47,7 @@ import com.evolveum.midpoint.model.common.expression.ExpressionVariables; import com.evolveum.midpoint.model.common.expression.Source; import com.evolveum.midpoint.model.common.expression.StringPolicyResolver; +import com.evolveum.midpoint.model.impl.ModelConstants; import com.evolveum.midpoint.model.impl.controller.ModelController; import com.evolveum.midpoint.model.impl.lens.Clockwork; import com.evolveum.midpoint.model.impl.lens.ContextFactory; @@ -174,22 +175,20 @@ public void notifyChange(ResourceObjectShadowChangeDescription change, Task task OperationResult subResult = parentResult.createSubresult(NOTIFY_CHANGE); try { - ResourceType resourceType = change.getResource().asObjectable(); + PrismObject currentShadow = change.getCurrentShadow(); - if (currentShadow != null) { - ShadowType currentShadowType = currentShadow.asObjectable(); - if (currentShadowType.isProtectedObject() != null && currentShadowType.isProtectedObject()) { - LOGGER.trace("SYNCHRONIZATION skipping {} because it is protected", currentShadowType); - // Just make sure there is no misleading synchronization situation in the shadow - if (currentShadowType.getSynchronizationSituation() != null) { - ObjectDelta shadowDelta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, currentShadowType.getOid(), - ShadowType.F_SYNCHRONIZATION_SITUATION, prismContext); - provisioningService.modifyObject(ShadowType.class, currentShadowType.getOid(), - shadowDelta.getModifications(), null, null, task, subResult); - } - subResult.recordStatus(OperationResultStatus.NOT_APPLICABLE, "Skipped because it is protected"); - return; + + if (isProtected((PrismObject) currentShadow)){ + LOGGER.trace("SYNCHRONIZATION skipping {} because it is protected", currentShadow); + // Just make sure there is no misleading synchronization situation in the shadow + if (currentShadow.asObjectable().getSynchronizationSituation() != null) { + ObjectDelta shadowDelta = ObjectDelta.createModificationReplaceProperty(ShadowType.class, currentShadow.getOid(), + ShadowType.F_SYNCHRONIZATION_SITUATION, prismContext); + provisioningService.modifyObject(ShadowType.class, currentShadow.getOid(), + shadowDelta.getModifications(), null, null, task, subResult); } + subResult.recordStatus(OperationResultStatus.NOT_APPLICABLE, "Skipped because it is protected"); + return; } PrismObject applicableShadow = currentShadow; @@ -198,6 +197,7 @@ public void notifyChange(ResourceObjectShadowChangeDescription change, Task task applicableShadow = change.getOldShadow(); } + ResourceType resourceType = change.getResource().asObjectable(); PrismObject configuration = Utils.getSystemConfiguration(repositoryService, subResult); ObjectSynchronizationType synchronizationPolicy = determineSynchronizationPolicy(resourceType, @@ -210,7 +210,7 @@ public void notifyChange(ResourceObjectShadowChangeDescription change, Task task subResult.recordStatus(OperationResultStatus.NOT_APPLICABLE, message); return; } - + if (!isSynchronizationEnabled(synchronizationPolicy)) { String message = "SYNCHRONIZATION is not enabled for " + resourceType + " ignoring change from channel " + change.getSourceChannel(); @@ -219,6 +219,14 @@ public void notifyChange(ResourceObjectShadowChangeDescription change, Task task return; } + //check if the kind/intent in the syncPolicy satisfy constaints defined in task + if (!satisfyTaskConstaints(synchronizationPolicy, task)){ + LOGGER.trace("SYNCHRONIZATION skipping {} because it does not match kind/intent defined in task",new Object[] { + applicableShadow}); + subResult.recordStatus(OperationResultStatus.NOT_APPLICABLE, "Skipped because it does not match objectClass/kind/intent"); + return; + } + Class focusType = determineFocusClass(synchronizationPolicy, resourceType); if (LOGGER.isTraceEnabled()) { @@ -272,6 +280,42 @@ public void notifyChange(ResourceObjectShadowChangeDescription change, Task task } } + private boolean satisfyTaskConstaints(ObjectSynchronizationType synchronizationPolicy, Task task) { + PrismProperty kind = task.getExtensionProperty(SchemaConstants.MODEL_EXTENSION_KIND); + if (kind != null && !kind.isEmpty()){ + ShadowKindType kindValue = kind.getRealValue(); + if (!synchronizationPolicy.getKind().equals(kindValue)){ + return false; + } + } + + PrismProperty intent = task.getExtensionProperty(SchemaConstants.MODEL_EXTENSION_INTENT); + if (intent != null && !intent.isEmpty()){ + String intentValue = intent.getRealValue(); + if (StringUtils.isEmpty(synchronizationPolicy.getIntent())){ + return false; + } + if (!synchronizationPolicy.getIntent().equals(intentValue)){ + return false; + } + } + + return true; + } + + private boolean isProtected(PrismObject shadow){ + if (shadow == null){ + return false; + } + + ShadowType currentShadowType = shadow.asObjectable(); + if (currentShadowType.isProtectedObject() == null){ + return false; + } + + return currentShadowType.isProtectedObject(); + } + private Class determineFocusClass(ObjectSynchronizationType synchronizationPolicy, ResourceType resource) throws ConfigurationException { QName focusTypeQName = synchronizationPolicy.getFocusType(); if (focusTypeQName == null) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java index 4d0cbab6d70..ef05bed4c04 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/util/Utils.java @@ -392,7 +392,7 @@ public static boolean isDryRun(Task task) throws SchemaException{ return false; } - PrismProperty item = task.getExtension().findProperty(SchemaConstants.MODEL_EXTENSION_DRY_RUN); + PrismProperty item = task.getExtensionProperty(SchemaConstants.MODEL_EXTENSION_DRY_RUN); if (item == null || item.isEmpty()){ return false; }