From 6024104eb7505955c42fb2dcb15d89097d03858c Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Wed, 29 Nov 2017 12:04:10 +0100 Subject: [PATCH 01/18] fixing inbound processor delta computation --- .../projector/focus/InboundProcessor.java | 27 ++++--- .../mapping/TestMappingAutoInbound.java | 81 +++++++++++++++++++ .../test/resources/common/role-autocratic.xml | 27 ++++++- .../mapping/resource-dummy-autogreen.xml | 30 +++++-- 4 files changed, 143 insertions(+), 22 deletions(-) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/InboundProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/InboundProcessor.java index 86042dc6adc..52b5d305633 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/InboundProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/InboundProcessor.java @@ -879,7 +879,7 @@ private DeltaSetTriple> plusSet = originTriples.getPlusSet(); - LOGGER.trace("Consolidating plusSet from origin:\n {}", plusSet); + LOGGER.trace("Consolidating plusSet from origin:\n {}", DebugUtil.debugDumpLazily(plusSet)); for (ItemValueWithOrigin plusValue : plusSet) { @@ -889,7 +889,7 @@ private DeltaSetTriple moved to the zero, becuase the same value present in plus and minus set at the same time", - minusValue); + minusValue.debugDumpLazily()); consolidatedMinusSet.remove(minusValue); consolidatedPlusSet.remove(plusValue); consolidatedZeroSet.add(minusValue); @@ -903,7 +903,7 @@ private DeltaSetTriple moved to the zero, becuase the same value present in plus and minus set at the same time", - zeroValue); + zeroValue.debugDumpLazily()); consolidatedPlusSet.remove(plusValue); consolidated = true; } @@ -922,15 +922,16 @@ private DeltaSetTriple> zeroSet = originTriples.getZeroSet(); - LOGGER.trace("Consolidating zero set from origin:\n {}", zeroSet); - boolean consolidated = false; + LOGGER.trace("Consolidating zero set from origin:\n {}", DebugUtil.debugDumpLazily(zeroSet)); + for (ItemValueWithOrigin zeroValue : zeroSet) { + boolean consolidated = false; if (originTriples.hasMinusSet()) { for (ItemValueWithOrigin minusValue : originTriples.getMinusSet()) { if (minusValue.getItemValue().equalsRealValue(zeroValue.getItemValue())) { LOGGER.trace( "Removing value {} from minus set -> moved to the zero, becuase the same value present in zero and minus set at the same time", - minusValue); + minusValue.debugDumpLazily()); consolidatedMinusSet.remove(minusValue); consolidatedZeroSet.add(minusValue); consolidated = true; @@ -946,7 +947,7 @@ private DeltaSetTriple moved to the zero, becuase the same value present in zero and plus set at the same time", - plusValue); + plusValue.debugDumpLazily()); consolidatedPlusSet.remove(plusValue); consolidatedZeroSet.add(plusValue); consolidated = true; @@ -966,16 +967,16 @@ private DeltaSetTriple> minusSet = originTriples.getMinusSet(); - LOGGER.trace("Consolidating minus set from origin:\n {}", minusSet); - boolean consolidated = false; + LOGGER.trace("Consolidating minus set from origin:\n {}", DebugUtil.debugDumpLazily(minusSet)); + for (ItemValueWithOrigin minusValue : minusSet){ - + boolean consolidated = false; if (originTriples.hasPlusSet()) { for (ItemValueWithOrigin plusValue : originTriples.getPlusSet()) { if (plusValue.getItemValue().equalsRealValue(minusValue.getItemValue())) { LOGGER.trace( - "Removing value {} from plus set -> moved to the zero, becuase the same value present in plus and minus set at the same time", - plusValue); + "Removing value {} from minus set -> moved to the zero, becuase the same value present in plus and minus set at the same time", + plusValue.debugDumpLazily()); consolidatedPlusSet.remove(plusValue); consolidatedMinusSet.remove(minusValue); consolidatedZeroSet.add(minusValue); @@ -990,7 +991,7 @@ private DeltaSetTriple moved to the zero, becuase the same value present in plus and minus set at the same time", - zeroValue); + zeroValue.debugDumpLazily()); consolidatedMinusSet.remove(minusValue); consolidatedZeroSet.add(zeroValue); consolidated = true; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingAutoInbound.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingAutoInbound.java index b3d7ee511ae..8b95ec9700d 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingAutoInbound.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/mapping/TestMappingAutoInbound.java @@ -21,6 +21,7 @@ import com.evolveum.icf.dummy.resource.DummySyncStyle; import com.evolveum.midpoint.model.intest.AbstractInitializedModelIntegrationTest; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismReference; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.SearchResultList; @@ -31,6 +32,7 @@ import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationSituationType; @@ -42,6 +44,8 @@ import java.io.File; import java.io.FileNotFoundException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.xml.namespace.QName; @@ -266,4 +270,81 @@ public void test300ModifyAccountDirectAssign() throws Exception { assertAssignedRole(userAfter, ROLE_ADMINS_OID); assertAssignments(userAfter, 5); } + + @Test + public void test301removeUserFromAutoGroup() throws Exception { + final String TEST_NAME = "test301removeUserFromAutoGroup"; + displayTestTitle(TEST_NAME); + + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.FULL); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + DummyGroup craticGroup = getDummyResource(RESOURCE_DUMMY_AUTOGREEN_NAME).getGroupByName(GROUP_DUMMY_CRATIC_NAME); + craticGroup.removeMember(USER_HERMAN_USERNAME); + + DummyAccount hermanAccount = getDummyAccount(RESOURCE_DUMMY_AUTOGREEN_NAME, USER_HERMAN_USERNAME); + hermanAccount.removeAttributeValues(DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_TITLE_NAME, Arrays.asList("didactic")); + + assertNoDummyGroupMember(RESOURCE_DUMMY_AUTOGREEN_NAME, GROUP_DUMMY_CRATIC_NAME, USER_HERMAN_USERNAME); + + + // WHEN + displayWhen(TEST_NAME); + modelService.importFromResource(RESOURCE_DUMMY_AUTOGREEN_OID, new QName(MidPointConstants.NS_RI, "AccountObjectClass"), task, result); + + // THEN + displayThen(TEST_NAME); + OperationResult subresult = result.getLastSubresult(); + TestUtil.assertInProgress("importAccountsFromResource result", subresult); + + waitForTaskFinish(task, true, 70000); + + // THEN + displayThen(TEST_NAME); + assertSuccess(task.getResult()); + + PrismObject userAfter = getUser(userHermanOid); + display("User after", userAfter); + + assertNotAssignedRole(userAfter, ROLE_AUTODIDACTIC_OID); + assertAssignedRole(userAfter, ROLE_AUTOGRAPHIC_OID); + assertAssignedRole(userAfter, ROLE_AUTOTESTERS_OID); + assertNotAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); + assertAssignedRole(userAfter, ROLE_ADMINS_OID); + assertAssignments(userAfter, 3); + } + + + @Test + public void test402assignAutoGroupDirectly() throws Exception { + final String TEST_NAME = "test402assignAutoGroupDirectly"; + displayTestTitle(TEST_NAME); + + DummyGroup craticGroup = getDummyResource(RESOURCE_DUMMY_AUTOGREEN_NAME).getGroupByName(GROUP_DUMMY_CRATIC_NAME); + craticGroup.removeMember(USER_HERMAN_USERNAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + assignRole(userHermanOid, ROLE_AUTOCRATIC_OID); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + PrismObject userAfter = getUser(userHermanOid); + display("User after", userAfter); +// assertAssignedRole(userAfter, ROLE_AUTODIDACTIC_OID); + assertAssignedRole(userAfter, ROLE_AUTOGRAPHIC_OID); + assertAssignedRole(userAfter, ROLE_AUTOTESTERS_OID); + assertAssignedRole(userAfter, ROLE_AUTOCRATIC_OID); + assertAssignedRole(userAfter, ROLE_ADMINS_OID); + assertAssignments(userAfter, 4); + } } diff --git a/model/model-intest/src/test/resources/common/role-autocratic.xml b/model/model-intest/src/test/resources/common/role-autocratic.xml index 78d0fccf858..ec312c945e8 100644 --- a/model/model-intest/src/test/resources/common/role-autocratic.xml +++ b/model/model-intest/src/test/resources/common/role-autocratic.xml @@ -16,7 +16,32 @@ + xmlns:t="http://prism.evolveum.com/xml/ns/public/types-3" + xmlns:ri="http://midpoint.evolveum.com/xml/ns/public/resource/instance-3" + xmlns:icfs="http://midpoint.evolveum.com/xml/ns/public/connector/icf-1/resource-schema-3" + xmlns:q="http://prism.evolveum.com/xml/ns/public/query-3"> Autocratic auto + + + + + ri:group + + strong + + + + + attributes/icfs:name + cratic + + + onResourceIfNeeded + + + + + + diff --git a/model/model-intest/src/test/resources/mapping/resource-dummy-autogreen.xml b/model/model-intest/src/test/resources/mapping/resource-dummy-autogreen.xml index 847c56d3f32..e11f0309daa 100644 --- a/model/model-intest/src/test/resources/mapping/resource-dummy-autogreen.xml +++ b/model/model-intest/src/test/resources/mapping/resource-dummy-autogreen.xml @@ -110,15 +110,22 @@ import com.evolveum.midpoint.schema.constants.* import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; + + if (assignment.target != null) { - log.info("### target roleType " + assignment.target.roleType) - return assignment.target.roleType == 'auto' + log.info("### (title) target roleType " + assignment.target.roleType) + inRange = 'auto'.equals(assignment.target.roleType) + log.info("########## (title) inRange: " + inRange) + return inRange } if (assignment.targetRef != null) { role = midpoint.getObject(RoleType.class, assignment.targetRef.oid) - log.info("### role.roleType " + role.roleType) - return ('auto')?.equals(role.roleType) + log.info("### (title) role name " + role.name.orig) + log.info("### (title) role.roleType " + role.roleType) + inRange = ('auto')?.equals(role.roleType) + log.info("########## (title) inRange: " + inRange) + return inRange } @@ -132,6 +139,8 @@ ri:group + + strong @@ -166,14 +175,19 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; if (assignment.target != null) { - log.info("### target roleType " + assignment.target.roleType) - return assignment.target.roleType == 'auto' + log.info("### (association) target roleType " + assignment.target.roleType) + inRange = 'auto'.equals(assignment.target.roleType) + log.info("########## (association) inRange: " + inRange) + return inRange } if (assignment.targetRef != null) { role = midpoint.getObject(RoleType.class, assignment.targetRef.oid) - log.info("### role.roleType " + role.roleType) - return ('auto')?.equals(role.roleType) + log.info("### (association) role name " + role.name.orig) + log.info("### (association) role.roleType " + role.roleType) + inRange = ('auto').equals(role.roleType) + log.info("########## (association) inRange: " + inRange) + return inRange } From 91a0e310d529594001caf6ed88f625bbdd6dd2f5 Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Wed, 29 Nov 2017 13:20:40 +0100 Subject: [PATCH 02/18] html styles fix --- .../web/component/assignment/AbstractRoleAssignmentPanel.html | 2 +- .../midpoint/web/component/assignment/AssignmentPanel.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.html index 8f0ce790732..222845afcb5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.html @@ -29,7 +29,7 @@
-
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.html index 8509018b887..da1d067b72a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentPanel.html @@ -21,7 +21,7 @@
-
+
From c6640fa318dc3c7eab2ddf457b24936c50c411b3 Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Wed, 29 Nov 2017 13:21:07 +0100 Subject: [PATCH 03/18] MID-4072 url handling fix (got rid of 403) --- .../midpoint/web/page/admin/workflow/PageWorkItemsAttorney.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsAttorney.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsAttorney.java index 64e2baf0217..d984e590ff8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsAttorney.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItemsAttorney.java @@ -29,7 +29,7 @@ */ @PageDescriptor( urls = { - @Url(mountUrl = "/admin/workItemsAttorney", matchUrlForSecurity = "/admin/workItemsAttorney") + @Url(mountUrl = "/admin/workItemsAttorney") }, encoder = OnePageParameterEncoder.class, action = { From f35738abaa0a40c9ed8c6803a8de99c15f8e2acf Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Wed, 29 Nov 2017 13:46:35 +0100 Subject: [PATCH 04/18] fixed import (maven build) --- .../web/component/prism/PrismValuePanel.java | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java index 8d02ef9a341..c39f85335aa 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismValuePanel.java @@ -18,10 +18,7 @@ import java.io.ByteArrayInputStream; import java.io.InputStream; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; @@ -29,9 +26,6 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.web.component.input.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import com.github.sommeri.less4j.utils.ArraysUtils; -import org.apache.commons.collections.ListUtils; -import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.ClassUtils; import org.apache.commons.lang.Validate; import org.apache.wicket.AttributeModifier; @@ -665,12 +659,12 @@ protected ObjectFilter createCustomFilter() { protected boolean isEditButtonEnabled() { return valueWrapperModel.getObject().isEditEnabled(); } - + @Override - public List getSupportedTypes() { + public List getSupportedTypes() { List targetTypeList = ((ReferenceWrapper) valueWrapperModel.getObject().getItem()).getTargetTypes(); - if (targetTypeList == null || WebComponentUtil.isAllNulls(targetTypeList)){ - return ArraysUtils.asList(ObjectType.COMPLEX_TYPE); + if (targetTypeList == null || WebComponentUtil.isAllNulls(targetTypeList)) { + return Arrays.asList(ObjectType.COMPLEX_TYPE); } return targetTypeList; } From 7045d370d2da63a7fd746223984df5517d5009f8 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Wed, 29 Nov 2017 14:36:22 +0100 Subject: [PATCH 05/18] More evolveum samples --- samples/evolveum/roles.xml | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/samples/evolveum/roles.xml b/samples/evolveum/roles.xml index 2f5030bb747..be4e8f362b1 100644 --- a/samples/evolveum/roles.xml +++ b/samples/evolveum/roles.xml @@ -621,5 +621,32 @@ operational + + + Limited midPoint administrator + + ladmin-ui-all + http://midpoint.evolveum.com/xml/ns/public/security/authorization-ui-3#all + + + ladmin-read-users + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + UserType + + + + ladmin-read-roles + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#read + + RoleType + + + + ladmin-raw + http://midpoint.evolveum.com/xml/ns/public/security/authorization-model-3#rawOperation + + operational + From 719fa3de3f3c79d6516f87f0407edda97e0fe3f4 Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Wed, 29 Nov 2017 14:36:37 +0100 Subject: [PATCH 06/18] Sidebar menu top-level item styles and behavior fixes --- .../web/component/menu/SideBarMenuPanel.html | 4 +- .../web/component/menu/SideBarMenuPanel.java | 85 +++++++++++++------ .../resources/static/less/midpoint-theme.less | 5 ++ 3 files changed, 66 insertions(+), 28 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/menu/SideBarMenuPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/menu/SideBarMenuPanel.html index ca0c7b1cc24..d0a43deb3df 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/menu/SideBarMenuPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/menu/SideBarMenuPanel.html @@ -1,5 +1,5 @@ + + asdf + + + + + + + + + + + + + + \ No newline at end of file diff --git a/infra/schema/src/test/resources/diff/role-2.xml b/infra/schema/src/test/resources/diff/role-2.xml new file mode 100644 index 00000000000..58060a266a3 --- /dev/null +++ b/infra/schema/src/test/resources/diff/role-2.xml @@ -0,0 +1,40 @@ + + + + asdf + + + + + + + + + + + + + + \ No newline at end of file From 6c11da86491b7450bd622765e4c0d68d5ac5413e Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Wed, 29 Nov 2017 15:26:20 +0100 Subject: [PATCH 08/18] Enabling previously disabled test --- .../test/java/com/evolveum/midpoint/model/intest/TestMisc.java | 2 +- model/model-intest/src/test/resources/schema/piracy.xsd | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java index ec83337cdbd..acd842e308c 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java @@ -238,7 +238,7 @@ public void test310AddUserClean() throws Exception { * Modify custom binary property. * MID-3999 */ - @Test(enabled=false) // MID-3999 + @Test public void test312UpdateBinaryIdClean() throws Exception { final String TEST_NAME = "test312UpdateBinaryIdClean"; displayTestTitle(TEST_NAME); diff --git a/model/model-intest/src/test/resources/schema/piracy.xsd b/model/model-intest/src/test/resources/schema/piracy.xsd index af12606eba6..fb56e04165e 100644 --- a/model/model-intest/src/test/resources/schema/piracy.xsd +++ b/model/model-intest/src/test/resources/schema/piracy.xsd @@ -94,7 +94,7 @@ Binary identifier 890 - true + From da7fe412d797f61aca5fe8476c43bca08fcd28b6 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 29 Nov 2017 15:42:00 +0100 Subject: [PATCH 09/18] MID-3845: added relation to "show all assignments" + added deputy relations there + refactored assignments info dialog --- .../gui/api/util/WebComponentUtil.java | 19 ++ .../AbstractRoleAssignmentPanel.java | 33 +- .../component/assignment/AssignmentDto.java | 3 - .../assignment/AssignmentEditorDto.java | 16 +- .../assignment/AssignmentEditorPanel.ast | 1 - .../assignment/AssignmentEditorPanel.java | 6 +- .../assignment/DelegationEditorPanel.java | 58 ++-- .../FocusPolicyRulesTabPanel.java | 22 -- .../UserDelegationsTabPanel.java | 7 +- .../web/page/admin/PageAdminFocus.java | 96 +++--- .../web/page/admin/users/PageUser.java | 33 +- .../web/page/admin/users/PageUserHistory.java | 6 +- .../AllAssignmentsPreviewDialog.java | 51 +++ ...PreviewDto.java => AssignmentInfoDto.java} | 88 +++--- .../component/AssignmentPreviewDialog.java | 293 ------------------ ...Dialog.html => AssignmentsInfoDialog.html} | 0 .../component/AssignmentsInfoDialog.java | 221 +++++++++++++ .../DelegationTargetLimitationDialog.java | 57 ++++ .../localization/Midpoint.properties | 1 + .../schema/constants/SchemaConstants.java | 2 + .../midpoint/schema/util/ObjectTypeUtil.java | 9 + .../resources/localization/schema.properties | 9 +- .../com/evolveum/midpoint/util/MiscUtil.java | 8 +- .../model/api/ModelExecuteOptions.java | 28 +- .../context/EvaluatedAssignmentTarget.java | 6 + .../ModelInteractionServiceImpl.java | 4 +- .../model/impl/lens/AssignmentEvaluator.java | 8 +- .../lens/EvaluatedAssignmentTargetImpl.java | 9 + .../model/intest/TestPreviewChanges.java | 187 ++++++----- 29 files changed, 685 insertions(+), 596 deletions(-) delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.ast create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AllAssignmentsPreviewDialog.java rename gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/{AssignmentsPreviewDto.java => AssignmentInfoDto.java} (69%) delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentPreviewDialog.java rename gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/{AssignmentPreviewDialog.html => AssignmentsInfoDialog.html} (100%) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsInfoDialog.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/DelegationTargetLimitationDialog.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index 95e4712fdf3..08bdcf2306b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -85,6 +85,7 @@ import org.apache.wicket.util.visit.IVisit; import org.apache.wicket.util.visit.IVisitor; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import org.joda.time.format.DateTimeFormat; import com.evolveum.midpoint.gui.api.GuiStyleConstants; @@ -385,6 +386,24 @@ private static Object[] resolveArguments(Object[] args, Component component) { return rv; } + // TODO add other classes; probably move to some enum + @Nullable + public static String getAuthorizationActionForTargetClass(Class targetClass) { + if (UserType.class.equals(targetClass)) { + return AuthorizationConstants.AUTZ_UI_USER_URL; + } else if (OrgType.class.equals(targetClass)) { + return AuthorizationConstants.AUTZ_UI_ORG_UNIT_URL; + } else if (RoleType.class.equals(targetClass)) { + return AuthorizationConstants.AUTZ_UI_ROLE_URL; + } else if (ServiceType.class.equals(targetClass)) { + return AuthorizationConstants.AUTZ_UI_SERVICE_URL; + } else if (ResourceType.class.equals(targetClass)) { + return AuthorizationConstants.AUTZ_UI_RESOURCE_URL; + } else { + return null; + } + } + public enum Channel { // TODO: move this to schema component LIVE_SYNC(SchemaConstants.CHANGE_CHANNEL_LIVE_SYNC_URI), diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java index 8ea3d3e8bab..7d672917e0d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractRoleAssignmentPanel.java @@ -17,35 +17,27 @@ package com.evolveum.midpoint.web.component.assignment; import java.util.ArrayList; +import java.util.Collections; import java.util.List; -import java.util.Map; -import java.util.Set; import javax.xml.namespace.QName; -import javax.xml.validation.Schema; import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.web.component.prism.*; import com.evolveum.midpoint.web.page.admin.PageAdminFocus; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentPreviewDialog; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; +import com.evolveum.midpoint.web.page.admin.users.component.AllAssignmentsPreviewDialog; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import org.apache.wicket.model.PropertyModel; import com.evolveum.midpoint.gui.api.component.TypedAssignablePanel; import com.evolveum.midpoint.gui.api.page.PageBase; @@ -57,16 +49,11 @@ import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; -import com.evolveum.midpoint.web.component.data.column.IconColumn; -import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.form.Form; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.web.session.UserProfileStorage; import com.evolveum.midpoint.web.session.UserProfileStorage.TableId; -import org.springframework.expression.spel.ast.Assign; /** * Created by honchar. @@ -138,13 +125,15 @@ private DropDownChoicePanel getRelationPanel() { protected void showAllAssignments(AjaxRequestTarget target) { PageBase pageBase = getPageBase(); - List previewAssignmentsList = new ArrayList<>(); - if (pageBase instanceof PageAdminFocus){ - previewAssignmentsList = ((PageAdminFocus) pageBase).recomputeAssignmentsPerformed(target); + List previewAssignmentsList; + if (pageBase instanceof PageAdminFocus) { + previewAssignmentsList = ((PageAdminFocus) pageBase).showAllAssignmentsPerformed(target); + } else { + previewAssignmentsList = Collections.emptyList(); } - AssignmentPreviewDialog assignmentPreviewDialog = new AssignmentPreviewDialog(pageBase.getMainPopupBodyId(), previewAssignmentsList, - new ArrayList<>(), pageBase); - pageBase.showMainPopup(assignmentPreviewDialog, target); + AllAssignmentsPreviewDialog assignmentsDialog = new AllAssignmentsPreviewDialog(pageBase.getMainPopupBodyId(), previewAssignmentsList, + pageBase); + pageBase.showMainPopup(assignmentsDialog, target); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java index 876ad64c73e..82d588f1f82 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java @@ -27,9 +27,6 @@ import com.evolveum.midpoint.web.component.util.Selectable; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PersonaConstructionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyRuleType; public class AssignmentDto extends Selectable implements Comparable, Serializable{ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java index 3a6850263d0..84346b1fce7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorDto.java @@ -29,7 +29,7 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; @@ -86,7 +86,7 @@ public class AssignmentEditorDto extends SelectableBean implements Comparable privilegeLimitationList; + private List privilegeLimitationList; private ObjectViewDto tenantRef; private ObjectViewDto orgRef; @@ -228,12 +228,12 @@ && getPolicyRuleContainer(assignment) != null){ } - private List getAssignmentPrivilegesList(AssignmentType assignment){ - List list = new ArrayList<>(); + private List getAssignmentPrivilegesList(AssignmentType assignment){ + List list = new ArrayList<>(); AssignmentSelectorType assignmentSelectorType = assignment.getLimitTargetContent(); if (assignmentSelectorType != null && assignmentSelectorType.getTargetRef() != null){ for (ObjectReferenceType objectRef : assignmentSelectorType.getTargetRef()){ - AssignmentsPreviewDto dto = new AssignmentsPreviewDto(); + AssignmentInfoDto dto = new AssignmentInfoDto(); Class targetClass = ObjectTypes.getObjectTypeFromTypeQName(objectRef.getType()).getClassDefinition(); dto.setTargetClass(targetClass); dto.setTargetName(WebModelServiceUtils.resolveReferenceName(objectRef, pageBase, @@ -735,11 +735,11 @@ public void setAssignedRelationsList(List assignedRelationsList) this.assignedRelationsList = assignedRelationsList; } - public List getPrivilegeLimitationList() { + public List getPrivilegeLimitationList() { return privilegeLimitationList; } - public void setPrivilegeLimitationList(List privilegeLimitationList) { + public void setPrivilegeLimitationList(List privilegeLimitationList) { if (newAssignment.getLimitTargetContent() == null) { newAssignment.setLimitTargetContent(new AssignmentSelectorType()); } @@ -748,7 +748,7 @@ public void setPrivilegeLimitationList(List privilegeLimi referencesList = new ArrayList<>(); } referencesList.clear(); - for (AssignmentsPreviewDto previewDto : privilegeLimitationList){ + for (AssignmentInfoDto previewDto : privilegeLimitationList){ ObjectReferenceType ref = new ObjectReferenceType(); ref.setOid(previewDto.getTargetOid()); ref.setTargetName(new PolyStringType(previewDto.getTargetName())); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.ast b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.ast deleted file mode 100644 index 1e3d6117e29..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.ast +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java index cea9e8eb778..88730c80532 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentEditorPanel.java @@ -52,7 +52,7 @@ import com.evolveum.midpoint.web.page.admin.PageAdminFocus; import com.evolveum.midpoint.web.page.admin.configuration.component.ChooseTypePanel; import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.web.page.self.PageAssignmentDetails; import com.evolveum.midpoint.web.page.self.PageAssignmentsList; @@ -137,12 +137,12 @@ public class AssignmentEditorPanel extends BasePanel { private IModel> attributesModel; protected WebMarkupContainer headerRow; protected PageBase pageBase; - protected IModel> privilegesListModel; + protected IModel> privilegesListModel; protected boolean delegatedToMe; private LoadableModel decisionsModel; public AssignmentEditorPanel(String id, IModel model, boolean delegatedToMe, - LoadableModel> privilegesListModel, PageBase pageBase) { + LoadableModel> privilegesListModel, PageBase pageBase) { super(id, model); this.pageBase = pageBase; this.privilegesListModel = privilegesListModel; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/DelegationEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/DelegationEditorPanel.java index 2aa4a89d25f..5cda3e48a75 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/DelegationEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/DelegationEditorPanel.java @@ -28,8 +28,8 @@ import com.evolveum.midpoint.web.component.DateInput; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.users.PageUser; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentPreviewDialog; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; +import com.evolveum.midpoint.web.page.admin.users.component.DelegationTargetLimitationDialog; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.OtherPrivilegesLimitationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; @@ -91,26 +91,26 @@ public class DelegationEditorPanel extends AssignmentEditorPanel { private List usersToUpdate; public DelegationEditorPanel(String id, IModel delegationTargetObjectModel, boolean delegatedToMe, - List privilegesList, PageBase pageBase) { - super(id, delegationTargetObjectModel, delegatedToMe, new LoadableModel>(false) { + List privilegesList, PageBase pageBase) { + super(id, delegationTargetObjectModel, delegatedToMe, new LoadableModel>(false) { @Override - protected List load() { + protected List load() { return privilegesList; } }, pageBase); } public DelegationEditorPanel(String id, IModel delegationTargetObjectModel, boolean delegatedToMe, - LoadableModel> privilegesListModel, PageBase pageBase) { + LoadableModel> privilegesListModel, PageBase pageBase) { super(id, delegationTargetObjectModel, delegatedToMe, privilegesListModel, pageBase); } @Override protected void initHeaderRow(){ if (delegatedToMe) { - privilegesListModel = new LoadableModel>(false) { + privilegesListModel = new LoadableModel>(false) { @Override - protected List load() { + protected List load() { return DelegationEditorPanel.this.getModelObject().getPrivilegeLimitationList(); } }; @@ -238,7 +238,7 @@ public boolean isVisible(){ if (!UserDtoStatus.ADD.equals(getModelObject().getStatus())){ return true; } - List privilegesList = privilegesListModel.getObject(); + List privilegesList = privilegesListModel.getObject(); return privilegesList != null && privilegesList.size() > 0; } }); @@ -307,27 +307,16 @@ public boolean isVisible(){ pageBase.createStringResource("DelegationEditorPanel.limitPrivilegesButton")) { @Override public void onClick(AjaxRequestTarget target) { - AssignmentPreviewDialog assignmentPreviewDialog = - new AssignmentPreviewDialog(pageBase.getMainPopupBodyId(), - selectExistingPrivileges(privilegesListModel.getObject()), - null, pageBase, true){ + DelegationTargetLimitationDialog assignmentsDialog = + new DelegationTargetLimitationDialog(pageBase.getMainPopupBodyId(), + selectExistingPrivileges(privilegesListModel.getObject()), pageBase) { @Override - protected boolean isDelegationPreview(){ - return true; - } - - @Override - public StringResourceModel getTitle() { - return new StringResourceModel("AssignmentPreviewDialog.delegationPreviewLabel"); - } - - @Override - protected void addButtonClicked(AjaxRequestTarget target, List dtoList){ + protected void addButtonClicked(AjaxRequestTarget target, List dtoList){ DelegationEditorPanel.this.getModelObject().setPrivilegeLimitationList(dtoList); pageBase.hideMainPopup(target); } }; - pageBase.showMainPopup(assignmentPreviewDialog, target); + pageBase.showMainPopup(assignmentsDialog, target); } }; limitPrivilegesButton.add(new VisibleEnableBehaviour() { @@ -542,12 +531,12 @@ private boolean allAssignmentPrivilegesSelected(){ getModelObject().getPrivilegeLimitationList().size() == privilegesListModel.getObject().size(); } - private List getPrivilegesNamesList(){ + private List getPrivilegesNamesList() { List privilegesNamesList = new ArrayList<>(); - List dtos = getModel().getObject().getPrivilegeLimitationList(); + List dtos = getModel().getObject().getPrivilegeLimitationList(); if (dtos != null){ - for (AssignmentsPreviewDto assignmentsPreviewDto : dtos){ - privilegesNamesList.add(assignmentsPreviewDto.getTargetName()); + for (AssignmentInfoDto assignmentInfoDto : dtos) { + privilegesNamesList.add(assignmentInfoDto.getTargetName()); } } return privilegesNamesList; @@ -566,16 +555,15 @@ private String getUserDisplayName(){ return displayName; } - private List selectExistingPrivileges(List list){ - for (AssignmentsPreviewDto dto : list){ + private List selectExistingPrivileges(List list) { + for (AssignmentInfoDto dto : list) { dto.setSelected(false); } - - if (getModelObject().getPrivilegeLimitationList() == null){ + if (getModelObject().getPrivilegeLimitationList() == null) { return list; } - for (AssignmentsPreviewDto dto : list){ - if (getModelObject().getPrivilegeLimitationList().contains(dto)){ + for (AssignmentInfoDto dto : list) { + if (getModelObject().getPrivilegeLimitationList().contains(dto)) { dto.setSelected(true); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusPolicyRulesTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusPolicyRulesTabPanel.java index ff1c9cb73ac..3296c33ac2d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusPolicyRulesTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/FocusPolicyRulesTabPanel.java @@ -18,35 +18,13 @@ import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.prism.PrismContainer; -import com.evolveum.midpoint.prism.PrismContainerValue; -import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.web.component.assignment.*; import com.evolveum.midpoint.web.component.form.Form; -import com.evolveum.midpoint.web.component.prism.ContainerValueWrapper; -import com.evolveum.midpoint.web.component.prism.ContainerWrapper; import com.evolveum.midpoint.web.component.prism.ObjectWrapper; import com.evolveum.midpoint.web.model.ContainerWrapperFromObjectWrapperModel; -import com.evolveum.midpoint.web.page.admin.PageAdminFocus; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentPreviewDialog; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.model.PropertyModel; - -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collector; -import java.util.stream.Collectors; /** * Created by honchar. diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java index 727c1af9d61..cdc605f3c46 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/UserDelegationsTabPanel.java @@ -19,7 +19,6 @@ import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.query.InOidFilter; import com.evolveum.midpoint.prism.query.NotFilter; @@ -36,7 +35,7 @@ import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; import com.evolveum.midpoint.web.component.prism.ObjectWrapper; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -63,11 +62,11 @@ public class UserDelegationsTabPanel extends AbstractObject private static final Trace LOGGER = TraceManager.getTrace(FocusAssignmentsTabPanel.class); private LoadableModel> delegationsModel; - private LoadableModel> privilegesListModel; + private LoadableModel> privilegesListModel; public UserDelegationsTabPanel(String id, Form mainForm, LoadableModel> focusWrapperModel, LoadableModel> delegationsModel, - LoadableModel> privilegesListModel, PageBase page) { + LoadableModel> privilegesListModel, PageBase page) { super(id, mainForm, focusWrapperModel, page); this.delegationsModel = delegationsModel; this.privilegesListModel = privilegesListModel; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java index 8497acd7c55..68d30f992c9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java @@ -47,7 +47,7 @@ import com.evolveum.midpoint.web.component.prism.show.PagePreviewChanges; import com.evolveum.midpoint.web.component.progress.ProgressReportingAwarePage; import com.evolveum.midpoint.web.component.util.ObjectWrapperUtil; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.web.page.admin.users.dto.FocusSubwrapperDto; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.web.security.SecurityUtils; @@ -823,99 +823,82 @@ private ReferenceDelta prepareUserOrgsDeltaForModify(PrismReferenceDefinition re return refDelta; } - public List recomputeAssignmentsPerformed(AjaxRequestTarget target) { + public List showAllAssignmentsPerformed(AjaxRequestTarget ajaxRequestTarget) { LOGGER.debug("Recompute user assignments"); Task task = createSimpleTask(OPERATION_RECOMPUTE_ASSIGNMENTS); OperationResult result = new OperationResult(OPERATION_RECOMPUTE_ASSIGNMENTS); ObjectDelta delta; - Set assignmentDtoSet = new TreeSet<>(); + Set assignmentInfoDtoSet = new TreeSet<>(); try { reviveModels(); - ObjectWrapper userWrapper = getObjectWrapper(); - delta = userWrapper.getObjectDelta(); - if (userWrapper.getOldDelta() != null) { - delta = ObjectDelta.summarize(userWrapper.getOldDelta(), delta); + ObjectWrapper focusWrapper = getObjectWrapper(); + delta = focusWrapper.getObjectDelta(); + if (focusWrapper.getOldDelta() != null) { + delta = ObjectDelta.summarize(focusWrapper.getOldDelta(), delta); } - switch (userWrapper.getStatus()) { + switch (focusWrapper.getStatus()) { case ADDING: PrismObject focus = delta.getObjectToAdd(); prepareObjectForAdd(focus); getPrismContext().adopt(focus, getCompileTimeClass()); - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Delta before add user:\n{}", new Object[] { delta.debugDump(3) }); - } - + LOGGER.trace("Delta before add focus:\n{}", delta.debugDumpLazily(3)); if (!delta.isEmpty()) { delta.revive(getPrismContext()); } else { result.recordSuccess(); } - break; case MODIFYING: prepareObjectDeltaForModify(delta); - - if (LOGGER.isTraceEnabled()) { - LOGGER.trace("Delta before modify user:\n{}", new Object[] { delta.debugDump(3) }); - } + LOGGER.trace("Delta before modify user:\n{}", delta.debugDumpLazily(3)); List> accountDeltas = getShadowModifyDeltas(result); - Collection> deltas = new ArrayList<>(); - if (!delta.isEmpty()) { delta.revive(getPrismContext()); - deltas.add(delta); } - for (ObjectDelta accDelta : accountDeltas) { if (!accDelta.isEmpty()) { accDelta.revive(getPrismContext()); - deltas.add(accDelta); } } - break; default: - error(getString("pageAdminFocus.message.unsupportedState", userWrapper.getStatus())); + error(getString("pageAdminFocus.message.unsupportedState", focusWrapper.getStatus())); } - ModelContext modelContext = null; + ModelContext modelContext; try { - modelContext = getModelInteractionService() - .previewChanges(WebComponentUtil.createDeltaCollection(delta), null, task, result); + ModelExecuteOptions options = ModelExecuteOptions.createEvaluateAllAssignmentRelationsOnRecompute(); + modelContext = getModelInteractionService().previewChanges(Collections.singleton(delta), options, task, result); } catch (NoFocusNameSchemaException e) { info(getString("pageAdminFocus.message.noUserName")); - target.add(getFeedbackPanel()); + ajaxRequestTarget.add(getFeedbackPanel()); return null; } - DeltaSetTriple evaluatedAssignmentTriple = modelContext - .getEvaluatedAssignmentTriple(); - Collection evaluatedAssignments = evaluatedAssignmentTriple - .getNonNegativeValues(); + DeltaSetTriple> evaluatedAssignmentTriple = modelContext.getEvaluatedAssignmentTriple(); + Collection> evaluatedAssignments = evaluatedAssignmentTriple.getNonNegativeValues(); if (evaluatedAssignments.isEmpty()) { info(getString("pageAdminFocus.message.noAssignmentsAvailable")); - target.add(getFeedbackPanel()); + ajaxRequestTarget.add(getFeedbackPanel()); return null; } - for (EvaluatedAssignment evaluatedAssignment : evaluatedAssignments) { + for (EvaluatedAssignment evaluatedAssignment : evaluatedAssignments) { if (!evaluatedAssignment.isValid()) { continue; } // roles and orgs - DeltaSetTriple evaluatedRolesTriple = evaluatedAssignment - .getRoles(); - Collection evaluatedRoles = evaluatedRolesTriple - .getNonNegativeValues(); - for (EvaluatedAssignmentTarget role : evaluatedRoles) { - if (role.isEvaluateConstructions()) { - assignmentDtoSet.add(createAssignmentsPreviewDto(role, task, result)); + DeltaSetTriple targetsTriple = evaluatedAssignment.getRoles(); + Collection targets = targetsTriple.getNonNegativeValues(); + for (EvaluatedAssignmentTarget target : targets) { + if (target.appliesToFocusWithAnyRelation()) { + assignmentInfoDtoSet.add(createAssignmentsPreviewDto(target, task, result)); } } @@ -925,27 +908,27 @@ public List recomputeAssignmentsPerformed(AjaxRequestTarg Collection evaluatedConstructions = evaluatedConstructionsTriple .getNonNegativeValues(); for (EvaluatedConstruction construction : evaluatedConstructions) { - assignmentDtoSet.add(createAssignmentsPreviewDto(construction)); + assignmentInfoDtoSet.add(createAssignmentsPreviewDto(construction)); } } - return new ArrayList<>(assignmentDtoSet); + return new ArrayList<>(assignmentInfoDtoSet); } catch (Exception e) { LoggingUtils.logUnexpectedException(LOGGER, "Could not create assignments preview.", e); error("Could not create assignments preview. Reason: " + e); - target.add(getFeedbackPanel()); + ajaxRequestTarget.add(getFeedbackPanel()); } return null; } - private AssignmentsPreviewDto createAssignmentsPreviewDto(EvaluatedAssignmentTarget evaluatedAbstractRole, + private AssignmentInfoDto createAssignmentsPreviewDto(EvaluatedAssignmentTarget evaluatedAbstractRole, Task task, OperationResult result) { return createAssignmentsPreviewDto(evaluatedAbstractRole.getTarget(), evaluatedAbstractRole.isDirectlyAssigned(), evaluatedAbstractRole.getAssignment(), task, result); } - protected AssignmentsPreviewDto createAssignmentsPreviewDto(ObjectReferenceType reference, + protected AssignmentInfoDto createAssignmentsPreviewDto(ObjectReferenceType reference, Task task, OperationResult result) { PrismObject targetObject = WebModelServiceUtils.resolveReferenceNoFetch(reference, PageAdminFocus.this, task, result); @@ -954,19 +937,18 @@ protected AssignmentsPreviewDto createAssignmentsPreviewDto(ObjectReferenceType null, task, result); } - protected AssignmentsPreviewDto createDelegableAssignmentsPreviewDto(AssignmentType assignment, - Task task, OperationResult result) { - if (assignment.getTargetRef() != null){ + protected AssignmentInfoDto createDelegableAssignmentsPreviewDto(AssignmentType assignment, Task task, OperationResult result) { + if (assignment.getTargetRef() != null) { if (RoleType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType()) || OrgType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType()) - || ServiceType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType())){ + || ServiceType.COMPLEX_TYPE.equals(assignment.getTargetRef().getType())) { PrismObject targetObject = WebModelServiceUtils.resolveReferenceNoFetch(assignment.getTargetRef(), PageAdminFocus.this, task, result); Boolean isDelegable = false; if (targetObject != null) { isDelegable = targetObject.getRealValue().isDelegable(); } - if (Boolean.TRUE.equals(isDelegable)){ + if (Boolean.TRUE.equals(isDelegable)) { return createAssignmentsPreviewDto(targetObject, true, assignment, task, result); } } @@ -974,10 +956,10 @@ protected AssignmentsPreviewDto createDelegableAssignmentsPreviewDto(AssignmentT return null; } - private AssignmentsPreviewDto createAssignmentsPreviewDto(PrismObject targetObject, - boolean isDirectlyAssigned, AssignmentType assignment, - Task task, OperationResult result) { - AssignmentsPreviewDto dto = new AssignmentsPreviewDto(); + private AssignmentInfoDto createAssignmentsPreviewDto(PrismObject targetObject, + boolean isDirectlyAssigned, AssignmentType assignment, + Task task, OperationResult result) { + AssignmentInfoDto dto = new AssignmentInfoDto(); dto.setTargetOid(targetObject.getOid()); dto.setTargetName(getNameToDisplay(targetObject)); dto.setTargetDescription(targetObject.asObjectable().getDescription()); @@ -1036,8 +1018,8 @@ private String nameFromReference(ObjectReferenceType reference, Task task, Opera } } - private AssignmentsPreviewDto createAssignmentsPreviewDto(EvaluatedConstruction evaluatedConstruction) { - AssignmentsPreviewDto dto = new AssignmentsPreviewDto(); + private AssignmentInfoDto createAssignmentsPreviewDto(EvaluatedConstruction evaluatedConstruction) { + AssignmentInfoDto dto = new AssignmentInfoDto(); PrismObject resource = evaluatedConstruction.getResource(); dto.setTargetOid(resource.getOid()); dto.setTargetName(PolyString.getOrig(resource.asObjectable().getName())); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index 972d3b2cc15..c0b6f1ad3b7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -18,7 +18,6 @@ import com.evolveum.midpoint.gui.api.ComponentConstants; import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; -import com.evolveum.midpoint.gui.api.model.CountableLoadableModel; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; @@ -26,7 +25,6 @@ import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -35,17 +33,14 @@ import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; -import com.evolveum.midpoint.web.component.assignment.AssignmentDto; import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; import com.evolveum.midpoint.web.component.assignment.AssignmentTablePanel; import com.evolveum.midpoint.web.component.assignment.DelegationEditorPanel; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; import com.evolveum.midpoint.web.component.objectdetails.UserDelegationsTabPanel; -import com.evolveum.midpoint.web.component.prism.ObjectWrapper; import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang3.StringUtils; @@ -64,7 +59,6 @@ import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.FocusSummaryPanel; import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; -import com.evolveum.midpoint.web.component.objectdetails.FocusConsentTabPanel; import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel; import com.evolveum.midpoint.web.page.admin.PageAdminFocus; import com.evolveum.midpoint.web.page.admin.users.component.UserSummaryPanel; @@ -72,6 +66,8 @@ import java.util.*; +import static org.apache.commons.collections4.CollectionUtils.addIgnoreNull; + /** * @author lazyman * @author semancik @@ -92,7 +88,7 @@ public class PageUser extends PageAdminFocus { private static final String ID_TASK_TABLE = "taskTable"; private static final String ID_TASKS = "tasks"; private LoadableModel> delegationsModel; - private LoadableModel> privilegesListModel; + private LoadableModel> privilegesListModel; private UserDelegationsTabPanel userDelegationsTabPanel = null; private static final Trace LOGGER = TraceManager.getTrace(PageUser.class); @@ -123,9 +119,9 @@ protected List load() { } } }; - privilegesListModel = new LoadableModel>(false) { + privilegesListModel = new LoadableModel>(false) { @Override - protected List load() { + protected List load() { return getUserPrivilegesList(); } }; @@ -236,9 +232,9 @@ public String getExcludeOid() { } @Override - public IModel getLabel() { - return parentPage.createStringResource("FocusType.delegatedToMe"); - } + public IModel getLabel() { + return parentPage.createStringResource("FocusType.delegatedToMe"); + } @Override protected List createAssignmentMenu() { @@ -345,15 +341,12 @@ private List loadDelegatedByMeAssignments() { return list; } - private List getUserPrivilegesList(){ - List list = new ArrayList<>(); + private List getUserPrivilegesList(){ + List list = new ArrayList<>(); OperationResult result = new OperationResult(OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST); Task task = createSimpleTask(OPERATION_LOAD_ASSIGNMENT_PEVIEW_DTO_LIST); - for (AssignmentType assignment : getObjectWrapper().getObject().asObjectable().getAssignment()){ - AssignmentsPreviewDto dto = createDelegableAssignmentsPreviewDto(assignment, task, result); - if (dto != null){ - list.add(dto); - } + for (AssignmentType assignment : getObjectWrapper().getObject().asObjectable().getAssignment()) { + addIgnoreNull(list, createDelegableAssignmentsPreviewDto(assignment, task, result)); } return list; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUserHistory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUserHistory.java index d111dcdac18..44adde890f2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUserHistory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUserHistory.java @@ -20,9 +20,7 @@ import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior; -import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.util.logging.Trace; @@ -39,7 +37,7 @@ import com.evolveum.midpoint.web.component.prism.*; import com.evolveum.midpoint.web.page.admin.PageAdminFocus; import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.web.page.admin.users.component.UserSummaryPanel; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -231,7 +229,7 @@ public WebMarkupContainer createPanel(String panelId) { @Override public void populateAssignmentDetailsPanel(ListItem item) { DelegationEditorPanel editor = new DelegationEditorPanel(ID_ROW, item.getModel(), true, - new ArrayList(), PageUserHistory.this); + new ArrayList<>(), PageUserHistory.this); item.add(editor); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AllAssignmentsPreviewDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AllAssignmentsPreviewDialog.java new file mode 100644 index 00000000000..3f8c7480cef --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AllAssignmentsPreviewDialog.java @@ -0,0 +1,51 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.web.page.admin.users.component; + +import com.evolveum.midpoint.gui.api.page.PageBase; + +import java.util.List; + +/** + * @author mederly + */ +public class AllAssignmentsPreviewDialog extends AssignmentsInfoDialog { + + public AllAssignmentsPreviewDialog(String id, List data, PageBase pageBase) { + super(id, data, pageBase); + } + + @Override + protected boolean enableMultiSelect() { + return false; + } + + @Override + protected boolean showDirectIndirectColumn() { + return true; + } + + @Override + protected boolean showKindAndIntentColumns() { + return true; + } + + @Override + protected boolean showRelationColumn() { + return true; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsPreviewDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java similarity index 69% rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsPreviewDto.java rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java index 669925b7f57..2c5ba533a04 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsPreviewDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java @@ -16,17 +16,25 @@ package com.evolveum.midpoint.web.page.admin.users.component; -import com.evolveum.midpoint.web.component.util.SelectableBean; -import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.web.component.util.Selectable; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.wicket.Component; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; import javax.xml.namespace.QName; import java.io.Serializable; +import java.util.Objects; /** + * Not to be confused with AssignmentDto. This one is used in assignment dialog (preview, selecting for delegation limitations, ...). + * * @author mederly */ -public class AssignmentsPreviewDto extends SelectableBean implements Serializable, Comparable { +@SuppressWarnings("unused") +public class AssignmentInfoDto extends Selectable implements Serializable, Comparable { public static final String F_TARGET_OID = "targetOid"; public static final String F_TARGET_NAME = "targetName"; @@ -44,8 +52,8 @@ public class AssignmentsPreviewDto extends SelectableBean implements Serializabl private String targetOid; private String targetName; private String targetDescription; - private Class targetClass; - private boolean direct; // directly assigned? + private Class targetClass; + private boolean direct; // true if directly assigned; used only in some contexts private QName targetType; // for resource assignments private ShadowKindType kind; @@ -83,11 +91,11 @@ public void setTargetDescription(String targetDescription) { this.targetDescription = targetDescription; } - public Class getTargetClass() { + public Class getTargetClass() { return targetClass; } - public void setTargetClass(Class targetClass) { + public void setTargetClass(Class targetClass) { this.targetClass = targetClass; } @@ -173,51 +181,40 @@ public void setRelation(QName relation) { @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - AssignmentsPreviewDto that = (AssignmentsPreviewDto) o; - - if (direct != that.direct) return false; - if (targetOid != null ? !targetOid.equals(that.targetOid) : that.targetOid != null) return false; - if (targetName != null ? !targetName.equals(that.targetName) : that.targetName != null) return false; - if (targetClass != null ? !targetClass.equals(that.targetClass) : that.targetClass != null) return false; - if (kind != that.kind) return false; - if (intent != null ? !intent.equals(that.intent) : that.intent != null) return false; - if (tenantName != null ? !tenantName.equals(that.tenantName) : that.tenantName != null) return false; - if (orgRefName != null ? !orgRefName.equals(that.orgRefName) : that.orgRefName != null) return false; - if (relation != null ? !relation.equals(that.relation) : that.relation != null) return false; - return !(remark != null ? !remark.equals(that.remark) : that.remark != null); - + if (this == o) + return true; + if (!(o instanceof AssignmentInfoDto)) + return false; + AssignmentInfoDto that = (AssignmentInfoDto) o; + return direct == that.direct && + Objects.equals(targetOid, that.targetOid) && + Objects.equals(targetName, that.targetName) && + Objects.equals(targetDescription, that.targetDescription) && + Objects.equals(targetClass, that.targetClass) && + Objects.equals(targetType, that.targetType) && + kind == that.kind && + Objects.equals(intent, that.intent) && + Objects.equals(tenantName, that.tenantName) && + Objects.equals(orgRefName, that.orgRefName) && + Objects.equals(tenantRef, that.tenantRef) && + Objects.equals(orgRef, that.orgRef) && + Objects.equals(remark, that.remark) && + Objects.equals(relation, that.relation); } @Override public int hashCode() { - int result = targetOid != null ? targetOid.hashCode() : 0; - result = 31 * result + (targetName != null ? targetName.hashCode() : 0); - result = 31 * result + (targetClass != null ? targetClass.hashCode() : 0); - result = 31 * result + (direct ? 1 : 0); - result = 31 * result + (kind != null ? kind.hashCode() : 0); - result = 31 * result + (intent != null ? intent.hashCode() : 0); - result = 31 * result + (tenantName != null ? tenantName.hashCode() : 0); - result = 31 * result + (orgRefName != null ? orgRefName.hashCode() : 0); - result = 31 * result + (remark != null ? remark.hashCode() : 0); - result = 31 * result + (relation != null ? relation.hashCode() : 0); - return result; + return Objects + .hash(targetOid, targetName, targetDescription, targetClass, direct, targetType, kind, intent, tenantName, + orgRefName, tenantRef, orgRef, remark, relation); } @Override - public int compareTo(Object o) { - if (!(o instanceof AssignmentsPreviewDto)) { - return -1; // should not occur - } - - if (this.equals(o)) { + public int compareTo(AssignmentInfoDto other) { + if (this.equals(other)) { return 0; } - AssignmentsPreviewDto other = (AssignmentsPreviewDto) o; - // firstly sorting by type: orgs -> roles -> resources -> all the other (in the future) int co1 = getClassOrder(this.getTargetClass()); int co2 = getClassOrder(other.getTargetClass()); @@ -241,7 +238,7 @@ public int compareTo(Object o) { // if class and names are equal, the order can be arbitrary - if (this.hashCode() <= o.hashCode()) { + if (this.hashCode() <= other.hashCode()) { return -1; } else { return 1; @@ -259,4 +256,9 @@ private int getClassOrder(Class targetClass) { return 3; } } + + public IModel getRelationDisplayNameModel(Component component) { + String localizationKey = ObjectTypeUtil.getRelationNameLocalizationKey(relation, true); + return localizationKey != null ? PageBase.createStringResourceStatic(component, localizationKey) : Model.of(""); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentPreviewDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentPreviewDialog.java deleted file mode 100644 index fa7056d595e..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentPreviewDialog.java +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Copyright (c) 2010-2017 Evolveum - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.evolveum.midpoint.web.page.admin.users.component; - -import com.evolveum.midpoint.gui.api.component.BasePanel; -import com.evolveum.midpoint.gui.api.component.ObjectBrowserPanel; -import com.evolveum.midpoint.gui.api.component.PopupObjectListPanel; -import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.web.component.AjaxButton; -import com.evolveum.midpoint.web.component.data.TablePanel; -import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; -import com.evolveum.midpoint.web.component.data.column.IconColumn; -import com.evolveum.midpoint.web.component.data.column.LinkColumn; -import com.evolveum.midpoint.web.component.dialog.Popupable; -import com.evolveum.midpoint.web.component.util.ListDataProvider; -import com.evolveum.midpoint.web.component.util.SelectableBean; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard; -import com.evolveum.midpoint.web.page.admin.roles.PageRole; -import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit; -import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor; -import com.evolveum.midpoint.web.util.OnePageParameterEncoder; -import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; - -import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; -import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.DataTable; -import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; -import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; -import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.panel.Panel; -import org.apache.wicket.markup.repeater.Item; -import org.apache.wicket.model.AbstractReadOnlyModel; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; -import org.apache.wicket.model.StringResourceModel; -import org.apache.wicket.request.mapper.parameter.PageParameters; - -import javax.xml.namespace.QName; -import java.util.ArrayList; -import java.util.List; - -/** - * @author shood - * */ -public class AssignmentPreviewDialog extends BasePanel implements Popupable { - - private static final String ID_CONTENT = "panel"; - private static final String ID_TABLE = "table"; - private static final String ID_BUTTON_CANCEL = "cancelButton"; - private static final String ID_BUTTON_ADD = "addButton"; - - private boolean initialized; - private List directAssignments; - private IModel> data; - private PageBase pageBase; - private boolean multiselect; - - public AssignmentPreviewDialog(String id, final List data, List directAssignments, - PageBase pageBase) { - this(id, data, directAssignments, pageBase, false); - } - public AssignmentPreviewDialog(String id, final List data, List directAssignments, - PageBase pageBase, boolean multiselect){ - super(id); - - this.directAssignments = directAssignments; - this.pageBase = pageBase; - this.multiselect = multiselect; - this.data = new LoadableModel>(false) { - - @Override - protected List load() { - return data == null ? new ArrayList() : data; - } - }; - initLayout(); - } - public StringResourceModel createStringResource(String resourceKey, Object... objects) { - return PageBase.createStringResourceStatic(this, resourceKey, objects); - } - - public void initLayout(){ - List> columns = initColumns(); - ListDataProvider provider = new ListDataProvider(pageBase, data); - - WebMarkupContainer content = new WebMarkupContainer(ID_CONTENT); - content.setOutputMarkupId(true); - add(content); - - TablePanel table = new TablePanel<>(ID_TABLE, provider, columns); - table.setOutputMarkupId(true); - content.add(table); - - AjaxButton addButton = new AjaxButton(ID_BUTTON_ADD, - createStringResource("userBrowserDialog.button.selectButton")) { - - private static final long serialVersionUID = 1L; - @Override - public void onClick(AjaxRequestTarget target) { - List previewDtos = data.getObject(); - List selectedDtos = new ArrayList<>(); - for (AssignmentsPreviewDto dto : previewDtos){ - if (dto.isSelected()){ - selectedDtos.add(dto); - } - } - AssignmentPreviewDialog.this.addButtonClicked(target, selectedDtos); - } - }; - - addButton.add(new VisibleEnableBehaviour() { - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible() { - return multiselect; - } - }); - - content.add(addButton); - - AjaxButton cancelButton = new AjaxButton(ID_BUTTON_CANCEL, - createStringResource("AssignmentPreviewDialog.button.cancel")) { - - @Override - public void onClick(AjaxRequestTarget ajaxRequestTarget) { - ((PageBase)getPage()).hideMainPopup(ajaxRequestTarget); - } - }; - content.add(cancelButton); - } - - private List> initColumns() { - List> columns = new ArrayList<>(); - if (multiselect) { - columns.add(new CheckBoxHeaderColumn() { - private static final long serialVersionUID = 1L; - - @Override - protected void onUpdateRow(AjaxRequestTarget target, DataTable table, IModel rowModel) { - super.onUpdateRow(target, table, rowModel); - }; - - @Override - protected void onUpdateHeader(AjaxRequestTarget target, boolean selected, DataTable table) { - super.onUpdateHeader(target, selected, table); - } - }); - - } - columns.add(new LinkColumn(createStringResource("AssignmentPreviewDialog.column.name"), AssignmentsPreviewDto.F_TARGET_NAME){ - - @Override - public void onClick(AjaxRequestTarget target, IModel rowModel){ - AssignmentsPreviewDto dto = rowModel.getObject(); - chooseOperationPerformed(dto.getTargetOid(), dto.getTargetClass()); - } - - @Override - public boolean isEnabled(IModel rowModel) { - if (multiselect){ - return false; - } - Class targetClass = rowModel.getObject().getTargetClass(); - String authorizationAction = ""; - if (targetClass.getSimpleName().equals("OrgType")){ - authorizationAction = AuthorizationConstants.AUTZ_UI_ORG_UNIT_URL; - } else if (targetClass.getSimpleName().equals("RoleType")){ - authorizationAction = AuthorizationConstants.AUTZ_UI_ROLE_URL; - } else if (targetClass.getSimpleName().equals("ServiceType")){ - authorizationAction = AuthorizationConstants.AUTZ_UI_SERVICE_URL; - } else if (targetClass.getSimpleName().equals("ResourceType")){ - authorizationAction = AuthorizationConstants.AUTZ_UI_RESOURCE_URL; - } - if (WebComponentUtil.isAuthorized(authorizationAction)) { - return true; - } - - return false; - } - }); - - columns.add(new IconColumn(createStringResource("")) { - - @Override - protected IModel createIconModel(IModel rowModel) { - ObjectTypeGuiDescriptor guiDescriptor = ObjectTypeGuiDescriptor.getDescriptor(rowModel.getObject().getTargetClass()); - String icon = guiDescriptor != null ? guiDescriptor.getBlackIcon() : ObjectTypeGuiDescriptor.ERROR_ICON; - return new Model<>(icon); - } - }); - - if (!isDelegationPreview()) { - columns.add(new AbstractColumn(createStringResource("Type")) { - - @Override - public void populateItem(Item> cellItem, String componentId, final IModel rowModel) { - cellItem.add(new Label(componentId, new AbstractReadOnlyModel() { - - @Override - public String getObject() { - return rowModel.getObject().isDirect() ? - createStringResource("AssignmentPreviewDialog.type.direct").getString() : - createStringResource("AssignmentPreviewDialog.type.indirect").getString(); - } - })); - } - }); - } - - columns.add(new PropertyColumn( - createStringResource("AssignmentPreviewDialog.column.description"), AssignmentsPreviewDto.F_TARGET_DESCRIPTION)); - - columns.add(new PropertyColumn( - createStringResource("AssignmentPreviewDialog.column.tenant"), AssignmentsPreviewDto.F_TENANT_NAME)); - - columns.add(new PropertyColumn( - createStringResource("AssignmentPreviewDialog.column.orgRef"), AssignmentsPreviewDto.F_ORG_REF_NAME)); - - if (!isDelegationPreview()) { - columns.add(new PropertyColumn( - createStringResource("AssignmentPreviewDialog.column.kind"), AssignmentsPreviewDto.F_KIND)); - - columns.add(new PropertyColumn( - createStringResource("AssignmentPreviewDialog.column.intent"), AssignmentsPreviewDto.F_INTENT)); - } - return columns; - } - - private void chooseOperationPerformed(String oid, Class clazz){ - PageParameters parameters = new PageParameters(); - parameters.add(OnePageParameterEncoder.PARAMETER, oid); - - PageBase page = getPageBase(); - - if(clazz.equals(RoleType.class)){ - page.navigateToNext(PageRole.class, parameters); - } else if(clazz.equals(ResourceType.class)){ - page.navigateToNext(PageResourceWizard.class, parameters); - } else if(clazz.equals(OrgType.class)){ - page.navigateToNext(PageOrgUnit.class, parameters); - } - } - - protected boolean isDelegationPreview(){ - return false; - } - - @Override - public int getWidth() { - return 1100; - } - - @Override - public int getHeight() { - return 500; - } - - @Override - public StringResourceModel getTitle() { - return new StringResourceModel("AssignmentPreviewDialog.label"); - } - - @Override - public Component getComponent() { - return this; - } - - protected void addButtonClicked(AjaxRequestTarget target, List dtoList){ - } -} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentPreviewDialog.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsInfoDialog.html similarity index 100% rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentPreviewDialog.html rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsInfoDialog.html diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsInfoDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsInfoDialog.java new file mode 100644 index 00000000000..5f81ee452ec --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentsInfoDialog.java @@ -0,0 +1,221 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.web.page.admin.users.component; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.model.ReadOnlyModel; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.util.MiscUtil; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.data.TablePanel; +import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; +import com.evolveum.midpoint.web.component.data.column.GenericColumn; +import com.evolveum.midpoint.web.component.data.column.IconColumn; +import com.evolveum.midpoint.web.component.data.column.LinkColumn; +import com.evolveum.midpoint.web.component.dialog.Popupable; +import com.evolveum.midpoint.web.component.util.ListDataProvider; +import com.evolveum.midpoint.web.page.admin.resources.PageResourceWizard; +import com.evolveum.midpoint.web.page.admin.roles.PageRole; +import com.evolveum.midpoint.web.page.admin.users.PageOrgUnit; +import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; + +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; +import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; +import org.apache.wicket.extensions.markup.html.repeater.data.table.PropertyColumn; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.basic.Label; +import org.apache.wicket.markup.repeater.Item; +import org.apache.wicket.model.AbstractReadOnlyModel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.StringResourceModel; +import org.apache.wicket.request.mapper.parameter.PageParameters; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * Abstract superclass for dialogs that display a list of assignments. + * Configurable by overriding 'configuration methods'. + * + * @author shood + */ +public abstract class AssignmentsInfoDialog extends BasePanel> implements Popupable { + + private static final String ID_CONTENT = "panel"; + private static final String ID_TABLE = "table"; + private static final String ID_BUTTON_CANCEL = "cancelButton"; + private static final String ID_BUTTON_ADD = "addButton"; + + AssignmentsInfoDialog(String id, final List data, PageBase pageBase) { + super(id, new ReadOnlyModel<>(() -> MiscUtil.emptyIfNull(data))); + + initLayout(pageBase); + } + + public void initLayout(PageBase pageBase) { + List> columns = initColumns(); + ListDataProvider provider = new ListDataProvider<>(pageBase, getModel()); + + WebMarkupContainer content = new WebMarkupContainer(ID_CONTENT); + content.setOutputMarkupId(true); + add(content); + + TablePanel table = new TablePanel<>(ID_TABLE, provider, columns); + table.setOutputMarkupId(true); + content.add(table); + + AjaxButton addButton = new AjaxButton(ID_BUTTON_ADD, + createStringResource("userBrowserDialog.button.selectButton")) { + private static final long serialVersionUID = 1L; + @Override + public void onClick(AjaxRequestTarget target) { + List allAssignmentInfoDtos = AssignmentsInfoDialog.this.getModelObject(); + List selectedDtos = allAssignmentInfoDtos.stream().filter(AssignmentInfoDto::isSelected).collect(Collectors.toList()); + AssignmentsInfoDialog.this.addButtonClicked(target, selectedDtos); + } + }; + addButton.setVisible(enableMultiSelect()); + content.add(addButton); + + AjaxButton cancelButton = new AjaxButton(ID_BUTTON_CANCEL, + createStringResource("AssignmentPreviewDialog.button.cancel")) { + @Override + public void onClick(AjaxRequestTarget ajaxRequestTarget) { + getPageBase().hideMainPopup(ajaxRequestTarget); + } + }; + content.add(cancelButton); + } + + private List> initColumns() { + List> columns = new ArrayList<>(); + if (enableMultiSelect()) { + columns.add(new CheckBoxHeaderColumn<>()); + } + columns.add(new LinkColumn(createStringResource("AssignmentPreviewDialog.column.name"), AssignmentInfoDto.F_TARGET_NAME) { + + @Override + public void onClick(AjaxRequestTarget target, IModel rowModel){ + AssignmentInfoDto dto = rowModel.getObject(); + chooseOperationPerformed(dto.getTargetOid(), dto.getTargetClass()); + } + + @Override + public boolean isEnabled(IModel rowModel) { + if (enableMultiSelect()) { + return false; + } + Class targetClass = rowModel.getObject().getTargetClass(); + String authorizationAction = WebComponentUtil.getAuthorizationActionForTargetClass(targetClass); + return authorizationAction != null && WebComponentUtil.isAuthorized(authorizationAction); + } + }); + + columns.add(new IconColumn(createStringResource("")) { + @Override + protected IModel createIconModel(IModel rowModel) { + ObjectTypeGuiDescriptor guiDescriptor = ObjectTypeGuiDescriptor.getDescriptor(rowModel.getObject().getTargetClass()); + String icon = guiDescriptor != null ? guiDescriptor.getBlackIcon() : ObjectTypeGuiDescriptor.ERROR_ICON; + return Model.of(icon); + } + }); + + if (showDirectIndirectColumn()) { + columns.add(new AbstractColumn(createStringResource("Type")) { + @Override + public void populateItem(Item> cellItem, String componentId, final IModel rowModel) { + cellItem.add(new Label(componentId, new AbstractReadOnlyModel() { + + @Override + public String getObject() { + return rowModel.getObject().isDirect() ? + createStringResource("AssignmentPreviewDialog.type.direct").getString() : + createStringResource("AssignmentPreviewDialog.type.indirect").getString(); + } + })); + } + }); + } + + columns.add(new PropertyColumn<>(createStringResource("AssignmentPreviewDialog.column.description"), AssignmentInfoDto.F_TARGET_DESCRIPTION)); + columns.add(new PropertyColumn<>(createStringResource("AssignmentPreviewDialog.column.tenant"), AssignmentInfoDto.F_TENANT_NAME)); + columns.add(new PropertyColumn<>(createStringResource("AssignmentPreviewDialog.column.orgRef"), AssignmentInfoDto.F_ORG_REF_NAME)); + + if (showKindAndIntentColumns()) { + columns.add(new PropertyColumn<>(createStringResource("AssignmentPreviewDialog.column.kind"), AssignmentInfoDto.F_KIND)); + columns.add(new PropertyColumn<>(createStringResource("AssignmentPreviewDialog.column.intent"), AssignmentInfoDto.F_INTENT)); + } + if (showRelationColumn()) { + columns.add(new GenericColumn<>(createStringResource("AssignmentPreviewDialog.column.relation"), + infoModel -> infoModel.getObject().getRelationDisplayNameModel(this))); + } + return columns; + } + + private void chooseOperationPerformed(String oid, Class clazz){ + PageParameters parameters = new PageParameters(); + parameters.add(OnePageParameterEncoder.PARAMETER, oid); + + PageBase page = getPageBase(); + + if(clazz.equals(RoleType.class)){ + page.navigateToNext(PageRole.class, parameters); + } else if(clazz.equals(ResourceType.class)){ + page.navigateToNext(PageResourceWizard.class, parameters); + } else if(clazz.equals(OrgType.class)){ + page.navigateToNext(PageOrgUnit.class, parameters); + } + } + + protected abstract boolean enableMultiSelect(); + protected abstract boolean showDirectIndirectColumn(); + protected abstract boolean showKindAndIntentColumns(); + protected abstract boolean showRelationColumn(); + + @Override + public int getWidth() { + return 1100; + } + + @Override + public int getHeight() { + return 500; + } + + @Override + public StringResourceModel getTitle() { + return new StringResourceModel("AssignmentPreviewDialog.label"); + } + + @Override + public Component getComponent() { + return this; + } + + protected void addButtonClicked(AjaxRequestTarget target, List dtoList) { + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/DelegationTargetLimitationDialog.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/DelegationTargetLimitationDialog.java new file mode 100644 index 00000000000..3ac2e9098df --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/DelegationTargetLimitationDialog.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.evolveum.midpoint.web.page.admin.users.component; + +import com.evolveum.midpoint.gui.api.page.PageBase; +import org.apache.wicket.model.StringResourceModel; + +import java.util.List; + +/** + * @author mederly + */ +public class DelegationTargetLimitationDialog extends AssignmentsInfoDialog { + + public DelegationTargetLimitationDialog(String id, List data, PageBase pageBase) { + super(id, data, pageBase); + } + + @Override + public StringResourceModel getTitle() { + return new StringResourceModel("AssignmentPreviewDialog.delegationPreviewLabel"); + } + + @Override + protected boolean enableMultiSelect() { + return true; + } + + @Override + protected boolean showDirectIndirectColumn() { + return false; + } + + @Override + protected boolean showKindAndIntentColumns() { + return false; + } + + @Override + protected boolean showRelationColumn() { + return false; + } +} diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index 69c1fe6f903..f71502845f8 100755 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -98,6 +98,7 @@ AssignmentPreviewDialog.column.kind=Kind AssignmentPreviewDialog.column.name=Name AssignmentPreviewDialog.column.orgRef=Org AssignmentPreviewDialog.column.tenant=Tenant +AssignmentPreviewDialog.column.relation=Relation AssignmentPreviewDialog.label=View direct & indirect assignments AssignmentPreviewDialog.delegationPreviewLabel=Limit privileges AssignmentPreviewDialog.type.direct=Direct diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java index 8aa71b5a57d..ea2e32e341e 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/SchemaConstants.java @@ -546,6 +546,8 @@ public abstract class SchemaConstants { public static final String OBJECT_SPECIFICATION_WITH_PATH_KEY = "ObjectSpecificationWithPath"; public static final String POLICY_VIOLATION_EXCEPTION_AGGREGATE_KEY = "PolicyViolationException.message.aggregate"; + public static final String RELATION_NAME_KEY_PREFIX = "relation."; + // // resetPassword // public static final String RESET_PASSWORD_ID = "user"; // public static final String RESET_PASSWORD_TOKEN = "token"; diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java index 64f1b5821e3..98f57efa2bd 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectTypeUtil.java @@ -800,6 +800,15 @@ public static LocalizableMessage createTypeDisplayInformation(String objectClass .build(); } + @Nullable + public static String getRelationNameLocalizationKey(@Nullable QName relation, boolean defaultAsNull) { + if (relation == null || defaultAsNull && QNameUtil.match(relation, SchemaConstants.ORG_DEFAULT)) { + return null; + } else { + return SchemaConstants.RELATION_NAME_KEY_PREFIX + relation.getLocalPart(); + } + } + @NotNull public static Collection getSubtypeValues(@NotNull PrismObject object) { O o = object.asObjectable(); diff --git a/infra/schema/src/main/resources/localization/schema.properties b/infra/schema/src/main/resources/localization/schema.properties index eb0e38d9ff3..732f91674cd 100755 --- a/infra/schema/src/main/resources/localization/schema.properties +++ b/infra/schema/src/main/resources/localization/schema.properties @@ -532,4 +532,11 @@ MetadataType.certificationFinishedTimestamp=Last certification finished at MetadataType.certificationOutcome=Last certification outcome MetadataType.certifierRef=Certifier MetadataType.certifierComment=Certifier comment -MetadataType.originMappingName=Originating mapping name \ No newline at end of file +MetadataType.originMappingName=Originating mapping name +relation.default=default +relation.manager=manager +relation.meta=meta +relation.deputy=deputy +relation.approver=approver +relation.owner=owner +relation.consent=consent \ No newline at end of file diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java index 69363540f6c..107fb195d5d 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/MiscUtil.java @@ -605,8 +605,14 @@ public static T last(List list) { return list.get(list.size() - 1); } + @NotNull public static String emptyIfNull(String s) { - return s == null ? "" : s; + return s != null ? s : ""; + } + + @NotNull + public static List emptyIfNull(List list) { + return list != null ? list : Collections.emptyList(); } public static String nullIfEmpty(String s) { diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java index 60e09c95b19..144362b0cf6 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelExecuteOptions.java @@ -26,6 +26,8 @@ import java.io.Serializable; import java.util.List; +import static org.apache.commons.lang3.BooleanUtils.isTrue; + /** * Options for execution of Model operations. These options influence the way how the operations are executed. * The options are not mandatory. All options have reasonable default values. They may not be specified at all. @@ -148,6 +150,13 @@ public class ModelExecuteOptions extends AbstractOptions implements Serializable */ private ConflictResolutionType focusConflictResolution; + /** + * Processes all assignment relations on recompute. Used for computing all assignments. + * TEMPORARY. EXPERIMENTAL. Should be replaced by something more generic (e.g. setting optimization level). + * Therefore we do not currently put this to XML version of the options. + */ + private Boolean evaluateAllAssignmentRelationsOnRecompute; + public Boolean getForce() { return force; } @@ -395,7 +404,7 @@ public static boolean isExecuteImmediatelyAfterApproval(ModelExecuteOptions opti return options.executeImmediatelyAfterApproval; } - public static ModelExecuteOptions createExecuteImmediatelyAfterApproval(){ + public static ModelExecuteOptions createExecuteImmediatelyAfterApproval() { ModelExecuteOptions opts = new ModelExecuteOptions(); opts.setExecuteImmediatelyAfterApproval(true); return opts; @@ -570,6 +579,23 @@ public static ModelExecuteOptions createFocusConflictResolution(ConflictResoluti return opts; } + public Boolean getEvaluateAllAssignmentRelationsOnRecompute() { + return evaluateAllAssignmentRelationsOnRecompute; + } + + public void setEvaluateAllAssignmentRelationsOnRecompute(Boolean evaluateAllAssignmentRelationsOnRecompute) { + this.evaluateAllAssignmentRelationsOnRecompute = evaluateAllAssignmentRelationsOnRecompute; + } + + public static boolean isEvaluateAllAssignmentRelationsOnRecompute(ModelExecuteOptions options) { + return options != null && isTrue(options.evaluateAllAssignmentRelationsOnRecompute); + } + + public static ModelExecuteOptions createEvaluateAllAssignmentRelationsOnRecompute() { + ModelExecuteOptions opts = new ModelExecuteOptions(); + opts.setEvaluateAllAssignmentRelationsOnRecompute(true); + return opts; + } public ModelExecuteOptionsType toModelExecutionOptionsType() { ModelExecuteOptionsType retval = new ModelExecuteOptionsType(); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignmentTarget.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignmentTarget.java index 5e36b3c69ea..d09d7d03c05 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignmentTarget.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignmentTarget.java @@ -32,8 +32,14 @@ public interface EvaluatedAssignmentTarget extends DebugDumpable { boolean isDirectlyAssigned(); // if this target applies to focus (by direct assignment or by some inducement) + // currently matches only default (member) relations - TODO clarify this boolean appliesToFocus(); + // if this target applies to focus (by direct assignment or by some inducement) + // accepts all relations + // TODO clarify this + boolean appliesToFocusWithAnyRelation(); + /** * True for roles whose constructions are evaluated - i.e. those roles that are considered to be applied * to the focal object (e.g. to the user). diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java index 4126316c10f..8a3d07cf673 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/ModelInteractionServiceImpl.java @@ -186,9 +186,7 @@ public ModelContext previewChanges( //used cloned deltas instead of origin deltas, because some of the values should be lost later.. context = contextFactory.createContext(clonedDeltas, options, task, result); // context.setOptions(options); - if (LOGGER.isDebugEnabled()) { - LOGGER.trace("Preview changes context:\n{}", context.debugDump()); - } + LOGGER.trace("Preview changes context:\n{}", context.debugDumpLazily()); context.setProgressListeners(listeners); projector.projectAllWaves(context, "preview", task, result); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java index 35dd24a7eb5..bee9c18b76e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentEvaluator.java @@ -25,6 +25,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.common.ActivationComputer; +import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; import com.evolveum.midpoint.repo.common.expression.ItemDeltaItem; @@ -373,7 +374,8 @@ private boolean evaluateSegmentContent(AssignmentPathSegm LOGGER.trace("Skipping processing of assignment target {} because relation {} is configured for login skip", assignmentType.getTargetRef().getOid(), relation); // Skip - to optimize logging-in, we skip all assignments with non-membership/non-delegation relations (e.g. approver, owner, etc) // We want to make this configurable in the future MID-3581 - } else if (!loginMode && !isChanged(ctx.primaryAssignmentMode) && !ObjectTypeUtil.processRelationOnRecompute(relation)) { + } else if (!loginMode && !isChanged(ctx.primaryAssignmentMode) && + !ObjectTypeUtil.processRelationOnRecompute(relation) && !shouldEvaluateAllAssignmentRelationsOnRecompute()) { LOGGER.debug("Skipping processing of assignment target {} because relation {} is configured for recompute skip (mode={})", assignmentType.getTargetRef().getOid(), relation, relativeMode); // Skip - to optimize recompute, we skip all assignments with non-membership/non-delegation relations (e.g. approver, owner, etc) // never skip this if assignment has changed. We want to process this, e.g. to enforce min/max assignee rules @@ -416,6 +418,10 @@ private boolean evaluateSegmentContent(AssignmentPathSegm return isAssignmentValid; } + private boolean shouldEvaluateAllAssignmentRelationsOnRecompute() { + return ModelExecuteOptions.isEvaluateAllAssignmentRelationsOnRecompute(lensContext.getOptions()); + } + private boolean isDelegationToNonDelegableTarget(AssignmentType assignmentType, @NotNull PrismObject target, EvaluationContext ctx) { AssignmentPathSegment previousSegment = ctx.assignmentPath.beforeLast(1); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetImpl.java index f9ae6c4faaa..ecdfad150be 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetImpl.java @@ -16,7 +16,9 @@ package com.evolveum.midpoint.model.impl.lens; import com.evolveum.midpoint.model.api.context.EvaluatedAssignmentTarget; +import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; @@ -63,6 +65,13 @@ public boolean appliesToFocus() { return assignmentPath.last().isMatchingOrder(); } + @Override + public boolean appliesToFocusWithAnyRelation() { + EvaluationOrder order = assignmentPath.last().getEvaluationOrder(); + // TODO check if transitive evaluations are taken into account (they are probably accounted for during assignment evaluation) + return order.getSummaryOrder() == 1 || order.getSummaryOrder() == 0 && order.getMatchingRelationOrder(SchemaConstants.ORG_DEPUTY) > 0; + } + @Override public boolean isEvaluateConstructions() { return evaluateConstructions; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java index 6ef62bedca2..73c78c4d96e 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestPreviewChanges.java @@ -15,78 +15,42 @@ */ package com.evolveum.midpoint.model.intest; -import static com.evolveum.midpoint.test.IntegrationTestTools.display; -import static org.testng.AssertJUnit.assertEquals; -import static org.testng.AssertJUnit.assertNotNull; -import static org.testng.AssertJUnit.assertNull; - -import java.io.File; -import java.io.IOException; -import java.util.Arrays; -import java.util.Collection; -import java.util.HashSet; - -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.constants.MidPointConstants; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType; - -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.annotation.DirtiesContext.ClassMode; -import org.springframework.test.context.ContextConfiguration; -import org.testng.AssertJUnit; -import org.testng.annotations.Test; - import com.evolveum.icf.dummy.resource.DummyAccount; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.model.api.ModelExecuteOptions; -import com.evolveum.midpoint.model.api.context.ModelContext; -import com.evolveum.midpoint.model.api.context.ModelElementContext; -import com.evolveum.midpoint.model.api.context.ModelProjectionContext; -import com.evolveum.midpoint.model.api.context.SynchronizationPolicyDecision; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.OriginType; -import com.evolveum.midpoint.prism.PrismObject; -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.delta.ChangeType; -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.model.api.context.*; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.delta.*; +import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; +import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.MiscSchemaUtil; -import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.DummyResourceContoller; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.ObjectChecker; import com.evolveum.midpoint.test.ObjectSource; import com.evolveum.midpoint.test.util.TestUtil; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ConfigurationException; -import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; -import com.evolveum.midpoint.util.exception.ObjectAlreadyExistsException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; -import com.evolveum.midpoint.util.exception.PolicyViolationException; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.exception.SecurityViolationException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentPolicyEnforcementType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AuthorizationPhaseType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RichHyperlinkType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowKindType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ShadowType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.util.exception.*; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ContextConfiguration; +import org.testng.AssertJUnit; +import org.testng.annotations.Test; + +import java.io.File; +import java.io.IOException; +import java.util.Collection; + +import static com.evolveum.midpoint.model.api.ModelExecuteOptions.createEvaluateAllAssignmentRelationsOnRecompute; +import static java.util.Collections.singleton; +import static org.testng.AssertJUnit.*; /** * @author semancik @@ -129,26 +93,16 @@ public void test100ModifyUserAddAccountBundle() throws Exception { assumeAssignmentPolicy(AssignmentPolicyEnforcementType.NONE); - ObjectSource> accountSource = new ObjectSource>() { - @Override - public PrismObject get() { - try { - return PrismTestUtil.parseObject(ACCOUNT_JACK_DUMMY_FILE); - } catch (SchemaException e) { - throw new IllegalStateException(e.getMessage(),e); - } catch (IOException e) { - throw new IllegalStateException(e.getMessage(),e); - } - } - }; - - ObjectChecker> checker = new ObjectChecker>() { - @Override - public void check(ModelContext modelContext) { - assertAddAccount(modelContext, false); + ObjectSource> accountSource = () -> { + try { + return PrismTestUtil.parseObject(ACCOUNT_JACK_DUMMY_FILE); + } catch (SchemaException | IOException e) { + throw new IllegalStateException(e.getMessage(),e); } }; + ObjectChecker> checker = modelContext -> assertAddAccount(modelContext, false); + modifyUserAddAccountImplicit(TEST_NAME, accountSource, checker); modifyUserAddAccountExplicit(TEST_NAME, accountSource, checker); modifyUserAddAccountImplicitExplicitSame(TEST_NAME, accountSource, checker); @@ -974,6 +928,47 @@ public void test236PreviewGuybrushAddRoleSailor() throws Exception { PrismAsserts.assertModifications(accountSecondaryDelta, 1); } + /** + * MID-3845 + */ + @Test + public void test238PreviewGuybrushAddRoleSailorOwner() throws Exception { + final String TEST_NAME = "test238PreviewGuybrushAddRoleSailorOwner"; + displayTestTitle(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); + + ObjectDelta delta = createAssignmentFocusDelta(UserType.class, USER_GUYBRUSH_OID, + ROLE_SAILOR_OID, RoleType.COMPLEX_TYPE, SchemaConstants.ORG_OWNER, null, null, true); + + // WHEN + displayWhen(TEST_NAME); + ModelContext modelContext = modelInteractionService.previewChanges(MiscSchemaUtil.createCollection(delta), + null, task, result); + + // THEN + displayThen(TEST_NAME); + display("Preview context", modelContext); + assertNotNull("Null model context", modelContext); + + result.computeStatus(); + TestUtil.assertSuccess(result); + + ModelElementContext focusContext = modelContext.getFocusContext(); + assertNotNull("Model focus context missing", focusContext); + + DeltaSetTriple> evaluatedAssignmentTriple = modelContext.getEvaluatedAssignmentTriple(); + display("evaluatedAssignmentTriple", evaluatedAssignmentTriple); + + assertEquals("Wrong # of evaluated assignments in plus set", 1, evaluatedAssignmentTriple.getPlusSet().size()); + EvaluatedAssignment evaluatedAssignment = evaluatedAssignmentTriple.getPlusSet().iterator().next(); + assertNotNull("Target of evaluated assignment is null", evaluatedAssignment.getTarget()); + assertEquals("Wrong # of zero-set roles in evaluated assignment", 1, evaluatedAssignment.getRoles().getZeroSet().size()); + } + @Test public void test239GuybrushUnAssignAccountDummy() throws Exception { final String TEST_NAME = "test239GuybrushUnAssignAccountDummy"; @@ -1984,4 +1979,48 @@ public void test700DisableElaineAccountTwoResources() throws Exception { PrismAsserts.assertPropertyReplace(accountSecondaryDeltaBlue, SchemaConstants.PATH_ACTIVATION_DISABLE_REASON, SchemaConstants.MODEL_DISABLE_REASON_EXPLICIT); } + + /** + * MID-3845; now the assignment is in the zero set + */ + @Test + public void test710PreviewGuybrushHavingRoleSailorOwner() throws Exception { + final String TEST_NAME = "test710PreviewGuybrushHavingRoleSailorOwner"; + displayTestTitle(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + assumeAssignmentPolicy(AssignmentPolicyEnforcementType.RELATIVE); + + assignRole(USER_GUYBRUSH_OID, ROLE_SAILOR_OID, SchemaConstants.ORG_OWNER, task, result); + + ObjectDelta empty = DeltaBuilder.deltaFor(UserType.class, prismContext).asObjectDeltaCast(USER_GUYBRUSH_OID); + + // WHEN + displayWhen(TEST_NAME); + ModelContext modelContext = modelInteractionService.previewChanges(singleton(empty), + createEvaluateAllAssignmentRelationsOnRecompute(), task, result); + + // THEN + displayThen(TEST_NAME); + display("Preview context", modelContext); + assertNotNull("Null model context", modelContext); + + result.computeStatus(); + TestUtil.assertSuccess(result); + + ModelElementContext focusContext = modelContext.getFocusContext(); + assertNotNull("Model focus context missing", focusContext); + + DeltaSetTriple> evaluatedAssignmentTriple = modelContext.getEvaluatedAssignmentTriple(); + display("evaluatedAssignmentTriple", evaluatedAssignmentTriple); + + assertEquals("Wrong # of evaluated assignments in zero set", 1, evaluatedAssignmentTriple.getZeroSet().size()); + EvaluatedAssignment evaluatedAssignment = evaluatedAssignmentTriple.getZeroSet().iterator().next(); + assertNotNull("Target of evaluated assignment is null", evaluatedAssignment.getTarget()); + assertEquals("Wrong # of zero-set roles in evaluated assignment", 1, evaluatedAssignment.getRoles().getZeroSet().size()); + } + + } From 59b3a8c3e22626122c071fd3b19776b0487f94c8 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Wed, 29 Nov 2017 16:39:19 +0100 Subject: [PATCH 10/18] fixing GUI tests --- .../gui/api/util/WebModelServiceUtils.java | 63 ++++++++++++++++++- .../component/prism/ObjectWrapperFactory.java | 2 +- .../prism/PropertyOrReferenceWrapper.java | 2 +- .../TestIntegrationObjectWrapperFactory.java | 37 ++++++----- 4 files changed, 84 insertions(+), 20 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 aaffe14429d..3b827c3fb74 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 @@ -222,7 +222,7 @@ public static PrismObject loadObject(Class type, St PageBase page, Task task, OperationResult result) { return loadObject(type, oid, options, true, page, task, result); } - + @Nullable public static PrismObject loadObject(Class type, String oid, Collection> options, boolean allowNotFound, @@ -281,6 +281,67 @@ public static PrismObject loadObject(Class type, St return object; } + + //TODO consider using modelServiceLocator instead of PageBase in other methods.. Do we even need it? What about showResult? Should it be + // here or directly in the page? Consider usability and readabiltiy + @Nullable + public static PrismObject loadObject(ObjectReferenceType objectReference, + ModelServiceLocator page, Task task, OperationResult result) { + Class type = page.getPrismContext().getSchemaRegistry().determineClassForType(objectReference.getType()); + String oid = objectReference.getOid(); + Collection> options = null; + LOGGER.debug("Loading {} with oid {}, options {}", type.getSimpleName(), oid, options); + + OperationResult subResult; + if (result != null) { + subResult = result.createMinorSubresult(OPERATION_LOAD_OBJECT); + } else { + subResult = new OperationResult(OPERATION_LOAD_OBJECT); + } + PrismObject object = null; + try { + if (options == null) { + options = SelectorOptions.createCollection(GetOperationOptions.createResolveNames()); + } else { + GetOperationOptions getOpts = SelectorOptions.findRootOptions(options); + if (getOpts == null) { + options.add(new SelectorOptions<>(GetOperationOptions.createResolveNames())); + } else { + getOpts.setResolveNames(Boolean.TRUE); + } + } + object = page.getModelService().getObject(type, oid, options, task, subResult); + } catch (AuthorizationException e) { + // Not authorized to access the object. This is probably caused by a reference that + // point to an object that the current user cannot read. This is no big deal. + // Just do not display that object. + subResult.recordHandledError(e); + LOGGER.debug("User {} is not authorized to read {} {}", + task.getOwner() != null ? task.getOwner().getName() : null, type.getSimpleName(), oid); + return null; + } catch (ObjectNotFoundException e) { + // Object does not exist. It was deleted in the meanwhile, or not created yet. This could happen quite often. + subResult.recordHandledError(e); + LOGGER.debug("{} {} does not exist", type.getSimpleName(), oid, e); + return null; + + } catch (Exception ex) { + subResult.recordFatalError("WebModelUtils.couldntLoadObject", ex); + LoggingUtils.logUnexpectedException(LOGGER, "Couldn't load object", ex); + } finally { + subResult.computeStatus(); + } + // TODO reconsider this part: until recently, the condition was always 'false' + if (WebComponentUtil.showResultInPage(subResult)) { + if (page instanceof PageBase) { + ((PageBase)page).showResult(subResult); + } + } + + LOGGER.debug("Loaded {} with result {}", object, subResult); + + return object; + } public static boolean isNoFetch(Collection> options) { if (options == null) { 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 45df7b7bb32..cc1b3291ba6 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 @@ -271,7 +271,7 @@ private ContainerWrapper crea } Task task = modelServiceLocator.createSimpleTask("Load resource ref"); //TODO: is it safe to case modelServiceLocator to pageBase? - PrismObject resource = WebModelServiceUtils.loadObject(shadow.getResourceRef(), (PageBase) modelServiceLocator, task, result); + PrismObject resource = WebModelServiceUtils.loadObject(shadow.getResourceRef(), modelServiceLocator, task, result); result.computeStatusIfUnknown(); if (!result.isAcceptable()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyOrReferenceWrapper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyOrReferenceWrapper.java index f609cf88c36..115204a5736 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyOrReferenceWrapper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PropertyOrReferenceWrapper.java @@ -120,7 +120,7 @@ private boolean canAddDefault() { } private boolean canReadOrModifyAndNonEmpty() { - return getItemDefinition().canRead() && !getItem().isEmpty(); //(getItemDefinition().canModify() || getItemDefinition().canRead()) && !getItem().isEmpty(); + return getItemDefinition().canRead() && (!getItem().isEmpty() || getItemDefinition().isEmphasized()); //(getItemDefinition().canModify() || getItemDefinition().canRead()) && !getItem().isEmpty(); } private boolean canReadOrModifyAndShowEmpty() { diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java index 4223841c4a2..f3b141a342d 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/TestIntegrationObjectWrapperFactory.java @@ -45,6 +45,7 @@ import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismProperty; +import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.prism.util.PrismTestUtil; @@ -68,6 +69,7 @@ import com.evolveum.midpoint.web.component.prism.ItemWrapper; import com.evolveum.midpoint.web.component.prism.ObjectWrapper; import com.evolveum.midpoint.web.component.prism.ObjectWrapperFactory; +import com.evolveum.midpoint.web.component.prism.ReferenceWrapper; import com.evolveum.midpoint.web.component.prism.ValueStatus; import com.evolveum.midpoint.web.component.prism.ValueWrapper; import com.evolveum.midpoint.xml.ns._public.common.common_3.ActivationStatusType; @@ -257,7 +259,7 @@ public void test150CreateWrapperShadow() throws Exception { WrapperTestUtil.assertPropertyWrapper(attributesContainerValueWrapper, SchemaConstants.ICFS_NAME, USER_JACK_USERNAME); assertEquals("wrong number of items in "+attributesContainerWrapper, 17, attributesContainerValueWrapper.getItems().size()); - ContainerWrapper activationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(UserType.F_ACTIVATION)); + ContainerWrapper activationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(ShadowType.F_ACTIVATION)); assertEquals("wrong number of values in "+activationContainerWrapper, 1, activationContainerWrapper.getValues().size()); ContainerValueWrapper activationContainerValueWrapper = activationContainerWrapper.getValues().iterator().next(); WrapperTestUtil.assertWrapper(activationContainerWrapper, "ShadowType.activation", UserType.F_ACTIVATION, shadow, ContainerStatus.MODIFYING); @@ -338,7 +340,7 @@ public void test220AssignRoleLandluberToWally() throws Exception { WrapperTestUtil.assertPropertyWrapper(attributesContainerValueWrapper, SchemaConstants.ICFS_NAME, USER_WALLY_NAME); assertEquals("wrong number of items in "+attributesContainerWrapper, 17, attributesContainerValueWrapper.getItems().size()); - ContainerWrapper activationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(UserType.F_ACTIVATION)); + ContainerWrapper activationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(ShadowType.F_ACTIVATION)); WrapperTestUtil.assertWrapper(activationContainerWrapper, "ShadowType.activation", UserType.F_ACTIVATION, shadow, ContainerStatus.MODIFYING); assertEquals("wrong number of containers in "+activationContainerWrapper, 1, activationContainerWrapper.getValues().size()); ContainerValueWrapper activationContainerValueWrapper = activationContainerWrapper.getValues().iterator().next(); @@ -346,22 +348,23 @@ public void test220AssignRoleLandluberToWally() throws Exception { WrapperTestUtil.assertPropertyWrapper(activationContainerValueWrapper, ActivationType.F_LOCKOUT_STATUS, null); //TODO: fix -// ContainerWrapper associationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(ShadowType.F_ASSOCIATION)); -// assertNotNull("No association container wrapper", associationContainerWrapper); -// assertEquals("wrong number of items in "+associationContainerWrapper, 2, associationContainerWrapper.getItems().size()); -// ItemWrapper groupAssociationWrapper = associationContainerWrapper.findPropertyWrapper(RESOURCE_DUMMY_ASSOCIATION_GROUP_QNAME); -// assertNotNull("No group association property wrapper", groupAssociationWrapper); -// assertTrue("Wrong type of group association property wrapper: "+groupAssociationWrapper.getClass(), groupAssociationWrapper instanceof AssociationWrapper); -// List groupAssociationValues = groupAssociationWrapper.getValues(); -// assertEquals("wrong number of values in "+groupAssociationWrapper, 1, groupAssociationValues.size()); -// ValueWrapper groupAssociationValue = groupAssociationValues.get(0); -// PrismContainerValue groupAssociationValuePVal = (PrismContainerValue) groupAssociationValue.getValue(); -// display("groupAssociationValuePVal", groupAssociationValuePVal); -// assertEquals("wrong number of values in "+groupAssociationValue, ValueStatus.NOT_CHANGED, groupAssociationValue.getStatus()); -// assertEquals("Wrong group association name", RESOURCE_DUMMY_ASSOCIATION_GROUP_QNAME, groupAssociationValuePVal.findProperty(ShadowAssociationType.F_NAME).getRealValue()); + ContainerWrapper associationContainerWrapper = objectWrapper.findContainerWrapper(new ItemPath(ShadowType.F_ASSOCIATION)); + assertNotNull("No association container wrapper", associationContainerWrapper); + assertTrue("Wrong type of group association property wrapper: "+associationContainerWrapper.getClass(), associationContainerWrapper instanceof AssociationWrapper); + assertEquals("wrong number of items in "+associationContainerWrapper, 1, associationContainerWrapper.getValues().size()); + ReferenceWrapper groupAssociationWrapper = (ReferenceWrapper) associationContainerWrapper.findPropertyWrapper(RESOURCE_DUMMY_ASSOCIATION_GROUP_QNAME); + assertNotNull("No group association property wrapper", groupAssociationWrapper); + List groupAssociationValues = groupAssociationWrapper.getValues(); + assertEquals("wrong number of values in "+groupAssociationWrapper, 1, groupAssociationValues.size()); + ValueWrapper groupAssociationValue = groupAssociationValues.get(0); + PrismReferenceValue groupAssociationValuePVal = (PrismReferenceValue) groupAssociationValue.getValue(); + display("groupAssociationValuePVal", groupAssociationValuePVal); + assertEquals("wrong number of values in "+groupAssociationValue, ValueStatus.NOT_CHANGED, groupAssociationValue.getStatus()); + assertEquals("Wrong group association name", RESOURCE_DUMMY_ASSOCIATION_GROUP_QNAME, groupAssociationWrapper.getItemDefinition().getName()); + assertEquals("Wrong group association value", GROUP_DUMMY_MAPMAKERS_NAME, groupAssociationValuePVal.asReferencable().getTargetName().getOrig()); // PrismContainer groupAssociationValueIdentifiers = groupAssociationValuePVal.findContainer(ShadowAssociationType.F_IDENTIFIERS); // PrismProperty groupAssociationUidProp = groupAssociationValueIdentifiers.findProperty(new QName(null,"uid")); -// PrismAsserts.assertPropertyValue(groupAssociationUidProp, GROUP_DUMMY_MAPMAKERS_NAME); +// PrismAsserts.assertPropertyValue(groupAssociationValuePVal.asReferencable().getTargetName(), GROUP_DUMMY_MAPMAKERS_NAME); } /** @@ -439,7 +442,7 @@ public void test800EditSchemaJackPropReadAllModifySomeUser() throws Exception { // THEN additionalNameWrapper = mainContainerWrapper.findPropertyWrapper(UserType.F_ADDITIONAL_NAME); - assertEquals("Wrong additionalName visible", Boolean.FALSE, (Boolean)additionalNameWrapper.isVisible()); // not visible, because it is not allowed + assertEquals("Wrong additionalName visible", Boolean.TRUE, (Boolean)additionalNameWrapper.isVisible()); // visible, because show empty } From 3a6bfad5ee52c896be7690c2b8681141ba63e16a Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Wed, 29 Nov 2017 17:01:54 +0100 Subject: [PATCH 11/18] Tests for inducements+filters (MID-3879) --- .../midpoint/schema/TestParseMisc.java | 114 ++++++++++++++++++ .../src/test/resources/misc/role-filters.xml | 42 +++++++ infra/schema/testng-unit.xml | 1 + .../midpoint/test/util/MidPointAsserts.java | 19 +++ .../midpoint/model/intest/TestMisc.java | 35 ++++++ .../resources/misc/role-import-filters.xml | 42 +++++++ .../test/AbstractModelIntegrationTest.java | 4 + 7 files changed, 257 insertions(+) create mode 100644 infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseMisc.java create mode 100644 infra/schema/src/test/resources/misc/role-filters.xml create mode 100644 model/model-intest/src/test/resources/misc/role-import-filters.xml diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseMisc.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseMisc.java new file mode 100644 index 00000000000..58781932ea2 --- /dev/null +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestParseMisc.java @@ -0,0 +1,114 @@ +/* + * Copyright (c) 2010-2017 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.evolveum.midpoint.schema; + +import static org.testng.AssertJUnit.assertEquals; +import static org.testng.AssertJUnit.assertNotNull; + +import java.io.File; +import java.io.IOException; +import java.util.List; + +import javax.xml.namespace.QName; + +import org.testng.annotations.BeforeSuite; +import org.testng.annotations.Test; +import org.xml.sax.SAXException; + +import com.evolveum.midpoint.prism.PrismContainer; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.prism.PrismObjectDefinition; +import com.evolveum.midpoint.prism.util.PrismAsserts; +import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.constants.MidPointConstants; +import com.evolveum.midpoint.schema.util.SchemaDebugUtil; +import com.evolveum.midpoint.util.PrettyPrinter; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; + +/** + * @author semancik + * + */ +public class TestParseMisc { + + public static final File TEST_DIR = new File("src/test/resources/misc"); + + protected static final File ROLE_FILTERS_FILE = new File(TEST_DIR, "role-filters.xml"); + protected static final String ROLE_FILTERS_OID = "aad19b9a-d511-11e7-8bf7-cfecde275e59"; + + @BeforeSuite + public void setup() throws SchemaException, SAXException, IOException { + PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); + PrismTestUtil.resetPrismContext(MidPointPrismContextFactory.FACTORY); + SchemaDebugUtil.initialize(); // Make sure the pretty printer is activated + } + + + @Test + public void testParseRoleFilters() throws Exception { + System.out.println("\n\n===[ testParseRoleFilters ]===\n"); + + // GIVEN + PrismContext prismContext = PrismTestUtil.getPrismContext(); + + // WHEN + PrismObject object = prismContext.parseObject(ROLE_FILTERS_FILE); + + // THEN + System.out.println("Parsed object:"); + System.out.println(object.debugDump()); + + assertEquals("Wrong oid", ROLE_FILTERS_OID, object.getOid()); + PrismObjectDefinition objectDefinition = object.getDefinition(); + assertNotNull("No object definition", objectDefinition); + QName elementName = new QName(SchemaConstantsGenerated.NS_COMMON, "role"); + PrismAsserts.assertObjectDefinition(objectDefinition, elementName, + RoleType.COMPLEX_TYPE, RoleType.class); + assertEquals("Wrong class", RoleType.class, object.getCompileTimeClass()); + assertEquals("Wrong object item name", elementName, object.getElementName()); + RoleType objectType = object.asObjectable(); + assertNotNull("asObjectable resulted in null", objectType); + + assertPropertyValue(object, "name", PrismTestUtil.createPolyString("Role with import filters")); + assertPropertyDefinition(object, "name", PolyStringType.COMPLEX_TYPE, 0, 1); + + List inducements = objectType.getInducement(); + assertEquals("Wrong number of inducements", 2, inducements.size()); + } + + + private void assertPropertyDefinition(PrismContainer container, String propName, QName xsdType, int minOccurs, + int maxOccurs) { + QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); + PrismAsserts.assertPropertyDefinition(container, propQName, xsdType, minOccurs, maxOccurs); + } + + public static void assertPropertyValue(PrismContainer container, String propName, Object propValue) { + QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); + PrismAsserts.assertPropertyValue(container, propQName, propValue); + } + + public static void assertPropertyValues(PrismContainer container, String propName, T... expectedValues) { + QName propQName = new QName(SchemaConstantsGenerated.NS_COMMON, propName); + PrismAsserts.assertPropertyValue(container, propQName, expectedValues); + } + + +} diff --git a/infra/schema/src/test/resources/misc/role-filters.xml b/infra/schema/src/test/resources/misc/role-filters.xml new file mode 100644 index 00000000000..80bd0a4f0b9 --- /dev/null +++ b/infra/schema/src/test/resources/misc/role-filters.xml @@ -0,0 +1,42 @@ + + + Role with import filters + Role with strange filters (MID-3879) + + + + + name + Pirate + + + + + + + + + name + Sailor + + + + + diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index b71929eab98..375cbe556d4 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -50,6 +50,7 @@ + diff --git a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/MidPointAsserts.java b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/MidPointAsserts.java index f15e99c3c67..0a4c2f901fc 100644 --- a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/MidPointAsserts.java +++ b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/MidPointAsserts.java @@ -81,6 +81,22 @@ public static void assertAssigned(PrismObject focus, String } AssertJUnit.fail(focus + " does not have assigned "+refType.getLocalPart()+" "+targetOid+ ", relation "+relation); } + + public static AssignmentType assertInduced(PrismObject user, String targetOid, QName refType) { + R userType = user.asObjectable(); + for (AssignmentType inducementType: userType.getInducement()) { + ObjectReferenceType targetRef = inducementType.getTargetRef(); + if (targetRef != null) { + if (refType.equals(targetRef.getType())) { + if (targetOid.equals(targetRef.getOid())) { + return inducementType; + } + } + } + } + AssertJUnit.fail(user + " does not have assigned "+refType.getLocalPart()+" "+targetOid); + return null; // not reachable + } public static void assertNotAssigned(PrismObject user, String targetOid, QName refType) { F userType = user.asObjectable(); @@ -162,6 +178,9 @@ public static void assertAssignedTargets(PrismObject us PrismAsserts.assertSets("Wrong "+typeDesc+" in "+user, haveTagetOids, expectedTargetOids); } + public static AssignmentType assertInducedRole(PrismObject user, String roleOid) { + return assertInduced(user, roleOid, RoleType.COMPLEX_TYPE); + } private static List getAssignedOids(PrismObject user, QName type) { F userType = user.asObjectable(); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java index acd842e308c..79132983ef1 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestMisc.java @@ -20,6 +20,7 @@ import static org.testng.AssertJUnit.assertEquals; import static com.evolveum.midpoint.test.IntegrationTestTools.display; +import java.io.File; import java.nio.file.Files; import java.nio.file.Paths; import java.util.List; @@ -48,6 +49,7 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.util.TestUtil; import com.evolveum.midpoint.util.DOMUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** @@ -57,6 +59,11 @@ @ContextConfiguration(locations = {"classpath:ctx-model-intest-test-main.xml"}) @DirtiesContext(classMode = ClassMode.AFTER_CLASS) public class TestMisc extends AbstractInitializedModelIntegrationTest { + + public static final File TEST_DIR = new File("src/test/resources/misc"); + + protected static final File ROLE_IMPORT_FILTERS_FILE = new File(TEST_DIR, "role-import-filters.xml"); + protected static final String ROLE_IMPORT_FILTERS_OID = "aad19b9a-d511-11e7-8bf7-cfecde275e59"; public static final byte[] KEY = { 0x01, 0x02, 0x03, 0x04, 0x05 }; @@ -259,5 +266,33 @@ public void test312UpdateBinaryIdClean() throws Exception { display("User after", userAfter); PrismAsserts.assertPropertyValue(userAfter, getExtensionPath(PIRACY_BINARY_ID), KEY); } + + /** + * MID-3879 + */ + @Test + public void test400ImportRoleWithFilters() throws Exception { + final String TEST_NAME = "test400ImportRoleWithFilters"; + displayTestTitle(TEST_NAME); + + // GIVEN + Task task = createTask(TEST_NAME); + OperationResult result = task.getResult(); + + // WHEN + displayWhen(TEST_NAME); + modelService.importObjectsFromFile(ROLE_IMPORT_FILTERS_FILE, null, task, result); + + // THEN + displayThen(TEST_NAME); + assertSuccess(result); + + PrismObject roleAfter = getRole(ROLE_IMPORT_FILTERS_OID); + display("Role after", roleAfter); + + assertInducedRole(roleAfter, ROLE_PIRATE_OID); + assertInducedRole(roleAfter, ROLE_SAILOR_OID); + assertInducements(roleAfter, 2); + } } diff --git a/model/model-intest/src/test/resources/misc/role-import-filters.xml b/model/model-intest/src/test/resources/misc/role-import-filters.xml new file mode 100644 index 00000000000..80bd0a4f0b9 --- /dev/null +++ b/model/model-intest/src/test/resources/misc/role-import-filters.xml @@ -0,0 +1,42 @@ + + + Role with import filters + Role with strange filters (MID-3879) + + + + + name + Pirate + + + + + + + + + name + Sailor + + + + + diff --git a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java index c91f167da85..16e0944b1c9 100644 --- a/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java +++ b/model/model-test/src/main/java/com/evolveum/midpoint/model/test/AbstractModelIntegrationTest.java @@ -1832,6 +1832,10 @@ protected static void assertAssignedRoles(PrismObject u protected static void assertAssignedRoles(PrismObject user, Collection roleOids) { MidPointAsserts.assertAssignedRoles(user, roleOids); } + + protected AssignmentType assertInducedRole(PrismObject role, String roleOid) { + return MidPointAsserts.assertInducedRole(role, roleOid); + } protected void assignDeputy(String userDeputyOid, String userTargetOid, Task task, OperationResult result) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, ObjectAlreadyExistsException, PolicyViolationException, SecurityViolationException { assignDeputy(userDeputyOid, userTargetOid, null, task, result); From c49205d99a4cea6b3fd815b8f8570c1324ed194d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Wed, 29 Nov 2017 17:11:55 +0100 Subject: [PATCH 12/18] MID-3879/MID-4291: comparing reference values with filters --- .../midpoint/prism/PrismReferenceValue.java | 16 +++++++++++++++- .../evolveum/midpoint/schema/TestDiffEquals.java | 2 +- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java index fd6fcfc28e9..9fdf5b507d0 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismReferenceValue.java @@ -409,7 +409,8 @@ public boolean equalsComplex(PrismReferenceValue other, boolean ignoreMetadata, } else if (!this.getOid().equals(other.getOid())) return false; // Special handling: if both oids are null we need to compare embedded objects - if (this.oid == null && other.oid == null) { + boolean bothOidsNull = this.oid == null && other.oid == null; + if (bothOidsNull) { if (this.object != null || other.object != null) { if (this.object == null || other.object == null) { // one is null the other is not @@ -426,9 +427,22 @@ public boolean equalsComplex(PrismReferenceValue other, boolean ignoreMetadata, if (!relationsEquivalent(relation, other.relation, isLiteral)) { return false; } + if ((isLiteral || bothOidsNull) && !filtersEquivalent(filter, other.filter)) { + return false; + } return true; } + private boolean filtersEquivalent(SearchFilterType filter1, SearchFilterType filter2) { + if (filter1 == null && filter2 == null) { + return true; + } else if (filter1 == null || filter2 == null) { + return false; + } else { + return filter1.equals(filter2); + } + } + private boolean relationsEquivalent(QName r1, QName r2, boolean isLiteral) { return QNameUtil.match(normalizedRelation(r1, isLiteral), normalizedRelation(r2, isLiteral)); } diff --git a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java index f2105c6efa9..2ddc4b4fe2d 100644 --- a/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java +++ b/infra/schema/src/test/java/com/evolveum/midpoint/schema/TestDiffEquals.java @@ -448,7 +448,7 @@ public void testTriggerCollectionsEqual() throws Exception { assertEquals("Wrong comparison B-C", false, PolicyRuleTypeUtil.triggerCollectionsEqual(triggerListB, triggerListC)); } - @Test(enabled = false) + @Test public void diffRoles() throws Exception { PrismObject role1 = PrismTestUtil.parseObject(ROLE_1); PrismObject role2 = PrismTestUtil.parseObject(ROLE_2); From 1d22f92caf6954606367df9383726d57e8a14bb9 Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Wed, 29 Nov 2017 17:28:20 +0100 Subject: [PATCH 13/18] MID-4157 MID-4158 focus editors fixed, when accessed through org. unit tree page --- .../midpoint/gui/api/page/PageBase.java | 4 +- .../gui/api/util/WebComponentUtil.java | 10 ++-- .../assignment/RoleCatalogItemButton.java | 6 +-- .../web/page/admin/PageAdminAbstractRole.java | 5 +- .../web/page/admin/PageAdminFocus.java | 4 +- .../page/admin/PageAdminObjectDetails.java | 36 +++++++++----- .../web/page/admin/roles/PageRole.java | 16 +++--- .../web/page/admin/services/PageService.java | 15 +++--- .../web/page/admin/users/PageOrgUnit.java | 8 ++- .../web/page/admin/users/PageUser.java | 49 ++++++++++--------- .../component/AbstractRoleMemberPanel.java | 2 +- .../admin/users/component/TreeTablePanel.java | 2 +- 12 files changed, 88 insertions(+), 69 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java index a74cea87858..64be8647672 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/page/PageBase.java @@ -1718,7 +1718,7 @@ public boolean isVisible() { if (getPage() instanceof PageAdminFocus) { PageAdminFocus page = (PageAdminFocus) getPage(); - return page.isOidParameterExists() || page.isObjectAlreadyLoaded; + return page.isOidParameterExists() || page.isEditingFocus(); } else if (getPage() instanceof PageResourceWizard) { PageResourceWizard page = (PageResourceWizard) getPage(); return !page.isNewResource(); @@ -1746,7 +1746,7 @@ protected boolean isMenuActive() { if (PageBase.this.getPage() instanceof PageAdminFocus) { PageAdminFocus page = (PageAdminFocus) PageBase.this.getPage(); - return !page.isOidParameterExists() && !page.isObjectAlreadyLoaded; + return !page.isOidParameterExists() && !page.isEditingFocus(); } else if (PageBase.this.getPage() instanceof PageResourceWizard) { PageResourceWizard page = (PageResourceWizard) PageBase.this.getPage(); return page.isNewResource(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java index e948fe9d5bf..a79dc175a09 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/util/WebComponentUtil.java @@ -1858,8 +1858,12 @@ public static void dispatchToObjectDetailsPage(ObjectReferenceType objectRef, Co dispatchToObjectDetailsPage(targetClass, objectRef.getOid(), component, failIfUnsupported); } - // shows the actual object that is passed via parameter (not its state in repository) public static void dispatchToObjectDetailsPage(PrismObject obj, Component component) { + dispatchToObjectDetailsPage(obj, false, component); + } + + // shows the actual object that is passed via parameter (not its state in repository) + public static void dispatchToObjectDetailsPage(PrismObject obj, boolean isNewObject, Component component) { Class newObjectPageClass = getObjectDetailsPage(obj.getCompileTimeClass()); if (newObjectPageClass == null) { throw new IllegalArgumentException("Cannot determine details page for "+obj.getCompileTimeClass()); @@ -1867,7 +1871,7 @@ public static void dispatchToObjectDetailsPage(PrismObject obj, Component compon Constructor constructor; try { - constructor = newObjectPageClass.getConstructor(PrismObject.class); + constructor = newObjectPageClass.getConstructor(PrismObject.class, boolean.class); } catch (NoSuchMethodException | SecurityException e) { throw new SystemException("Unable to locate constructor (PrismObject) in " + newObjectPageClass @@ -1876,7 +1880,7 @@ public static void dispatchToObjectDetailsPage(PrismObject obj, Component compon PageBase page; try { - page = (PageBase) constructor.newInstance(obj); + page = (PageBase) constructor.newInstance(obj, isNewObject); } catch (InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) { throw new SystemException("Error instantiating " + newObjectPageClass + ": " + e.getMessage(), e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java index 4d9e6439b74..366bae21937 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/RoleCatalogItemButton.java @@ -275,15 +275,15 @@ private void targetObjectDetailsPerformed(AssignmentEditorDto assignment, AjaxRe if (AssignmentEditorDtoType.ORG_UNIT.equals(assignment.getType())){ PrismObject object = WebModelServiceUtils.loadObject(OrgType.class, assignment.getTargetRef().getOid(), getPageBase(), task, result); - getPageBase().navigateToNext(new PageOrgUnit(object, true)); + getPageBase().navigateToNext(new PageOrgUnit(object, false,true)); } else if (AssignmentEditorDtoType.ROLE.equals(assignment.getType())){ PrismObject object = WebModelServiceUtils.loadObject(RoleType.class, assignment.getTargetRef().getOid(), getPageBase(), task, result); - getPageBase().navigateToNext(new PageRole(object, true)); + getPageBase().navigateToNext(new PageRole(object, false, true)); } else if (AssignmentEditorDtoType.SERVICE.equals(assignment.getType())){ PrismObject object = WebModelServiceUtils.loadObject(ServiceType.class, assignment.getTargetRef().getOid(), getPageBase(), task, result); - getPageBase().navigateToNext(new PageService(object, true)); + getPageBase().navigateToNext(new PageService(object, false,true)); } } else { plusIconClicked = false; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminAbstractRole.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminAbstractRole.java index 8565a3512bd..4cbf8c7858a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminAbstractRole.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminAbstractRole.java @@ -46,14 +46,13 @@ protected void prepareObjectDeltaForModify(ObjectDelta focusDelta) throws Sch .findContainerDefinition(AbstractRoleType.F_INDUCEMENT); } - @Override protected void prepareObjectForAdd(PrismObject focus) throws SchemaException { super.prepareObjectForAdd(focus); } @Override - protected void initializeModel(final PrismObject objectToEdit, boolean isReadonly) { - super.initializeModel(objectToEdit, isReadonly); + protected void initializeModel(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { + super.initializeModel(objectToEdit, isNewObject, isReadonly); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java index 8497acd7c55..472402c669e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/PageAdminFocus.java @@ -86,8 +86,8 @@ public abstract class PageAdminFocus extends PageAdminObjec @Override - protected void initializeModel(final PrismObject objectToEdit, boolean isReadonly) { - super.initializeModel(objectToEdit, isReadonly); + protected void initializeModel(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { + super.initializeModel(objectToEdit, isNewObject, isReadonly); projectionModel = new LoadableModel>>(false) { private static final long serialVersionUID = 1L; 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 f2dd0bf528e..d5cdfd44e8a 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 @@ -102,10 +102,15 @@ public abstract class PageAdminObjectDetails extends PageA private AbstractObjectMainPanel mainPanel; private boolean saveOnConfigure; // ugly hack - whether to invoke 'Save' when returning to this page - public boolean isObjectAlreadyLoaded = false; //before we got isOidParameterExists status depending only on oid parameter existence - //we should set isEdidintFocus=true not only when oid parameter exists but also + + private boolean editingFocus = false; //before we got isOidParameterExists status depending only on oid parameter existence + //we should set editingFocus=true not only when oid parameter exists but also //when object is given as a constructor parameter + public boolean isEditingFocus() { + return editingFocus; + } + @Override protected void createBreadcrumb() { createInstanceBreadcrumb(); @@ -133,7 +138,7 @@ protected IModel createPageTitleModel() { @Override protected String load() { - if (!isOidParameterExists() && !isObjectAlreadyLoaded) { + if (!isOidParameterExists() && !editingFocus) { String key = "PageAdminObjectDetails.title.new" + getCompileTimeClass().getSimpleName(); return createStringResource(key).getObject(); } @@ -190,18 +195,23 @@ protected void reviveModels() throws SchemaException { public void initialize(final PrismObject objectToEdit) { - initialize(objectToEdit, false); + boolean isNewObject = objectToEdit == null; + + initialize(objectToEdit, isNewObject, false); } - public void initialize(final PrismObject objectToEdit, boolean isReadonly) { - initializeModel(objectToEdit, isReadonly); + public void initialize(final PrismObject objectToEdit, boolean isNewObject) { + initialize(objectToEdit, isNewObject, false); + } + + public void initialize(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { + initializeModel(objectToEdit, isNewObject, isReadonly); initLayout(); } - protected void initializeModel(final PrismObject objectToEdit, boolean isReadonly) { - if (objectToEdit != null){ - isObjectAlreadyLoaded = true; - } + protected void initializeModel(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { + editingFocus = !isNewObject; + objectModel = new LoadableModel>(false) { private static final long serialVersionUID = 1L; @@ -256,7 +266,7 @@ protected void setSummaryPanelVisibility(FocusSummaryPanel summaryPanel){ @Override public boolean isVisible() { - return isOidParameterExists() || isObjectAlreadyLoaded; + return isOidParameterExists() || editingFocus; } }); } @@ -331,7 +341,7 @@ protected ObjectWrapper loadObjectWrapper(PrismObject objectToEdit, boolea throw new RestartResponseException(getRestartResponsePage()); } - ContainerStatus status = isOidParameterExists() || isObjectAlreadyLoaded ? ContainerStatus.MODIFYING : ContainerStatus.ADDING; + ContainerStatus status = isOidParameterExists() || editingFocus ? ContainerStatus.MODIFYING : ContainerStatus.ADDING; ObjectWrapper wrapper; ObjectWrapperFactory owf = new ObjectWrapperFactory(this); try { @@ -347,7 +357,7 @@ protected ObjectWrapper loadObjectWrapper(PrismObject objectToEdit, boolea loadParentOrgs(wrapper, task, result); - wrapper.setShowEmpty(!isOidParameterExists() && !isObjectAlreadyLoaded); + wrapper.setShowEmpty(!isOidParameterExists() && !editingFocus); wrapper.setReadonly(isReadonly); if (LOGGER.isTraceEnabled()) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java index 9e4e6992f8d..bcf2da91a63 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/PageRole.java @@ -15,14 +15,8 @@ */ package com.evolveum.midpoint.web.page.admin.roles; -import org.apache.wicket.request.mapper.parameter.PageParameters; - import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.delta.ContainerDelta; -import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.security.api.AuthorizationConstants; -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.web.application.AuthorizationAction; @@ -34,8 +28,8 @@ import com.evolveum.midpoint.web.page.admin.PageAdminAbstractRole; import com.evolveum.midpoint.web.page.admin.roles.component.RoleSummaryPanel; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; -import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintsType; import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; +import org.apache.wicket.request.mapper.parameter.PageParameters; /** * @author shood @@ -61,8 +55,12 @@ public PageRole(PrismObject roleToEdit) { initialize(roleToEdit); } - public PageRole(PrismObject roleToEdit, boolean isReadonly) { - initialize(roleToEdit, isReadonly); + public PageRole(final PrismObject unitToEdit, boolean isNewObject) { + initialize(unitToEdit, isNewObject); + } + + public PageRole(PrismObject roleToEdit, boolean isNewObject, boolean isReadonly) { + initialize(roleToEdit, isNewObject, isReadonly); } public PageRole(PageParameters parameters) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageService.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageService.java index 46287e190ad..0d8f06ede3b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageService.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/services/PageService.java @@ -15,13 +15,8 @@ */ package com.evolveum.midpoint.web.page.admin.services; -import org.apache.wicket.model.Model; -import org.apache.wicket.request.mapper.parameter.PageParameters; - import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.AuthorizationAction; import com.evolveum.midpoint.web.application.PageDescriptor; import com.evolveum.midpoint.web.component.FocusSummaryPanel; @@ -34,6 +29,8 @@ import com.evolveum.midpoint.web.page.admin.users.component.ServiceSummaryPanel; import com.evolveum.midpoint.web.util.OnePageParameterEncoder; import com.evolveum.midpoint.xml.ns._public.common.common_3.ServiceType; +import org.apache.wicket.model.Model; +import org.apache.wicket.request.mapper.parameter.PageParameters; @PageDescriptor(url = "/admin/service", encoder = OnePageParameterEncoder.class, action = { @AuthorizationAction(actionUri = PageAdminServices.AUTH_SERVICES_ALL, label = PageAdminServices.AUTH_SERVICES_ALL_LABEL, description = PageAdminServices.AUTH_SERVICES_ALL_DESCRIPTION), @@ -50,8 +47,12 @@ public PageService(final PrismObject unitToEdit) { initialize(unitToEdit); } - public PageService(final PrismObject unitToEdit, boolean isReadonly) { - initialize(unitToEdit, isReadonly); + public PageService(final PrismObject unitToEdit, boolean isNewObject) { + initialize(unitToEdit, isNewObject); + } + + public PageService(final PrismObject unitToEdit, boolean isNewObject, boolean isReadonly) { + initialize(unitToEdit, isNewObject, isReadonly); } public PageService(PageParameters parameters) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java index dc5d7b163e8..ca201d3a862 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageOrgUnit.java @@ -53,8 +53,12 @@ public PageOrgUnit(final PrismObject unitToEdit) { initialize(unitToEdit); } - public PageOrgUnit(final PrismObject unitToEdit, boolean isReadonly) { - initialize(unitToEdit, isReadonly); + public PageOrgUnit(final PrismObject unitToEdit, boolean isNewObject) { + initialize(unitToEdit, isNewObject); + } + + public PageOrgUnit(final PrismObject unitToEdit, boolean isNewObject, boolean isReadonly) { + initialize(unitToEdit, isNewObject, isReadonly); } public PageOrgUnit(PageParameters parameters) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java index 972d3b2cc15..5051c9bc7d8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/PageUser.java @@ -18,36 +18,45 @@ import com.evolveum.midpoint.gui.api.ComponentConstants; import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; import com.evolveum.midpoint.gui.api.component.tabs.PanelTab; -import com.evolveum.midpoint.gui.api.model.CountableLoadableModel; import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.FocusTabVisibleBehavior; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.model.api.ModelAuthorizationAction; import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; -import com.evolveum.midpoint.web.component.assignment.AssignmentDto; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.application.AuthorizationAction; +import com.evolveum.midpoint.web.application.PageDescriptor; +import com.evolveum.midpoint.web.component.FocusSummaryPanel; import com.evolveum.midpoint.web.component.assignment.AssignmentEditorDto; import com.evolveum.midpoint.web.component.assignment.AssignmentTablePanel; import com.evolveum.midpoint.web.component.assignment.DelegationEditorPanel; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItem; +import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; +import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel; import com.evolveum.midpoint.web.component.objectdetails.UserDelegationsTabPanel; -import com.evolveum.midpoint.web.component.prism.ObjectWrapper; +import com.evolveum.midpoint.web.page.admin.PageAdminFocus; import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; import com.evolveum.midpoint.web.page.admin.users.component.AssignmentsPreviewDto; +import com.evolveum.midpoint.web.page.admin.users.component.UserSummaryPanel; import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; -import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import com.evolveum.midpoint.web.util.OnePageParameterEncoder; +import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.apache.commons.lang3.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.tabs.ITab; @@ -56,21 +65,10 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.request.mapper.parameter.PageParameters; -import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.security.api.AuthorizationConstants; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.application.AuthorizationAction; -import com.evolveum.midpoint.web.application.PageDescriptor; -import com.evolveum.midpoint.web.component.FocusSummaryPanel; -import com.evolveum.midpoint.web.component.objectdetails.AbstractObjectMainPanel; -import com.evolveum.midpoint.web.component.objectdetails.FocusConsentTabPanel; -import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel; -import com.evolveum.midpoint.web.page.admin.PageAdminFocus; -import com.evolveum.midpoint.web.page.admin.users.component.UserSummaryPanel; -import com.evolveum.midpoint.web.util.OnePageParameterEncoder; - -import java.util.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; /** * @author lazyman @@ -110,9 +108,14 @@ public PageUser(final PrismObject userToEdit) { initialize(userToEdit); } + public PageUser(final PrismObject unitToEdit, boolean isNewObject) { + initialize(unitToEdit, isNewObject); + } + @Override - protected void initializeModel(final PrismObject objectToEdit, boolean isReadonly) { - super.initializeModel(objectToEdit, isReadonly); + protected void initializeModel(final PrismObject objectToEdit, boolean isNewObject, boolean isReadonly) { + super.initializeModel(objectToEdit, isNewObject, isReadonly); + delegationsModel = new LoadableModel>(false) { @Override protected List load() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java index ab6bb7f7f07..7076afe3f06 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AbstractRoleMemberPanel.java @@ -402,7 +402,7 @@ private void initObjectForAdd(ObjectReferenceType parentOrgRef, QName type, QNam objType.getParentOrgRef().add(parentOrgRef.clone()); } - WebComponentUtil.dispatchToObjectDetailsPage(obj, this); + WebComponentUtil.dispatchToObjectDetailsPage(obj, true, this); } protected void addMembers(final QName relation, AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java index b64ea044971..cbdb960565e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java @@ -296,7 +296,7 @@ private void initObjectForAdd(ObjectReferenceType parentOrgRef, QName type, QNam objType.getParentOrgRef().add(parentOrgRef.clone()); } - WebComponentUtil.dispatchToObjectDetailsPage(obj, this); + WebComponentUtil.dispatchToObjectDetailsPage(obj, true, this); } From 75f588ddf28d98713b0792ded933963d0184271a Mon Sep 17 00:00:00 2001 From: Radovan Semancik Date: Wed, 29 Nov 2017 17:35:49 +0100 Subject: [PATCH 14/18] Fixing test package --- infra/schema/testng-unit.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/infra/schema/testng-unit.xml b/infra/schema/testng-unit.xml index 375cbe556d4..db53703982e 100644 --- a/infra/schema/testng-unit.xml +++ b/infra/schema/testng-unit.xml @@ -50,7 +50,6 @@ - @@ -138,6 +137,7 @@ + From 0c8692e641fc317ccc1e2f3a12656d14d574e09c Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Wed, 29 Nov 2017 17:44:50 +0100 Subject: [PATCH 15/18] choose focus type dialog localization --- .../dialog/ChooseFocusTypeDialogPanel.html | 2 +- .../dialog/ChooseFocusTypeDialogPanel.java | 9 +++- .../component/input/QNameChoiceRenderer.java | 1 + .../input/QNameObjectTypeChoiceRenderer.java | 54 +++++++++++++++++++ 4 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/QNameObjectTypeChoiceRenderer.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ChooseFocusTypeDialogPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ChooseFocusTypeDialogPanel.html index 78417c9ed1a..2524f68bd8d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ChooseFocusTypeDialogPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/dialog/ChooseFocusTypeDialogPanel.html @@ -16,7 +16,7 @@ --> -
+