From 7475e6daa94b3464b87746752e118e1feefc7579 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 31 Jan 2018 18:57:48 +0100 Subject: [PATCH 1/5] Create test for diffing with equal values --- .../midpoint/schema/TestParseDiffPatch.java | 18 ++++++++++ .../resources/diff/resource-white-after.xml | 34 +++++++++++++++++++ .../resources/diff/resource-white-before.xml | 34 +++++++++++++++++++ 3 files changed, 86 insertions(+) create mode 100644 infra/schema/src/test/resources/diff/resource-white-after.xml create mode 100644 infra/schema/src/test/resources/diff/resource-white-before.xml diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java index d91d453c1be..3c0604658f5 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseDiffPatch.java @@ -918,4 +918,22 @@ public void testCampaign() throws SchemaException, SAXException, IOException, JA assertEquals("Wrong # of triggers", 2, campaign.asObjectable().getTrigger().size()); } + @Test(enabled = false) + public void testDiffSameValues() throws Exception { + PrismObject before = PrismTestUtil.parseObject(new File(TEST_DIR, "resource-white-before.xml")); + PrismObject after = PrismTestUtil.parseObject(new File(TEST_DIR, "resource-white-after.xml")); + + Collection differences = before.diffModifications(after, true, true); + + assertEquals(1, differences.size()); + System.out.println(differences.iterator().next().debugDump()); + + PrismObject differencesApplied = before.clone(); + ItemDelta.applyTo(differences, differencesApplied); + + System.out.println(differencesApplied.debugDump()); + assertEquals("'after' is different from the object with differences applied", after, differencesApplied); + } + + } diff --git a/infra/schema/src/test/resources/diff/resource-white-after.xml b/infra/schema/src/test/resources/diff/resource-white-after.xml new file mode 100644 index 00000000000..ebd8c9586c8 --- /dev/null +++ b/infra/schema/src/test/resources/diff/resource-white-after.xml @@ -0,0 +1,34 @@ + + + + + white + + + + account + default + qn:AccountObjectClass + + + account + test + qn:AccountObjectClass + + + diff --git a/infra/schema/src/test/resources/diff/resource-white-before.xml b/infra/schema/src/test/resources/diff/resource-white-before.xml new file mode 100644 index 00000000000..1cd32784a3c --- /dev/null +++ b/infra/schema/src/test/resources/diff/resource-white-before.xml @@ -0,0 +1,34 @@ + + + + + white + + + + account + default + qn738:AccountObjectClass + + + account + test + qn738:AccountObjectClass + + + From 22448879df9fc19cdb56bd0b30c3006dc9e28b65 Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 1 Feb 2018 12:36:49 +0100 Subject: [PATCH 2/5] test fix attempt --- .../evolveum/midpoint/gui/api/util/WebModelServiceUtils.java | 2 +- .../src/main/resources/localization/Midpoint.properties | 4 ++-- .../src/main/resources/localization/Midpoint_cs.properties | 2 +- .../src/main/resources/localization/Midpoint_de.properties | 2 +- .../src/main/resources/localization/Midpoint_en.properties | 2 +- .../src/main/resources/localization/Midpoint_es.properties | 2 +- .../src/main/resources/localization/Midpoint_et.properties | 2 +- .../src/main/resources/localization/Midpoint_fi.properties | 2 +- .../src/main/resources/localization/Midpoint_hu.properties | 2 +- .../src/main/resources/localization/Midpoint_pl.properties | 2 +- .../src/main/resources/localization/Midpoint_pt_BR.properties | 2 +- .../src/main/resources/localization/Midpoint_ru.properties | 2 +- .../src/main/resources/localization/Midpoint_sk.properties | 2 +- .../src/main/resources/localization/Midpoint_tr.properties | 2 +- .../src/main/resources/localization/Midpoint_zh_CN.properties | 2 +- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java index 3b827c3fb74..bf2ddc00e9f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebModelServiceUtils.java @@ -577,7 +577,7 @@ public static Locale getLocale(UserType user) { } } } - return null; + return MidPointApplication.getDefaultLocale(); } public static TimeZone getTimezone() { diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 8022ac8c4cf..0119778292d 100755 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -1,5 +1,5 @@ -# Copyright (c) 2010-2017 Evolveum +# Copyright (c) 2010-2018 Evolveum # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -3175,7 +3175,7 @@ PageAdmin.menu.assignments=Assignments PageAdmin.menu.credentials=Credentials PageAdmin.menu.request=Request a role PageTemplate.version=Version: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Toggle navigation PageTemplate.user=user PageTemplate.couldntNavigateBreadcrumb=Couldn't navigate breadcrumb, reason: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_cs.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_cs.properties index 54d2fc5a202..9e99b2a8df2 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_cs.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_cs.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Přiřazení PageAdmin.menu.credentials=Změna hesla PageAdmin.menu.request=Požádat o roli PageTemplate.version=Verze: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® a partneři.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® a partneři.  PageTemplate.toggleNavigation=Přepnout navigaci PageTemplate.user=uživatel PageTemplate.couldntNavigateBreadcrumb=Nelze procházet navigaci, důvod: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_de.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_de.properties index 3c6ab69d8e2..8f58606b29c 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_de.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_de.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Zuweisungen PageAdmin.menu.credentials=Zugangsdaten PageAdmin.menu.request=Rolle beantragen PageTemplate.version=Version: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Navi ein/abschalten PageTemplate.user=Benutzer PageTemplate.couldntNavigateBreadcrumb=Couldn't navigate breadcrumb, reason: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties index 2a61b271617..2786eed9de8 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_en.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Assignments PageAdmin.menu.credentials=Credentials PageAdmin.menu.request=Request a role PageTemplate.version=Version: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Toggle navigation PageTemplate.user=user PageTemplate.couldntNavigateBreadcrumb=Couldn't navigate breadcrumb, reason: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_es.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_es.properties index 21389af1e45..7b3499daa26 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_es.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_es.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Asignaciones PageAdmin.menu.credentials=Credenciales PageAdmin.menu.request=Request a role PageTemplate.version=Version: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Toggle navigation PageTemplate.user=user PageTemplate.couldntNavigateBreadcrumb=Couldn't navigate breadcrumb, reason: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_et.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_et.properties index 949ca45ce4b..9807138392d 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_et.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_et.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Omistused PageAdmin.menu.credentials=Identimisteave PageAdmin.menu.request=Taotle roll PageTemplate.version=Versioon: -PageTemplate.copy=Autoriõigus © 2010-2017 Evolveum® ja partnerid.  +PageTemplate.copy=Autoriõigus © 2010-2018 Evolveum® ja partnerid.  PageTemplate.toggleNavigation=Navigeerimise ümberlülitus PageTemplate.user=kasutaja PageTemplate.couldntNavigateBreadcrumb=Lingireal navigerimine ei õnnestunud, põhjus: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_fi.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_fi.properties index 389702de3e5..a2c45582450 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_fi.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_fi.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Toimeksiannot PageAdmin.menu.credentials=Tunnukset PageAdmin.menu.request=Pyydä rooli PageTemplate.version=Versio: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Vaihda navigointia PageTemplate.user=käyttäjä PageTemplate.couldntNavigateBreadcrumb=Breadcrumbien navigointi ei onnistunut, syy: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_hu.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_hu.properties index e0caf9d61db..82576bef630 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_hu.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_hu.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Assignments PageAdmin.menu.credentials=Credentials PageAdmin.menu.request=Request a role PageTemplate.version=Version: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Toggle navigation PageTemplate.user=user PageTemplate.couldntNavigateBreadcrumb=Couldn't navigate breadcrumb, reason: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_pl.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_pl.properties index c921a993cde..5f6f4f3cf68 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_pl.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_pl.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Przypisania PageAdmin.menu.credentials=Zmiana hasła PageAdmin.menu.request=Wnioskuj o rolę PageTemplate.version=Wersja: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Odwróć nawigację PageTemplate.user=użytkownik PageTemplate.couldntNavigateBreadcrumb=Nie można użyć nawigacji breadcrumb, powód: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_pt_BR.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_pt_BR.properties index e077eb9a40c..c406ff8823a 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_pt_BR.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_pt_BR.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Atribuições PageAdmin.menu.credentials=Credenciais PageAdmin.menu.request=Solicitar um perfil PageTemplate.version=Versão: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Alternar navegação PageTemplate.user=usuário PageTemplate.couldntNavigateBreadcrumb=Não foi possível navegar o 'breadcrumb', motivo: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties index 17de89dd1c0..0cdf58e3aa4 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_ru.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Назначения PageAdmin.menu.credentials=Учетные данные PageAdmin.menu.request=Запросить роль PageTemplate.version=Версия\n -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Переключить навигацию PageTemplate.user=пользователь PageTemplate.couldntNavigateBreadcrumb=Невозможно отобразить навигацию, причина: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_sk.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_sk.properties index 1166ed9469d..43003cd18b1 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_sk.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_sk.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Priradenia PageAdmin.menu.credentials=Heslá PageAdmin.menu.request=Žiadať o rolu PageTemplate.version=Verzia: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® a partneri.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® a partneri.  PageTemplate.toggleNavigation=Toggle navigation PageTemplate.user=používateľ PageTemplate.couldntNavigateBreadcrumb=Couldn't navigate breadcrumb, reason: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_tr.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_tr.properties index 12d7114b64e..9e14abeba96 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_tr.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_tr.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=Atamalar PageAdmin.menu.credentials=Şifre PageAdmin.menu.request=Rol talep et PageTemplate.version=Sürüm: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=Navigasyon aç-kapa PageTemplate.user=kullanıcı PageTemplate.couldntNavigateBreadcrumb=Kırpıntı navigasyonda gezinilemedi, neden: {0} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint_zh_CN.properties b/gui/admin-gui/src/main/resources/localization/Midpoint_zh_CN.properties index bb8359b788f..bd619a5e5c6 100644 --- a/gui/admin-gui/src/main/resources/localization/Midpoint_zh_CN.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint_zh_CN.properties @@ -3161,7 +3161,7 @@ PageAdmin.menu.assignments=分配 PageAdmin.menu.credentials=我的凭证 PageAdmin.menu.request=申请角色 PageTemplate.version=版本: -PageTemplate.copy=Copyright © 2010-2017 Evolveum® and partners.  +PageTemplate.copy=Copyright © 2010-2018 Evolveum® and partners.  PageTemplate.toggleNavigation=切换导航 PageTemplate.user=用户 PageTemplate.couldntNavigateBreadcrumb=无法使用路径导航,原因:{0} From a13d30d479477687a88d67e2ca74ebd8adede817 Mon Sep 17 00:00:00 2001 From: kate Date: Fri, 2 Feb 2018 10:19:42 +0100 Subject: [PATCH 3/5] test fix second attempt --- .../midpoint/web/component/prism/ObjectWrapperFactory.java | 1 - .../midpoint/web/page/admin/PageAdminObjectDetails.java | 4 +++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java index 65836f5b21b..2a400f3b9a9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ObjectWrapperFactory.java @@ -162,7 +162,6 @@ private ObjectWrapper createObjectWrapper(String displ List> containerWrappers = createContainerWrappers(objectWrapper, object, objectDefinitionForEditing, status, this.result); objectWrapper.setContainers(containerWrappers); - objectWrapper.sort(); this.result.computeStatusIfUnknown(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java index d5cdfd44e8a..fdb8ee68138 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminObjectDetails.java @@ -217,7 +217,9 @@ protected void initializeModel(final PrismObject objectToEdit, boolean isNewO @Override protected ObjectWrapper load() { - return loadObjectWrapper(objectToEdit, isReadonly); + ObjectWrapper wrapper = loadObjectWrapper(objectToEdit, isReadonly); + wrapper.sort(); + return wrapper; } }; From b48bc408ed17ff366b82255ed604a22e6ba3c231 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 5 Feb 2018 17:00:15 +0100 Subject: [PATCH 4/5] Fix MID-4426: originMappingName not always set Metadata update was missing for quick reconciliation that was employed for zero-set values (for strong, weak and sourceless normal mappings). And for non-tolerant mappings as well. --- .../midpoint/model/impl/lens/LensUtil.java | 23 ++++++---- .../focus/ObjectTemplateProcessor.java | 12 +++-- ...bstractConfiguredModelIntegrationTest.java | 3 ++ ...stractInitializedModelIntegrationTest.java | 3 +- .../model/intest/TestUserTemplate.java | 41 ++++++++++++++++- .../test/resources/common/role-useless.xml | 23 ++++++++++ .../object-template/user-template-useless.xml | 46 +++++++++++++++++++ 7 files changed, 135 insertions(+), 16 deletions(-) create mode 100644 model/model-intest/src/test/resources/common/role-useless.xml create mode 100644 model/model-intest/src/test/resources/object-template/user-template-useless.xml diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index d100bbdb828..98896331de7 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRule; import com.evolveum.midpoint.model.api.context.EvaluatedPolicyRuleTrigger; +import com.evolveum.midpoint.model.common.mapping.PrismValueDeltaSetTripleProducer; import com.evolveum.midpoint.model.impl.util.Utils; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.polystring.PrismDefaultPolyStringNormalizer; @@ -186,13 +187,18 @@ public static V cloneAndApplyMe return cloneAndApplyMetadata(value, isAssignment, () -> getAutoCreationIdentifier(origins)); } - public static Collection cloneAndApplyMetadata(Collection values, boolean isAssignment, - MappingType mapping) throws SchemaException { - List rv = new ArrayList<>(); - for (V value : values) { - rv.add(cloneAndApplyMetadata(value, isAssignment, mapping::getName)); - } - return rv; +// public static Collection cloneAndApplyMetadata(Collection values, boolean isAssignment, +// MappingType mapping) throws SchemaException { +// List rv = new ArrayList<>(); +// for (V value : values) { +// rv.add(cloneAndApplyMetadata(value, isAssignment, mapping::getName)); +// } +// return rv; +// } + + public static V cloneAndApplyMetadata(V value, boolean isAssignment, + PrismValueDeltaSetTripleProducer mapping) throws SchemaException { + return cloneAndApplyMetadata(value, isAssignment, mapping::getIdentifier); } public static V cloneAndApplyMetadata(V value, boolean isAssignment, @@ -206,6 +212,7 @@ private static V cloneAndApplyMetadata(V value, boolean i V cloned = (V) value.clone(); if (isAssignment && cloned instanceof PrismContainerValue) { String originMappingName = originMappingNameSupplier.get(); + LOGGER.trace("cloneAndApplyMetadata: originMappingName = {}", originMappingName); if (originMappingName != null) { //noinspection unchecked PrismContainer metadataContainer = ((PrismContainerValue) cloned).findOrCreateContainer(AssignmentType.F_METADATA); @@ -225,8 +232,6 @@ private static String getAutoCr return null; } - - public static PropertyDelta createActivationTimestampDelta(ActivationStatusType status, XMLGregorianCalendar now, PrismContainerDefinition activationDefinition, OriginType origin) { QName timestampPropertyName; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java index 0ac96a330b3..1f8335dfb95 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/ObjectTemplateProcessor.java @@ -301,6 +301,7 @@ Collection> computeIte for (Entry>> entry: outputTripleMap.entrySet()) { ItemPath itemPath = entry.getKey(); + boolean isAssignment = SchemaConstants.PATH_ASSIGNMENT.equivalent(itemPath); DeltaSetTriple> outputTriple = entry.getValue(); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Computed triple for {}:\n{}", itemPath, outputTriple.debugDump()); @@ -329,7 +330,7 @@ Collection> computeIte consolidator.setContextDescription(contextDesc); consolidator.setStrengthSelector(StrengthSelector.ALL); - ItemDelta itemDelta = consolidator.consolidateToDelta(); + @NotNull ItemDelta itemDelta = consolidator.consolidateToDelta(); // Do a quick version of reconciliation. There is not much to reconcile as both the source and the target // is focus. But there are few cases to handle, such as strong mappings, and sourceless normal mappings. @@ -341,7 +342,7 @@ Collection> computeIte for (ItemValueWithOrigin zeroSetIvwo: zeroSet) { PrismValueDeltaSetTripleProducer mapping = zeroSetIvwo.getMapping(); - if ((mapping.getStrength() == null || mapping.getStrength() == MappingStrengthType.NORMAL)) { + if (mapping.getStrength() == null || mapping.getStrength() == MappingStrengthType.NORMAL) { if (aprioriItemDelta != null && !aprioriItemDelta.isEmpty()) { continue; } @@ -351,7 +352,7 @@ Collection> computeIte LOGGER.trace("Adding zero values from normal mapping {}, a-priori delta: {}, isSourceless: {}", mapping, aprioriItemDelta, mapping.isSourceless()); } else if (mapping.getStrength() == MappingStrengthType.WEAK) { - if ((itemNew != null && !itemNew.isEmpty()) || (itemDelta != null && itemDelta.addsAnyValue())) { + if (itemNew != null && !itemNew.isEmpty() || itemDelta.addsAnyValue()) { continue; } LOGGER.trace("Adding zero values from weak mapping {}, itemNew: {}, itemDelta: {}", @@ -363,7 +364,7 @@ Collection> computeIte PrismValue valueFromZeroSet = zeroSetIvwo.getItemValue(); if (itemNew == null || !itemNew.containsRealValue(valueFromZeroSet)) { LOGGER.trace("Reconciliation will add value {} for item {}. Existing item: {}", valueFromZeroSet, itemPath, itemNew); - itemDelta.addValuesToAdd(valueFromZeroSet.clone()); + itemDelta.addValuesToAdd(LensUtil.cloneAndApplyMetadata(valueFromZeroSet, isAssignment, mapping)); } } @@ -377,7 +378,8 @@ Collection> computeIte LOGGER.trace("Non-tolerant item with resulting REPLACE delta => doing nothing"); } else { for (ItemValueWithOrigin zeroSetIvwo: zeroSet) { - itemDelta.addValuesToAdd(zeroSetIvwo.getItemValue().clone()); + // TODO aren't values added twice (regarding addValuesToAdd called ~10 lines above)? + itemDelta.addValuesToAdd(LensUtil.cloneAndApplyMetadata(zeroSetIvwo.getItemValue(), isAssignment, zeroSetIvwo.getMapping())); } itemDelta.addToReplaceDelta(); LOGGER.trace("Non-tolerant item with resulting ADD delta => converted ADD to REPLACE values: {}", itemDelta.getValuesToReplace()); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java index 7574d100317..05d65c0127e 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java @@ -254,6 +254,9 @@ public class AbstractConfiguredModelIntegrationTest extends AbstractModelIntegra protected static final File ROLE_EMPTY_FILE = new File(COMMON_DIR, "role-empty.xml"); protected static final String ROLE_EMPTY_OID = "12345111-1111-2222-1111-121212111112"; + protected static final File ROLE_USELESS_FILE = new File(COMMON_DIR, "role-useless.xml"); + protected static final String ROLE_USELESS_OID = "12345111-1111-2222-1111-831209543124"; + protected static final File ROLE_SAILOR_FILE = new File(COMMON_DIR, "role-sailor.xml"); protected static final String ROLE_SAILOR_OID = "12345111-1111-2222-1111-121212111113"; protected static final String ROLE_SAILOR_DRINK = "grog"; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractInitializedModelIntegrationTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractInitializedModelIntegrationTest.java index 6f5359be854..5bf633c2518 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractInitializedModelIntegrationTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractInitializedModelIntegrationTest.java @@ -68,7 +68,7 @@ public class AbstractInitializedModelIntegrationTest extends AbstractConfiguredM protected static final Trace LOGGER = TraceManager.getTrace(AbstractInitializedModelIntegrationTest.class); private static final int NUMBER_OF_IMPORTED_USERS = 4; - private static final int NUMBER_OF_IMPORTED_ROLES = 15; + private static final int NUMBER_OF_IMPORTED_ROLES = 16; @Autowired(required = true) protected MappingFactory mappingFactory; @@ -252,6 +252,7 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti repoAddObjectFromFile(ROLE_JUDGE_DEPRECATED_FILE, initResult); repoAddObjectFromFile(ROLE_THIEF_FILE, initResult); repoAddObjectFromFile(ROLE_EMPTY_FILE, initResult); + repoAddObjectFromFile(ROLE_USELESS_FILE, initResult); repoAddObjectFromFile(ROLE_SAILOR_FILE, initResult); repoAddObjectFromFile(ROLE_RED_SAILOR_FILE, initResult); repoAddObjectFromFile(ROLE_CYAN_SAILOR_FILE, initResult); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java index d927368e2f2..7418731fdc1 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestUserTemplate.java @@ -82,11 +82,15 @@ public class TestUserTemplate extends AbstractInitializedModelIntegrationTest { protected static final File USER_TEMPLATE_MAROONED_FILE = new File(TEST_DIR, "user-template-marooned.xml"); protected static final String USER_TEMPLATE_MAROONED_OID = "766215e8-5f1e-11e6-94bb-c3b21af53235"; + protected static final File USER_TEMPLATE_USELESS_FILE = new File(TEST_DIR, "user-template-useless.xml"); + protected static final String USER_TEMPLATE_USELESS_OID = "29b2936a-d1f6-4942-8e44-9ba44fc27423"; + private static final String ACCOUNT_STAN_USERNAME = "stan"; private static final String ACCOUNT_STAN_FULLNAME = "Stan the Salesman"; private static final String EMPLOYEE_TYPE_MAROONED = "marooned"; + private static final String EMPLOYEE_TYPE_USELESS = "useless"; private static final int NUMBER_OF_IMPORTED_ROLES = 5; @@ -104,8 +108,10 @@ public void initSystem(Task initTask, OperationResult initResult) throws Excepti repoAddObjectFromFile(ROLE_AUTOGRAPHIC_FILE, initResult); repoAddObjectFromFile(USER_TEMPLATE_MAROONED_FILE, initResult); + repoAddObjectFromFile(USER_TEMPLATE_USELESS_FILE, initResult); setDefaultObjectTemplate(UserType.COMPLEX_TYPE, USER_TEMPLATE_COMPLEX_OID, initResult); setDefaultObjectTemplate(UserType.COMPLEX_TYPE, EMPLOYEE_TYPE_MAROONED, USER_TEMPLATE_MAROONED_OID, initResult); + setDefaultObjectTemplate(UserType.COMPLEX_TYPE, EMPLOYEE_TYPE_USELESS, USER_TEMPLATE_USELESS_OID, initResult); } protected int getNumberOfRoles() { @@ -133,9 +139,10 @@ public void test000Sanity() throws Exception { assertNotNull("no system config", systemConfiguration); List defaultObjectPolicyConfiguration = systemConfiguration.asObjectable().getDefaultObjectPolicyConfiguration(); assertNotNull("No object policy", defaultObjectPolicyConfiguration); - assertEquals("Wrong object policy size", 4, defaultObjectPolicyConfiguration.size()); // third + fourth are conflict resolution rules + assertEquals("Wrong object policy size", 5, defaultObjectPolicyConfiguration.size()); // last two are conflict resolution rules assertObjectTemplate(defaultObjectPolicyConfiguration, UserType.COMPLEX_TYPE, null, USER_TEMPLATE_COMPLEX_OID); assertObjectTemplate(defaultObjectPolicyConfiguration, UserType.COMPLEX_TYPE, EMPLOYEE_TYPE_MAROONED, USER_TEMPLATE_MAROONED_OID); + assertObjectTemplate(defaultObjectPolicyConfiguration, UserType.COMPLEX_TYPE, EMPLOYEE_TYPE_USELESS, USER_TEMPLATE_USELESS_OID); assertRoles(getNumberOfRoles()); } @@ -2696,4 +2703,36 @@ public void test960ReconcileUserJackWithTemplate() throws Exception { assertAssignments(userJack, 2); assertLinks(userJack, 1); } + + /** + * Setting employee type to marooned. This should cause switch to different user template. + */ + @Test + public void test970ModifyUserGuybrushEmployeeTypeUseless() throws Exception { + final String TEST_NAME = "test970ModifyUserGuybrushEmployeeTypeUseless"; + displayTestTitle(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + PrismObject userBefore = getUser(USER_GUYBRUSH_OID); + display("User before", userBefore); + assertAssignedNoRole(userBefore); + + // WHEN + displayWhen(TEST_NAME); + modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_EMPLOYEE_TYPE, task, result, EMPLOYEE_TYPE_USELESS); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + PrismObject userAfter = modelService.getObject(UserType.class, USER_GUYBRUSH_OID, null, task, result); + display("User after", userAfter); + + AssignmentType uselessAssignment = assertAssignedRole(userAfter, ROLE_USELESS_OID); + assertEquals("Wrong originMappingName", "assignment-for-useless-role", uselessAssignment.getMetadata().getOriginMappingName()); + } + } diff --git a/model/model-intest/src/test/resources/common/role-useless.xml b/model/model-intest/src/test/resources/common/role-useless.xml new file mode 100644 index 00000000000..e13b05eed1a --- /dev/null +++ b/model/model-intest/src/test/resources/common/role-useless.xml @@ -0,0 +1,23 @@ + + + Useless + diff --git a/model/model-intest/src/test/resources/object-template/user-template-useless.xml b/model/model-intest/src/test/resources/object-template/user-template-useless.xml new file mode 100644 index 00000000000..a42fc86bd5c --- /dev/null +++ b/model/model-intest/src/test/resources/object-template/user-template-useless.xml @@ -0,0 +1,46 @@ + + + + Useless User Template + + + assignment-for-useless-role + false + true + + + RoleType + + + name + Useless + + + + + + assignment + + + + From 03c69d4efa633acda8ad8daf7b2f2fd91b85690d Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Thu, 8 Feb 2018 17:18:06 +0100 Subject: [PATCH 5/5] Function: midpoint.isEvaluateNew() --- .../model/api/expr/MidpointFunctions.java | 13 ++++++++ .../impl/expr/MidpointFunctionsImpl.java | 9 ++++++ .../model/intest/mapping/TestMapping.java | 31 +++++++++++++++++++ .../common/resource-dummy-yellow.xml | 10 ++++++ .../test/resources/common/resource-dummy.xml | 7 ++++- 5 files changed, 69 insertions(+), 1 deletion(-) diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/expr/MidpointFunctions.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/expr/MidpointFunctions.java index c90f9a8230b..6048478895b 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/expr/MidpointFunctions.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/expr/MidpointFunctions.java @@ -1115,5 +1115,18 @@ Object executeAdHocProvisioningScript(String resourceOid, String language, Strin throws SchemaException, ObjectNotFoundException, ExpressionEvaluationException, CommunicationException, ConfigurationException, SecurityViolationException, ObjectAlreadyExistsException; + + /** + * Returns indication whether a script code is evaluating a new value. + * If this method returns true value then the script code is evaluating "new" value. + * That means a value that is going to be set to target, e.g. + * value from "add" or "replace" parts of the delta. + * If this method returns false value then the script code is evaluating "old" value. + * That means a value that is used for the purposes of removing values from target, + * e.g. value from "delete" part of the delta or values from an existing object. + * If this method returns null then the old/new status cannot be determined or this + * method is invoked in a situation when such a distinction is not applicable. + */ + Boolean isEvaluateNew(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index 3595a18fbae..dfe65b92aa3 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -1638,4 +1638,13 @@ public Object executeAdHocProvisioningScript(String resourceOid, String language return provisioningService.executeScript(resourceOid, script, getCurrentTask(), getCurrentResult()); } + + @Override + public Boolean isEvaluateNew() { + ScriptExpressionEvaluationContext scriptContext = ScriptExpressionEvaluationContext.getThreadLocal(); + if (scriptContext == null) { + return null; + } + return scriptContext.isEvaluateNew(); + } } \ No newline at end of file diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java index f63637773cc..c6798bc4340 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMapping.java @@ -3162,6 +3162,37 @@ public void test300AssignGuybrushDummyYellow() throws Exception { DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_GOSSIP_NAME, "Some say elaine -- administrator"); } + + @Test + public void test302ModifyGuybrushLocality() throws Exception { + final String TEST_NAME = "test302ModifyGuybrushLocality"; + displayTestTitle(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + modifyUserReplace(USER_GUYBRUSH_OID, UserType.F_LOCALITY, task, result, createPolyString("Forbidden dodecahedron")); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + PrismObject userAfter = getUser(USER_GUYBRUSH_OID); + display("User after", userAfter); + assertUser(userAfter, USER_GUYBRUSH_OID, USER_GUYBRUSH_USERNAME, USER_GUYBRUSH_FULL_NAME, + USER_GUYBRUSH_GIVEN_NAME, USER_GUYBRUSH_FAMILY_NAME); + + // Check account in dummy resource + DummyAccount dummyAccount = assertDummyAccount(RESOURCE_DUMMY_YELLOW_NAME, ACCOUNT_GUYBRUSH_DUMMY_USERNAME, + ACCOUNT_GUYBRUSH_DUMMY_FULLNAME, true); + display("Dummy account", dummyAccount); + assertDummyAccountAttribute(RESOURCE_DUMMY_YELLOW_NAME, ACCOUNT_GUYBRUSH_DUMMY_USERNAME, + DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_LOCATION_NAME, + "Forbidden dodecahedron"); + } @Test public void test309UnassignGuybrushDummyYellow() throws Exception { diff --git a/model/model-intest/src/test/resources/common/resource-dummy-yellow.xml b/model/model-intest/src/test/resources/common/resource-dummy-yellow.xml index 5e1c200fcb6..5b7cf9d5ad7 100644 --- a/model/model-intest/src/test/resources/common/resource-dummy-yellow.xml +++ b/model/model-intest/src/test/resources/common/resource-dummy-yellow.xml @@ -130,6 +130,16 @@ $c:user/c:locality + + + http://midpoint.evolveum.com/xml/ns/public/provisioning/channels-3#import diff --git a/model/model-intest/src/test/resources/common/resource-dummy.xml b/model/model-intest/src/test/resources/common/resource-dummy.xml index 9d288698fd3..a56b1f83737 100644 --- a/model/model-intest/src/test/resources/common/resource-dummy.xml +++ b/model/model-intest/src/test/resources/common/resource-dummy.xml @@ -161,7 +161,12 @@