From b39c93a9a58ada11587c964f133d1e9e4539a57d Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 10 Sep 2018 11:44:14 +0200 Subject: [PATCH 01/12] Add relations configuration support (MID-3581) Relations are now managed by the relationRegistry component. Please do not use hardcoded SchemaConstants.ORG_xxxx names any more. 1. When a relation name is needed, use getDefaultRelationFor method. 2. When testing relation kind use isOfKind method (or isXXX methods). 3. When querying for a specific relation kind, use getAllRelationsFor. (All those methods are of RelationRegistry interface.) --- .../gui/api/component/DisplayNamePanel.java | 3 +- .../api/component/TypedAssignablePanel.java | 2 +- .../midpoint/gui/api/page/PageBase.java | 5 + .../gui/api/util/WebComponentUtil.java | 150 +++++--- .../AbstractAssignmentListPanel.java | 5 +- .../AbstractRoleAssignmentPanel.java | 67 ++-- .../component/assignment/AssignmentDto.java | 110 ------ .../assignment/AssignmentEditorDto.java | 29 +- .../assignment/AssignmentEditorPanel.java | 66 ++-- .../assignment/AssignmentTablePanel.java | 2 +- .../component/assignment/AssignmentsUtil.java | 9 +- .../assignment/RoleCatalogItemButton.java | 4 +- .../UserDelegationsTabPanel.java | 4 +- .../web/component/search/SearchFactory.java | 12 +- .../web/page/admin/PageAdminFocus.java | 2 +- .../web/page/admin/users/PageUser.java | 4 +- .../users/component/AssignmentInfoDto.java | 9 +- .../admin/users/component/TreeTablePanel.java | 12 +- .../users/component/UserSummaryPanel.java | 8 +- .../self/AbstractShoppingCartTabPanel.java | 4 +- .../web/security/MidPointApplication.java | 7 + .../web/util/ObjectTypeGuiDescriptor.java | 27 -- .../web/AbstractGuiIntegrationTest.java | 7 +- .../common/ResourceObjectPattern.java | 10 +- .../refinery/RelationRegistryDummyImpl.java | 132 +++++++ .../common/refinery/TestRefinedSchema.java | 7 +- .../evolveum/midpoint/prism/PrismContext.java | 13 + .../midpoint/prism/PrismContextImpl.java | 26 ++ .../prism/query/builder/R_AtomicFilter.java | 12 +- .../prism/query/builder/S_ConditionEntry.java | 2 +- infra/schema/pom.xml | 12 + .../midpoint/schema/RelationRegistry.java | 84 +++++ .../schema/constants/RelationTypes.java | 59 +-- .../schema/constants/SchemaConstants.java | 56 ++- .../relation/IndexedRelationDefinitions.java | 347 ++++++++++++++++++ .../schema/relation/RelationRegistryImpl.java | 201 ++++++++++ .../midpoint/schema/util/FocusTypeUtil.java | 6 +- .../midpoint/schema/util/MiscSchemaUtil.java | 9 +- .../midpoint/schema/util/ObjectTypeUtil.java | 151 ++++---- .../xml/ns/public/common/common-core-3.xsd | 157 +++++++- infra/test-util/pom.xml | 8 + .../midpoint/test/util/MidPointAsserts.java | 11 +- .../test/util/TestSpringContextHolder.java | 64 ++++ .../com/evolveum/midpoint/util/QNameUtil.java | 8 +- .../impl/AccCertReviewersHelper.java | 31 +- .../DirectAssignmentCertificationHandler.java | 4 +- .../model/api/ModelInteractionService.java | 2 +- .../api/context/EvaluatedAssignment.java | 4 + .../context/EvaluatedAssignmentTarget.java | 3 +- .../model/api/context/EvaluationOrder.java | 2 +- .../midpoint/model/api/util/DeputyUtils.java | 24 +- .../model/common/SystemObjectCache.java | 79 +--- .../ModelInteractionServiceImpl.java | 17 +- .../SystemConfigurationHandler.java | 3 + .../impl/expr/OrgStructFunctionsImpl.java | 43 ++- .../model/impl/lens/AssignmentEvaluator.java | 46 ++- .../impl/lens/AssignmentPathSegmentImpl.java | 19 +- .../midpoint/model/impl/lens/Clockwork.java | 7 +- .../impl/lens/EvaluatedAssignmentImpl.java | 23 +- .../lens/EvaluatedAssignmentTargetCache.java | 2 +- .../lens/EvaluatedAssignmentTargetImpl.java | 17 +- .../model/impl/lens/EvaluationOrderImpl.java | 48 ++- .../midpoint/model/impl/lens/LensUtil.java | 5 - .../projector/focus/AssignmentProcessor.java | 11 +- ...gnmentModificationConstraintEvaluator.java | 6 +- .../ExclusionConstraintEvaluator.java | 4 +- .../HasAssignmentConstraintEvaluator.java | 4 +- .../ModificationConstraintEvaluator.java | 4 + .../MultiplicityConstraintEvaluator.java | 12 +- .../impl/security/UserProfileServiceImpl.java | 9 +- .../CorrelationConfirmationEvaluator.java | 6 +- .../lens/TestAbstractAssignmentEvaluator.java | 5 + .../impl/lens/TestAssignmentProcessor2.java | 1 + .../model/impl/misc/TestRelationRegistry.java | 85 +++++ ...bstractConfiguredModelIntegrationTest.java | 16 +- .../midpoint/model/intest/TestMisc.java | 2 +- .../model/intest/TestNotifications.java | 6 +- .../model/intest/gensync/TestEditSchema.java | 94 ++--- .../test/AbstractModelIntegrationTest.java | 20 +- .../midpoint/report/impl/ReportFunctions.java | 2 +- .../itemApproval/RelationResolver.java | 3 +- .../impl/processors/BaseChangeProcessor.java | 16 +- .../wf/impl/processors/ChangeProcessor.java | 3 + .../aspect/BasePrimaryChangeAspect.java | 8 +- .../primary/policy/ApprovalSchemaBuilder.java | 9 +- .../policy/AssignmentPolicyAspectPart.java | 2 +- .../policy/ObjectPolicyAspectPart.java | 2 +- .../midpoint/wf/impl/util/MiscDataUtil.java | 11 +- .../wf/impl/policy/AbstractWfTestPolicy.java | 4 + .../AbstractTestAssignmentApproval.java | 2 +- .../impl/ResourceObjectConverter.java | 16 +- .../provisioning/impl/ShadowCache.java | 9 +- .../provisioning/util/ProvisioningUtil.java | 21 +- .../midpoint/repo/sql/BaseSQLRepoTest.java | 2 + .../repo/sql/ObjectDeltaUpdaterTest.java | 23 +- .../repo/sql/QueryInterpreter2Test.java | 18 +- .../resources/ctx-configuration-sql-test.xml | 5 + .../repo/sql/SqlRepositoryServiceImpl.java | 8 +- .../repo/sql/data/RepositoryContext.java | 6 +- .../repo/sql/data/common/RAbstractRole.java | 11 +- .../common/RAccessCertificationCampaign.java | 5 +- .../RAccessCertificationDefinition.java | 3 +- .../midpoint/repo/sql/data/common/RCase.java | 3 +- .../repo/sql/data/common/RConnector.java | 3 +- .../repo/sql/data/common/RConnectorHost.java | 1 + .../midpoint/repo/sql/data/common/RFocus.java | 13 +- .../midpoint/repo/sql/data/common/RForm.java | 1 + .../sql/data/common/RFunctionLibrary.java | 1 + .../repo/sql/data/common/RGenericObject.java | 1 + .../repo/sql/data/common/RLookupTable.java | 1 + .../midpoint/repo/sql/data/common/RNode.java | 1 + .../repo/sql/data/common/RObject.java | 14 +- .../sql/data/common/RObjectCollection.java | 1 + .../sql/data/common/RObjectReference.java | 6 +- .../repo/sql/data/common/RObjectTemplate.java | 3 +- .../midpoint/repo/sql/data/common/ROrg.java | 1 + .../repo/sql/data/common/RReport.java | 1 + .../repo/sql/data/common/RReportOutput.java | 3 +- .../repo/sql/data/common/RResource.java | 7 +- .../midpoint/repo/sql/data/common/RRole.java | 1 + .../repo/sql/data/common/RSecurityPolicy.java | 1 + .../repo/sql/data/common/RSequence.java | 1 + .../repo/sql/data/common/RService.java | 1 + .../repo/sql/data/common/RShadow.java | 3 +- .../sql/data/common/RSystemConfiguration.java | 1 + .../midpoint/repo/sql/data/common/RTask.java | 13 +- .../midpoint/repo/sql/data/common/RUser.java | 3 +- .../repo/sql/data/common/RValuePolicy.java | 1 + .../data/common/any/RAssignmentExtension.java | 8 +- .../container/RAccessCertificationCase.java | 10 +- .../RAccessCertificationWorkItem.java | 4 +- .../data/common/container/RAssignment.java | 29 +- .../data/common/container/RCaseWorkItem.java | 6 +- .../container/RCaseWorkItemReference.java | 14 +- .../container/RCertWorkItemReference.java | 14 +- .../common/container/RContainerReference.java | 4 - .../common/container/ROperationExecution.java | 24 +- .../sql/data/common/container/RReference.java | 5 +- .../sql/data/common/container/RTrigger.java | 27 +- .../sql/data/common/embedded/RActivation.java | 2 +- .../embedded/RAutoassignSpecification.java | 2 +- .../embedded/REmbeddedNamedReference.java | 16 +- .../common/embedded/REmbeddedReference.java | 7 +- .../common/embedded/ROperationalState.java | 2 +- .../sql/data/factory/MetadataFactory.java | 36 +- .../sql/helpers/CertificationCaseHelper.java | 4 +- .../repo/sql/helpers/ObjectDeltaUpdater.java | 32 +- .../repo/sql/helpers/ObjectRetriever.java | 18 +- .../repo/sql/helpers/ObjectUpdater.java | 42 +-- .../sql/helpers/mapper/ActivationMapper.java | 2 +- .../sql/helpers/mapper/AssignmentMapper.java | 2 +- .../mapper/AutoassignSpecificationMapper.java | 2 +- .../mapper/EmbeddedObjectReferenceMapper.java | 4 +- .../sql/helpers/mapper/MetadataMapper.java | 2 +- .../helpers/mapper/ObjectReferenceMapper.java | 4 +- .../mapper/OperationExecutionMapper.java | 2 +- .../mapper/OperationalStateMapper.java | 2 +- .../sql/helpers/mapper/TriggerMapper.java | 2 +- .../sql/helpers/modify/MapperContext.java | 5 + .../sql/helpers/modify/PrismEntityMapper.java | 13 +- .../sql/query2/InterpretationContext.java | 11 +- .../repo/sql/query2/QueryEngine2.java | 8 +- .../repo/sql/query2/QueryInterpreter2.java | 11 +- .../query2/restriction/OrgRestriction.java | 2 +- .../restriction/ReferenceRestriction.java | 36 +- .../midpoint/repo/sql/util/RUtil.java | 36 +- .../test/AbstractIntegrationTest.java | 2 +- .../ctx-configuration-test-no-repo.xml | 2 + .../main/resources/ctx-configuration-test.xml | 2 + .../enforcer/impl/SecurityEnforcerImpl.java | 21 +- .../src/main/resources/ctx-configuration.xml | 1 + .../quartzimpl/TaskManagerQuartzImpl.java | 13 +- .../quartzimpl/cluster/ClusterManager.java | 4 +- .../story/TestPlentyOfAssignments.java | 2 +- .../notorious/AbstractNotoriousTest.java | 15 +- 175 files changed, 2213 insertions(+), 1161 deletions(-) delete mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java create mode 100644 infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java create mode 100644 infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java create mode 100644 infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestSpringContextHolder.java create mode 100644 model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java index 63d314f58df..05d55ad025a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/DisplayNamePanel.java @@ -163,8 +163,7 @@ private boolean isIdentifierVisible() { // TODO: maybe move relation methods to subclass if we want this panel to be really reusable private boolean isRelationVisible() { - QName relation = getRelation(); - return relation != null && !QNameUtil.match(SchemaConstants.ORG_DEFAULT, relation); + return !WebComponentUtil.isDefaultRelation(getRelation()); } private boolean isKindIntentVisible(IModel kindIntentLabelModel) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java index 367d98f31dd..33fc2f84b1b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/TypedAssignablePanel.java @@ -364,7 +364,7 @@ private QName getSelectedRelation(){ DropDownChoicePanel relationPanel = (DropDownChoicePanel) get(ID_RELATION_CONTAINER).get(ID_RELATION); RelationTypes relation = relationPanel.getModel().getObject(); if (relation == null) { - return SchemaConstants.ORG_DEFAULT; + return WebComponentUtil.getDefaultRelationOrFail(); } return relation.getRelation(); } 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 22fcc05aac5..8369eeacc73 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 @@ -48,6 +48,7 @@ import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; import com.evolveum.midpoint.report.api.ReportManager; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalsConfig; @@ -472,6 +473,10 @@ public PrismContext getPrismContext() { return getMidpointApplication().getPrismContext(); } + public RelationRegistry getRelationRegistry() { + return getMidpointApplication().getRelationRegistry(); + } + public ExpressionFactory getExpressionFactory() { return getMidpointApplication().getExpressionFactory(); } 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 c9ab5ce047e..2303fc3a00b 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 @@ -16,7 +16,6 @@ package com.evolveum.midpoint.gui.api.util; import static com.evolveum.midpoint.gui.api.page.PageBase.createStringResourceStatic; -import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.normalizeRelation; import java.io.PrintWriter; import java.io.StringWriter; @@ -41,8 +40,6 @@ import java.util.stream.Collectors; import java.util.stream.StreamSupport; -import javax.xml.datatype.DatatypeConfigurationException; -import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; @@ -52,13 +49,10 @@ import com.evolveum.midpoint.model.api.ModelExecuteOptions; import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.util.LocalizationUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.*; -import com.evolveum.midpoint.util.exception.CommunicationException; -import com.evolveum.midpoint.util.exception.ObjectNotFoundException; import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb; import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageClass; import com.evolveum.midpoint.web.component.breadcrumbs.BreadcrumbPageInstance; @@ -66,8 +60,6 @@ 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.*; -import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; -import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDeleteDialogDto; import com.evolveum.midpoint.web.util.ObjectTypeGuiDescriptor; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.collections4.CollectionUtils; @@ -136,8 +128,6 @@ import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; -import com.evolveum.midpoint.schema.DeltaConvertor; -import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -203,7 +193,11 @@ public final class WebComponentUtil { private static final String KEY_BOOLEAN_TRUE = "Boolean.TRUE"; private static final String KEY_BOOLEAN_FALSE = "Boolean.FALSE"; - private static DatatypeFactory df = null; + /** + * To be used only for tests when there's no MidpointApplication. + * (Quite a hack. Replace eventually by a more serious solution.) + */ + private static RelationRegistry staticallyProvidedRelationRegistry; private static Map, Class> objectDetailsPageMap; @@ -479,14 +473,6 @@ public String getChannel() { } } - static { - try { - df = DatatypeFactory.newInstance(); - } catch (DatatypeConfigurationException dce) { - throw new IllegalStateException("Exception while obtaining Datatype Factory instance", dce); - } - } - public static DateValidator getRangeValidator(Form form, ItemPath path) { DateValidator validator = null; List validators = form.getBehaviors(DateValidator.class); @@ -1111,8 +1097,8 @@ public static String getDisplayName(PrismContainerValu if (prismContainerValue.canRepresent(AssignmentType.class)) { AssignmentType assignmentType = (AssignmentType) prismContainerValue.asContainerable(); if (assignmentType.getTargetRef() != null){ - ObjectReferenceType assignemntTargetRef = assignmentType.getTargetRef(); - return getName(assignemntTargetRef) + " - " + normalizeRelation(assignemntTargetRef.getRelation()).getLocalPart(); + ObjectReferenceType assignmentTargetRef = assignmentType.getTargetRef(); + return getName(assignmentTargetRef) + " - " + normalizeRelation(assignmentTargetRef.getRelation()).getLocalPart(); } else { return "AssignmentTypeDetailsPanel.containerTitle"; } @@ -1190,6 +1176,10 @@ public static String getDisplayName(PrismContainerValu return "ContainerPanel.containerProperties"; } + public static QName normalizeRelation(QName relation) { + return getRelationRegistry().normalizeRelation(relation); + } + public static String getDisplayNameOrName(PrismObject object) { if (object == null) { return null; @@ -1665,6 +1655,79 @@ public static String getBoxThinCssClasses(QName objectTyp } } + // can this implementation be made more efficient? [pm] + @SuppressWarnings("WeakerAccess") + public static boolean isOfKind(QName relation, RelationKindType kind) { + return getRelationRegistry().isOfKind(relation, kind); + } + + protected static RelationRegistry getRelationRegistry() { + if (staticallyProvidedRelationRegistry != null) { + return staticallyProvidedRelationRegistry; + } else { + return MidPointApplication.get().getRelationRegistry(); + } + } + + public static boolean isManagerRelation(QName relation) { + return isOfKind(relation, RelationKindType.MANAGER); + } + + public static boolean isDefaultRelation(QName relation) { + return getRelationRegistry().isDefault(relation); + } + + @SuppressWarnings("WeakerAccess") + public static QName getDefaultRelation() { + return getRelationRegistry().getDefaultRelation(); + } + + @NotNull + public static QName getDefaultRelationOrFail() { + QName relation = getDefaultRelation(); + if (relation != null) { + return relation; + } else { + throw new IllegalStateException("No default relation is defined"); + } + } + + @SuppressWarnings("WeakerAccess") + @Nullable + public static QName getDefaultRelationFor(RelationKindType kind) { + return getRelationRegistry().getDefaultRelationFor(kind); + } + + @NotNull + public static QName getDefaultRelationOrFail(RelationKindType kind) { + QName relation = getDefaultRelationFor(kind); + if (relation != null) { + return relation; + } else { + throw new IllegalStateException("No default relation for kind " + kind); + } + } + + @NotNull + public static String getRelationHeaderLabelKey(QName relation) { + String label = getRelationHeaderLabelKeyIfKnown(relation); + if (label != null) { + return label; + } else { + return relation != null ? relation.getLocalPart() : "default"; + } + } + + @Nullable + public static String getRelationHeaderLabelKeyIfKnown(QName relation) { + RelationDefinitionType definition = getRelationRegistry().getRelationDefinition(relation); + if (definition != null && definition.getDisplay() != null && definition.getDisplay().getLabel() != null) { + return definition.getDisplay().getLabel(); + } else { + return null; + } + } + public static String createUserIcon(PrismObject object) { UserType user = object.asObjectable(); @@ -1686,7 +1749,7 @@ public static String createUserIcon(PrismObject object) { boolean isManager = false; for (ObjectReferenceType parentOrgRef : user.getParentOrgRef()) { - if (ObjectTypeUtil.isManagerRelation(parentOrgRef.getRelation())) { + if (isManagerRelation(parentOrgRef.getRelation())) { isManager = true; break; } @@ -2001,7 +2064,7 @@ public static boolean isObjectOrgManager(PrismObject objec List parentOrgRefs = objectType.getParentOrgRef(); for (ObjectReferenceType ref : parentOrgRefs) { - if (ObjectTypeUtil.isManagerRelation(ref.getRelation())) { + if (isManagerRelation(ref.getRelation())) { return true; } } @@ -2516,32 +2579,24 @@ public static ItemVisibility checkShadowActivationAndPasswordVisibility(ItemWrap public static List getCategoryRelationChoices(AreaCategoryType category, ModelServiceLocator pageBase){ List relationsList = new ArrayList<>(); List defList = getRelationDefinitions(pageBase); - if (defList != null) { - defList.forEach(def -> { - if (def.getCategory() != null && def.getCategory().contains(category)) { - relationsList.add(def.getRef()); - } - }); - } + defList.forEach(def -> { + if (def.getCategory() != null && def.getCategory().contains(category)) { + relationsList.add(def.getRef()); + } + }); return relationsList; } public static List getAllRelations(ModelServiceLocator pageBase) { - List allRelationdefinitions = getRelationDefinitions(pageBase); - List allRelationsQName = new ArrayList<>(allRelationdefinitions.size()); - allRelationdefinitions.stream().forEach(relation -> allRelationsQName.add(relation.getRef())); + List allRelationDefinitions = getRelationDefinitions(pageBase); + List allRelationsQName = new ArrayList<>(allRelationDefinitions.size()); + allRelationDefinitions.forEach(relation -> allRelationsQName.add(relation.getRef())); return allRelationsQName; } - public static List getRelationDefinitions(ModelServiceLocator pageBase){ - OperationResult result = new OperationResult("get relation definitions"); - try { - return pageBase.getModelInteractionService().getRelationDefinitions(result); - } catch (ObjectNotFoundException | SchemaException ex){ - result.computeStatus(); - LOGGER.error("Unable to load relation definitions, " + ex.getLocalizedMessage()); - } - return null; + @NotNull + public static List getRelationDefinitions(ModelServiceLocator pageBase) { + return pageBase.getModelInteractionService().getRelationDefinitions(); } public static DropDownChoice createTriStateCombo(String id, IModel model) { @@ -2726,4 +2781,13 @@ private Map prepareExtensionValues(Collection oids) throw }); return menuItems; } + + @SuppressWarnings("unused") + public static RelationRegistry getStaticallyProvidedRelationRegistry() { + return staticallyProvidedRelationRegistry; + } + + public static void setStaticallyProvidedRelationRegistry(RelationRegistry staticallyProvidedRelationRegistry) { + WebComponentUtil.staticallyProvidedRelationRegistry = staticallyProvidedRelationRegistry; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java index d49a9b8ac91..9d4bb2b4b60 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AbstractAssignmentListPanel.java @@ -16,8 +16,8 @@ package com.evolveum.midpoint.web.component.assignment; import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; @@ -28,7 +28,6 @@ import com.evolveum.midpoint.web.page.admin.users.dto.UserDtoStatus; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; import org.apache.wicket.model.AbstractReadOnlyModel; import org.apache.wicket.model.IModel; @@ -138,7 +137,7 @@ protected AssignmentEditorDto createAssignmentFromSelectedObjects(ObjectType obj } if (object instanceof UserType) { AssignmentEditorDto dto = AssignmentEditorDto.createDtoAddFromSelectedObject(object, - SchemaConstants.ORG_DEPUTY, getPageBase()); + WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION), getPageBase()); dto.getTargetRef().setRelation(relation); return dto; } else { 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 db428b9f101..6691412ee13 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 @@ -16,30 +16,37 @@ package com.evolveum.midpoint.web.component.assignment; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import javax.xml.namespace.QName; - import com.evolveum.midpoint.gui.api.component.AssignmentPopup; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.prism.query.ObjectPaging; +import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.RelationTypes; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.web.component.prism.*; +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.component.AjaxButton; +import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; +import com.evolveum.midpoint.web.component.prism.ContainerValueWrapper; +import com.evolveum.midpoint.web.component.prism.ContainerWrapper; +import com.evolveum.midpoint.web.component.prism.PropertyOrReferenceWrapper; +import com.evolveum.midpoint.web.component.prism.ValueWrapper; import com.evolveum.midpoint.web.component.search.SearchFactory; -import com.evolveum.midpoint.web.component.search.SearchItem; import com.evolveum.midpoint.web.component.search.SearchItemDefinition; +import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.web.page.admin.PageAdminFocus; -import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.web.page.admin.users.component.AllAssignmentsPreviewDialog; +import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; +import com.evolveum.midpoint.web.session.UserProfileStorage; +import com.evolveum.midpoint.web.session.UserProfileStorage.TableId; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; - import org.apache.commons.lang.StringUtils; -import org.apache.wicket.MarkupContainer; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; @@ -52,27 +59,11 @@ import org.apache.wicket.model.IModel; import org.apache.wicket.model.Model; -import com.evolveum.midpoint.gui.api.component.TypedAssignablePanel; -import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; -import com.evolveum.midpoint.gui.impl.component.MultivalueContainerListPanelWithDetailsPanel; -import com.evolveum.midpoint.gui.impl.model.PropertyWrapperFromContainerValueWrapperModel; -import com.evolveum.midpoint.prism.path.ItemPath; -import com.evolveum.midpoint.prism.query.ObjectPaging; -import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.builder.QueryBuilder; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.task.api.Task; -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.component.AjaxButton; -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.session.UserProfileStorage; -import com.evolveum.midpoint.web.session.UserProfileStorage.TableId; +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; /** * Created by honchar. @@ -328,8 +319,10 @@ protected int getItemsPerPage() { protected ObjectQuery createObjectQuery() { QName relation = getRelation(); - if (PrismConstants.Q_ANY.equals(relation)){ - return QueryBuilder.queryFor(AssignmentType.class, getParentPage().getPrismContext()) + if (PrismConstants.Q_ANY.equals(relation)) { + Collection delegationRelations = getParentPage().getRelationRegistry() + .getAllRelationsFor(RelationKindType.DELEGATION); + return QueryBuilder.queryFor(AssignmentType.class, getParentPage().getPrismContext()) .block() .not() .item(new ItemPath(AssignmentType.F_CONSTRUCTION, ConstructionType.F_RESOURCE_REF)) @@ -339,7 +332,7 @@ protected ObjectQuery createObjectQuery() { .block() .not() .item(new ItemPath(AssignmentType.F_TARGET_REF)) - .ref(SchemaConstants.ORG_DEPUTY) + .ref(delegationRelations.toArray(new QName[0])) .endBlock() .and() .not() 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 deleted file mode 100644 index bd68c9e6854..00000000000 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentDto.java +++ /dev/null @@ -1,110 +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.component.assignment; - -import java.io.Serializable; -import java.util.Collection; - -import javax.xml.namespace.QName; - -import org.apache.commons.lang.Validate; - -import com.evolveum.midpoint.prism.delta.ItemDelta; -import com.evolveum.midpoint.schema.constants.RelationTypes; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -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; - -public class AssignmentDto extends Selectable implements Comparable, Serializable{ - - private static final long serialVersionUID = 1L; - - private AssignmentType assignment; - private UserDtoStatus status; - private AssignmentType oldAssignment; -// private RelationTypes relationType; - - public static final String F_VALUE = "assignment"; - public static final String F_RELATION_TYPE = "relationType"; - - public AssignmentDto(AssignmentType assignment, UserDtoStatus status) { - this.assignment = assignment; - this.oldAssignment = assignment.clone(); - this.status = status; - } - - public Collection computeAssignmentDelta() { - Collection deltas = oldAssignment.asPrismContainerValue().diff(assignment.asPrismContainerValue()); - return deltas; - } - - public void revertChanges() { - assignment = oldAssignment.clone(); - } - - public QName getRelation() { - - //TODO: what kind of rlation should be returned for the PERSONA CONSTRUCTION? - - if (assignment.getConstruction() != null) { - return SchemaConstants.ORG_DEFAULT; - } - - if (assignment.getTargetRef() == null) { - return null; - } - - return assignment.getTargetRef().getRelation(); - - } - - public RelationTypes getRelationType() { - return RelationTypes.getRelationType(getRelation()); - } - - public void setRelationType(RelationTypes relationType){ - if (assignment.getTargetRef() == null) { - return; - } - - assignment.getTargetRef().setRelation(relationType.getRelation()); - } - - - public AssignmentType getAssignment() { - return assignment; - } - - @Override - public int compareTo(AssignmentDto other) { - Validate.notNull(other, "Can't compare assignment editor dto with null."); - - String name1 = "";//getName() != null ? getName() : ""; - String name2 = "";//other.getName() != null ? other.getName() : ""; - - return String.CASE_INSENSITIVE_ORDER.compare(name1, name2); - } - - public UserDtoStatus getStatus() { - return status; - } - - public void setStatus(UserDtoStatus status) { - this.status = status; - } - -} 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 d30a6555b2b..56a9e62aa8c 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 @@ -24,9 +24,8 @@ import com.evolveum.midpoint.common.refinery.RefinedResourceSchemaImpl; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.path.ItemPath; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.ObjectTypes; -import com.evolveum.midpoint.schema.constants.RelationTypes; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.web.page.admin.users.component.AssignmentInfoDto; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -41,7 +40,6 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; import com.evolveum.midpoint.prism.util.ItemPathUtil; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.SchemaException; @@ -148,7 +146,7 @@ public AssignmentEditorDto(UserDtoStatus status, AssignmentType assignment, Page this.altName = getAlternativeName(assignment); this.attributes = prepareAssignmentAttributes(assignment, pageBase); - this.isOrgUnitManager = determineUserOrgRelation(assignment); + this.isOrgUnitManager = isOrgUnitManager(assignment); this.privilegeLimitationList = getAssignmentPrivilegesList(assignment); } @@ -164,7 +162,7 @@ public static AssignmentEditorDto createDtoAddFromSelectedObject(ObjectType obje PageBase pageBase, UserType delegationOwner) { AssignmentEditorDto dto = createDtoFromObject(object, UserDtoStatus.ADD, relation, pageBase); dto.setDelegationOwner(delegationOwner); - if (SchemaConstants.ORG_DEPUTY.equals(relation)){ + if (pageBase.getRelationRegistry().isDelegation(relation)) { OtherPrivilegesLimitationType limitations = new OtherPrivilegesLimitationType(); WorkItemSelectorType approvalWorkItemSelector = new WorkItemSelectorType(); @@ -245,18 +243,11 @@ private List getAssignmentPrivilegesList(AssignmentType assig } return list; } - private Boolean determineUserOrgRelation(AssignmentType assignment) { - - if (assignment == null || assignment.getTargetRef() == null - || ObjectTypeUtil.isDefaultRelation(assignment.getTargetRef().getRelation())) { - return Boolean.FALSE; - } - - if (ObjectTypeUtil.isManagerRelation(assignment.getTargetRef().getRelation())) { - return Boolean.TRUE; - } - - return Boolean.FALSE; + private boolean isOrgUnitManager(AssignmentType assignment) { + RelationRegistry relationRegistry = pageBase.getRelationRegistry(); + return assignment != null + && assignment.getTargetRef() != null + && relationRegistry.isManager(assignment.getTargetRef().getRelation()); } private List prepareAssignmentAttributes(AssignmentType assignment, PageBase pageBase) { @@ -439,7 +430,9 @@ private String getNameForTargetObject(AssignmentType assignment) { } if (assignment.getTargetRef() != null && assignment.getTargetRef().getRelation() != null) { - sb.append(" - " + RelationTypes.getRelationType(assignment.getTargetRef().getRelation()).getHeaderLabel()); + String relationName = pageBase + .getString(WebComponentUtil.getRelationHeaderLabelKey(assignment.getTargetRef().getRelation())); + sb.append(" - ").append(relationName); } return sb.toString(); 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 9f4ac7f8ab2..dbfdc000776 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 @@ -422,10 +422,13 @@ public String getObject() { } AssignmentEditorDto object = getModel().getObject(); - String propertyKey = RelationTypes.class.getSimpleName() + "." + - (object.getTargetRef() == null || object.getTargetRef().getRelation() == null ? - RelationTypes.MEMBER : RelationTypes.getRelationType(object.getTargetRef().getRelation())); - return createStringResource(propertyKey).getString(); + if (object.getTargetRef() != null) { + QName relation = object.getTargetRef() != null ? object.getTargetRef().getRelation() : null; + String propertyKey = WebComponentUtil.getRelationHeaderLabelKey(relation); + return createStringResource(propertyKey).getString(); + } else { + return ""; + } } }); relationLabel.setOutputMarkupId(true); @@ -986,7 +989,7 @@ private void addRelationDropDown(WebMarkupContainer relationContainer){ QName assignmentRelation = getModelObject().getTargetRef() != null ? getModelObject().getTargetRef().getRelation() : null; RelationDropDownChoicePanel relationDropDown = new RelationDropDownChoicePanel(ID_RELATION, - assignmentRelation != null ? assignmentRelation : SchemaConstants.ORG_DEFAULT, getSupportedRelations(), false); relationDropDown.setEnabled(getModel().getObject().isEditable()); + assignmentRelation != null ? assignmentRelation : WebComponentUtil.getDefaultRelationOrFail(), getSupportedRelations(), false); relationDropDown.setEnabled(getModel().getObject().isEditable()); relationDropDown.add(new VisibleEnableBehaviour() { private static final long serialVersionUID = 1L; @@ -1011,33 +1014,32 @@ private List getSupportedRelations() { } } - - protected IModel getRelationModel(){ - return new IModel() { - private static final long serialVersionUID = 1L; - - @Override - public RelationTypes getObject() { - if (getModelObject().getTargetRef() == null) { - return RelationTypes.MEMBER; - } - return RelationTypes.getRelationType(getModelObject().getTargetRef().getRelation()); - } - - @Override - public void setObject(RelationTypes newValue) { - ObjectReferenceType ref = getModelObject().getTargetRef(); - if (ref != null){ - ref.setRelation(newValue.getRelation()); - } - } - - @Override - public void detach() { - - } - }; - } +// protected IModel getRelationModel() { +// return new IModel() { +// private static final long serialVersionUID = 1L; +// +// @Override +// public RelationTypes getObject() { +// if (getModelObject().getTargetRef() == null) { +// return RelationTypes.MEMBER; +// } +// return RelationTypes.getRelationType(getModelObject().getTargetRef().getRelation()); +// } +// +// @Override +// public void setObject(RelationTypes newValue) { +// ObjectReferenceType ref = getModelObject().getTargetRef(); +// if (ref != null){ +// ref.setRelation(newValue.getRelation()); +// } +// } +// +// @Override +// public void detach() { +// +// } +// }; +// } private PrismObject getTargetObject(AssignmentEditorDto dto) throws ObjectNotFoundException, SchemaException, SecurityViolationException, diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java index 53edf29eb85..7fa426be713 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentTablePanel.java @@ -242,7 +242,7 @@ public void onClick(AjaxRequestTarget target) { protected void assignSelectedOrgPerformed(List selectedOrgs, AjaxRequestTarget target) { // TODO Auto-generated method stub - addSelectedAssignablePerformed(target, (List) selectedOrgs, SchemaConstants.ORG_DEFAULT, + addSelectedAssignablePerformed(target, (List) selectedOrgs, WebComponentUtil.getDefaultRelationOrFail(), getPageBase().getMainPopup().getId()); reloadMainFormButtons(target); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java index 5ba2551b239..cb82ac9309f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/AssignmentsUtil.java @@ -297,12 +297,9 @@ private static void appendRelation(AssignmentType assignment, StringBuilder sb, return; } - RelationDefinitionType relationDef = ObjectTypeUtil.findRelationDefinition( - WebComponentUtil.getRelationDefinitions(pageBase), - assignment.getTargetRef().getRelation()); - if (relationDef != null && relationDef.getDisplay() != null && - !relationDef.getDisplay().getLabel().isEmpty()) { - sb.append(" - " + pageBase.createStringResource(relationDef.getDisplay().getLabel()).getString()); + String labelKey = WebComponentUtil.getRelationHeaderLabelKeyIfKnown(assignment.getTargetRef().getRelation()); + if (StringUtils.isNotEmpty(labelKey)) { + sb.append(" - ").append(pageBase.createStringResource(labelKey).getString()); } } 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 fd3351807ca..c7e3450309f 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 @@ -318,7 +318,7 @@ private void addAssignmentPerformed(AssignmentEditorDto assignment, AjaxRequestT protected void assignmentAddedToShoppingCartPerformed(AjaxRequestTarget target){ } - protected QName getNewAssignmentRelation(){ - return SchemaConstants.ORG_DEFAULT; + protected QName getNewAssignmentRelation() { + return WebComponentUtil.getDefaultRelationOrFail(); } } 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 6df7c812b22..8241d1157f7 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 @@ -23,7 +23,6 @@ import com.evolveum.midpoint.prism.query.InOidFilter; import com.evolveum.midpoint.prism.query.NotFilter; import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; @@ -39,6 +38,7 @@ 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; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.ajax.markup.html.modal.ModalWindow; @@ -192,7 +192,7 @@ protected void addSelectedAssignablePerformed(AjaxRequestTarget target, List)getObjectWrapper().getObject()).asObjectable(), - SchemaConstants.ORG_DEPUTY, getPageBase(), (UserType) object); + WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION), getPageBase(), (UserType) object); dto.setPrivilegeLimitationList(privilegesListModel.getObject()); delegationsModel.getObject().add(dto); } catch (Exception e) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java index 98444188f31..1bb0c3732ce 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFactory.java @@ -17,11 +17,7 @@ package com.evolveum.midpoint.web.component.search; import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; @@ -36,7 +32,6 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.schema.SchemaRegistry; import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.FullTextSearchConfigurationUtil; import com.evolveum.midpoint.task.api.Task; @@ -60,8 +55,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.GenericObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListViewType; import com.evolveum.midpoint.xml.ns._public.common.common_3.GuiObjectListViewsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateModelType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LifecycleStateType; import com.evolveum.midpoint.xml.ns._public.common.common_3.NodeType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectPolicyConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -360,10 +353,9 @@ public static void addSearchRefDef(PrismContainerDefin return; } if (pageBase == null) { - defs.add(new SearchItemDefinition(path, refDef, Arrays.asList(SchemaConstants.ORG_DEFAULT))); + defs.add(new SearchItemDefinition(path, refDef, Collections.singletonList(WebComponentUtil.getDefaultRelationOrFail()))); return; } - OperationResult result = new OperationResult("resolve applicable relations"); defs.add(new SearchItemDefinition(path, refDef, WebComponentUtil.getCategoryRelationChoices(category, pageBase))); } 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 1593280f1fe..6e9c0628184 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 @@ -822,7 +822,7 @@ public List showAllAssignmentsPerformed(AjaxRequestTarget aja DeltaSetTriple targetsTriple = evaluatedAssignment.getRoles(); Collection targets = targetsTriple.getNonNegativeValues(); for (EvaluatedAssignmentTarget target : targets) { - if (target.appliesToFocusWithAnyRelation()) { + if (target.appliesToFocusWithAnyRelation(getRelationRegistry())) { assignmentInfoDtoSet.add(createAssignmentsPreviewDto(target, task, result)); } } 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 a90ee7c82b7..381100f8888 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 @@ -52,7 +52,6 @@ import com.evolveum.midpoint.web.component.objectdetails.FocusMainPanel; import com.evolveum.midpoint.web.component.objectdetails.FocusPersonasTabPanel; import com.evolveum.midpoint.web.component.objectdetails.UserDelegationsTabPanel; -import com.evolveum.midpoint.web.component.prism.ContainerStatus; 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.AssignmentInfoDto; @@ -61,6 +60,7 @@ 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.RelationKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; import org.apache.commons.lang3.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -329,7 +329,7 @@ private List loadDelegatedByMeAssignments() { PrismReferenceValue referenceValue = new PrismReferenceValue(getObjectWrapper().getOid(), UserType.COMPLEX_TYPE); - referenceValue.setRelation(SchemaConstants.ORG_DEPUTY); + referenceValue.setRelation(WebComponentUtil.getDefaultRelationOrFail(RelationKindType.DELEGATION)); ObjectFilter refFilter = QueryBuilder.queryFor(UserType.class, getPrismContext()) .item(UserType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF).ref(referenceValue) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java index 2c5ba533a04..762b9b87b8d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/AssignmentInfoDto.java @@ -17,7 +17,7 @@ package com.evolveum.midpoint.web.page.admin.users.component; import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.web.component.util.Selectable; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.Component; @@ -258,7 +258,12 @@ private int getClassOrder(Class targetClass) { } public IModel getRelationDisplayNameModel(Component component) { - String localizationKey = ObjectTypeUtil.getRelationNameLocalizationKey(relation, true); + String localizationKey; + if (WebComponentUtil.isDefaultRelation(relation)) { + localizationKey = null; + } else { + localizationKey = WebComponentUtil.getRelationHeaderLabelKey(relation); + } 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/TreeTablePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/TreeTablePanel.java index 7562dcea0ad..feb311a88d3 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 @@ -25,7 +25,6 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.PrismObjectDefinition; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.delta.ContainerDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -33,7 +32,6 @@ import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.RetrieveOption; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; @@ -41,7 +39,6 @@ import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.FocusSummaryPanel; import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction; import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel; @@ -51,8 +48,6 @@ import com.evolveum.midpoint.web.component.util.ObjectWrapperUtil; import com.evolveum.midpoint.web.component.menu.cog.InlineMenuItemAction; import com.evolveum.midpoint.web.component.util.SelectableBean; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction; import com.evolveum.midpoint.web.page.admin.orgs.OrgTreeAssignablePanel; import com.evolveum.midpoint.web.page.admin.orgs.OrgTreePanel; import com.evolveum.midpoint.web.page.admin.users.PageOrgTree; @@ -63,8 +58,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.repeater.RepeatingView; import org.apache.wicket.model.AbstractReadOnlyModel; @@ -201,9 +194,8 @@ private WebMarkupContainer createManagerPanel(OrgType org) { } private ObjectQuery createManagerQuery(OrgType org) { - ObjectQuery query = QueryBuilder.queryFor(FocusType.class, getPageBase().getPrismContext()) - .item(FocusType.F_PARENT_ORG_REF).ref(ObjectTypeUtil.createObjectRef(org, SchemaConstants.ORG_MANAGER).asReferenceValue()) - .build(); + ObjectQuery query = ObjectTypeUtil.createManagerQuery(FocusType.class, org.getOid(), + parentPage.getRelationRegistry(), parentPage.getPrismContext()); if (LOGGER.isTraceEnabled()) { LOGGER.trace("Searching members of org {} with query:\n{}", org.getOid(), query.debugDump()); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java index 4b39338827b..d36b0c29ec2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/users/component/UserSummaryPanel.java @@ -19,14 +19,12 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import org.apache.wicket.model.IModel; import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.web.component.FocusSummaryPanel; import com.evolveum.midpoint.web.component.prism.ObjectWrapper; import com.evolveum.midpoint.web.component.util.SummaryTag; @@ -67,7 +65,7 @@ protected void initialize(ObjectWrapper wrapper) { continue; } QName relation = assignment.getTargetRef().getRelation(); - if (relation != null && !QNameUtil.match(SchemaConstants.ORG_DEFAULT, relation)) { + if (!WebComponentUtil.isDefaultRelation(relation)) { continue; } if (SystemObjectsType.ROLE_SUPERUSER.value().equals(assignment.getTargetRef().getOid())) { @@ -106,7 +104,7 @@ protected void initialize(ObjectWrapper wrapper) { boolean isManager = false; boolean isMember = false; for (ObjectReferenceType parentOrgRef: wrapper.getObject().asObjectable().getParentOrgRef()) { - if (ObjectTypeUtil.isManagerRelation(parentOrgRef.getRelation())) { + if (WebComponentUtil.isManagerRelation(parentOrgRef.getRelation())) { isManager = true; } else { isMember = true; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java index 4bb19d39718..365e2e984e2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/AbstractShoppingCartTabPanel.java @@ -337,8 +337,8 @@ private UserType getTargetUser(){ protected void assignmentAddedToShoppingCartPerformed(AjaxRequestTarget target){ } - protected QName getNewAssignmentRelation(){ - return SchemaConstants.ORG_DEFAULT; + protected QName getNewAssignmentRelation() { + return WebComponentUtil.getDefaultRelationOrFail(); } protected RoleCatalogStorage getRoleCatalogStorage(){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java index e3c41603025..34cf41cbe29 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/MidPointApplication.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SchemaDebugUtil; import com.evolveum.midpoint.security.api.AuthorizationConstants; @@ -158,6 +159,8 @@ public class MidPointApplication extends AuthenticatedWebApplication { @Autowired transient ModelInteractionService modelInteractionService; @Autowired + transient RelationRegistry relationRegistry; + @Autowired transient TaskService taskService; @Autowired transient PrismContext prismContext; @@ -491,6 +494,10 @@ public ModelInteractionService getModelInteractionService() { return modelInteractionService; } + public RelationRegistry getRelationRegistry() { + return relationRegistry; + } + public static boolean containsLocale(Locale locale) { if (locale == null) { return false; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java index ea62e9c3649..bd23765693a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/ObjectTypeGuiDescriptor.java @@ -18,9 +18,6 @@ import com.evolveum.midpoint.gui.api.GuiStyleConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; -import com.evolveum.midpoint.schema.constants.SchemaConstants; - -import javax.xml.namespace.QName; /** * @author lazyman @@ -67,8 +64,6 @@ public enum ObjectTypeGuiDescriptor { SECURITY_POLICY(ObjectTypes.SECURITY_POLICY, "ObjectTypeGuiDescriptor.securityPolicy", "", ""), - USER_ORG_MANAGER(SchemaConstants.ORG_MANAGER, "ObjectTypeGuiDescriptor.orgManager", "silk-user_red", "silk-user_red"), - LOOKUP_TABLE(ObjectTypes.LOOKUP_TABLE, "ObjectTypeGuiDescriptor.lookupTable", "", ""), ACCESS_CERTIFICATION_DEFINITION(ObjectTypes.ACCESS_CERTIFICATION_DEFINITION, "ObjectTypeGuiDescriptor.accessCertificationDefinition", "", ""), @@ -89,7 +84,6 @@ public enum ObjectTypeGuiDescriptor { public static final String ERROR_LOCALIZATION_KEY = "ObjectTypeGuiDescriptor.unknown"; private ObjectTypes type; - private QName relation; private String localizationKey; private String coloredIcon; private String blackIcon; @@ -101,13 +95,6 @@ public enum ObjectTypeGuiDescriptor { this.type = type; } - ObjectTypeGuiDescriptor(QName relation, String localizationKey, String coloredIcon, String blackIcon) { - this.coloredIcon = coloredIcon; - this.blackIcon = blackIcon; - this.localizationKey = localizationKey; - this.relation = relation; - } - @SuppressWarnings("unused") public String getColoredIcon() { return coloredIcon; @@ -125,10 +112,6 @@ public ObjectTypes getType() { return type; } - public QName getRelation() { - return relation; - } - public static ObjectTypeGuiDescriptor getDescriptor(Class type) { for (ObjectTypeGuiDescriptor descr : ObjectTypeGuiDescriptor.values()) { if (descr.getType() != null && descr.getType().getClassDefinition().equals(type)) { @@ -151,14 +134,4 @@ public static ObjectTypeGuiDescriptor getDescriptor(ObjectTypes type) { return null; } - - public static ObjectTypeGuiDescriptor getDescriptor(QName relation) { - for (ObjectTypeGuiDescriptor descr : ObjectTypeGuiDescriptor.values()) { - if (descr.getRelation() != null && descr.getRelation().equals(relation)) { - return descr; - } - } - - return null; - } } diff --git a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java index 4aa78b926a6..aa655f8d302 100644 --- a/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java +++ b/gui/admin-gui/src/test/java/com/evolveum/midpoint/web/AbstractGuiIntegrationTest.java @@ -22,7 +22,7 @@ import com.evolveum.midpoint.common.LocalizationService; import com.evolveum.midpoint.gui.api.util.ModelServiceLocator; -import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.model.api.ModelInteractionService; import com.evolveum.midpoint.model.api.ModelService; import com.evolveum.midpoint.model.test.AbstractModelIntegrationTest; @@ -31,9 +31,9 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.util.PrismAsserts; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.security.api.MidPointPrincipal; import com.evolveum.midpoint.security.api.SecurityContextManager; import com.evolveum.midpoint.security.enforcer.api.SecurityEnforcer; import com.evolveum.midpoint.task.api.Task; @@ -44,7 +44,6 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.application.DescriptorLoader; import com.evolveum.midpoint.web.security.MidPointApplication; -import com.evolveum.midpoint.web.security.SecurityUtils; import com.evolveum.midpoint.xml.ns._public.common.common_3.AdminGuiConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; @@ -113,10 +112,12 @@ public abstract class AbstractGuiIntegrationTest extends AbstractModelIntegratio @Autowired private ApplicationContext appContext; @Autowired protected PrismContext prismContext; @Autowired protected ExpressionFactory expressionFactory; + @Autowired protected RelationRegistry relationRegistry; @Override public void initSystem(Task initTask, OperationResult initResult) throws Exception { super.initSystem(initTask, initResult); + WebComponentUtil.setStaticallyProvidedRelationRegistry(relationRegistry); } @PostConstruct diff --git a/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java b/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java index 15e099c2841..0e783df9b27 100644 --- a/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java +++ b/infra/common/src/main/java/com/evolveum/midpoint/common/ResourceObjectPattern.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ObjectQuery; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -61,18 +62,19 @@ public void addIdentifier(ResourceAttribute identifier) { } public static boolean matches(PrismObject shadowToMatch, - Collection protectedAccountPatterns, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { + Collection protectedAccountPatterns, MatchingRuleRegistry matchingRuleRegistry, + RelationRegistry relationRegistry) throws SchemaException { for (ResourceObjectPattern pattern: protectedAccountPatterns) { - if (pattern.matches(shadowToMatch, matchingRuleRegistry)) { + if (pattern.matches(shadowToMatch, matchingRuleRegistry, relationRegistry)) { return true; } } return false; } - public boolean matches(PrismObject shadowToMatch, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { + public boolean matches(PrismObject shadowToMatch, MatchingRuleRegistry matchingRuleRegistry, RelationRegistry relationRegistry) throws SchemaException { if (objectFilter != null) { - ObjectTypeUtil.normalizeFilter(objectFilter); // we suppose references in shadowToMatch are normalized (on return from repo) + ObjectTypeUtil.normalizeFilter(objectFilter, relationRegistry); // we suppose references in shadowToMatch are normalized (on return from repo) return ObjectQuery.match(shadowToMatch, objectFilter, matchingRuleRegistry); } else { // Deprecated method diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java new file mode 100644 index 00000000000..375fd18c739 --- /dev/null +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java @@ -0,0 +1,132 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.common.refinery; + +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; + +import static com.evolveum.midpoint.schema.constants.SchemaConstants.ORG_DEFAULT; +import static java.util.Collections.emptyList; +import static java.util.Collections.singleton; +import static java.util.Collections.singletonList; + +/** + * Temporary workaround: in TestRefinedSchema we don't have spring context. + * @author mederly + */ +class RelationRegistryDummyImpl implements RelationRegistry { + + @Override + public List getRelationDefinitions() { + return emptyList(); + } + + @Override + public RelationDefinitionType getRelationDefinition(QName relation) { + return null; + } + + @Override + public boolean isOfKind(QName relation, RelationKindType kind) { + return kind == RelationKindType.MEMBERSHIP && (relation == null || QNameUtil.match(relation, ORG_DEFAULT)); + } + + @Override + public boolean isManager(QName relation) { + return false; + } + + @Override + public boolean isDelegation(QName relation) { + return false; + } + + @Override + public boolean isMembership(QName relation) { + return isOfKind(relation, RelationKindType.MEMBERSHIP); + } + + @Override + public boolean isOwner(QName relation) { + return false; + } + + @Override + public boolean isApprover(QName relation) { + return false; + } + + @Override + public boolean processRelationOnLogin(QName relation) { + return false; + } + + @Override + public boolean processRelationOnRecompute(QName relation) { + return false; + } + + @Override + public boolean includeIntoParentOrgRef(QName relation) { + return false; + } + + @Override + public QName getDefaultRelation() { + return ORG_DEFAULT; + } + + @NotNull + @Override + public Collection getAllRelationsFor(RelationKindType kind) { + return kind == RelationKindType.MEMBERSHIP ? singletonList(ORG_DEFAULT) : emptyList(); + } + + @Override + public QName getDefaultRelationFor(RelationKindType kind) { + return kind == RelationKindType.MEMBERSHIP ? ORG_DEFAULT : null; + } + + @NotNull + @Override + public QName normalizeRelation(QName relation) { + return relation == null ? ORG_DEFAULT : relation; + } + + @Override + public void applyRelationConfiguration(SystemConfigurationType relationsDefinition) { + } + + @Override + public boolean isDefault(QName relation) { + return relation == null || QNameUtil.match(relation, ORG_DEFAULT); + } + + @NotNull + @Override + public Collection getAliases(QName relation) { + return singleton(relation); + } +} diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java index 428eb663361..193d5cad641 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/TestRefinedSchema.java @@ -33,6 +33,7 @@ import com.evolveum.midpoint.prism.ConsistencyCheckScope; import com.evolveum.midpoint.prism.util.PrismTestUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.processor.*; import org.testng.Assert; import org.testng.AssertJUnit; @@ -85,6 +86,8 @@ public class TestRefinedSchema { private static final QName OBJECT_CLASS_INETORGPERSON_QNAME = new QName(MidPointConstants.NS_RI, "inetOrgPerson"); + private final RelationRegistry relationRegistry = new RelationRegistryDummyImpl(); + @BeforeSuite public void setup() throws SchemaException, SAXException, IOException { PrettyPrinter.setDefaultNamespacePrefix(MidPointConstants.NS_MIDPOINT_PUBLIC_PREFIX); @@ -544,9 +547,9 @@ private void assertDeprecatedProtectedAccount(String message, ResourceObjectPatt ResourceAttribute confusingAttr2 = createStringAttribute(new QName("http://whatever.com","confuseMeAgain"), "WoodchuckWouldChuckNoWoodAsWoodchuckCannotChuckWood"); attributesContainer.add(confusingAttr2); - assertTrue("Test attr not matched in "+message, protectedPattern.matches(shadow, null)); + assertTrue("Test attr not matched in "+message, protectedPattern.matches(shadow, null, relationRegistry)); nameAttr.setRealValue("huhulumululul"); - assertFalse("Test attr nonsense was matched in "+message, protectedPattern.matches(shadow, null)); + assertFalse("Test attr nonsense was matched in "+message, protectedPattern.matches(shadow, null, relationRegistry)); } private ResourceAttribute createStringAttribute(QName attrName, String value) { diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java index b6c55b92306..b51e64b072d 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContext.java @@ -36,6 +36,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.List; /** * @@ -267,8 +268,20 @@ void adopt(PrismContainerValue relationQuery, QName relation); + } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java index 9276c2051d3..1bb56f77a2a 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/PrismContextImpl.java @@ -31,6 +31,7 @@ import com.evolveum.midpoint.prism.util.PrismMonitor; import com.evolveum.midpoint.prism.util.PrismPrettyPrinter; import com.evolveum.midpoint.prism.xnode.RootXNode; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; import com.evolveum.midpoint.util.logging.Trace; @@ -46,6 +47,7 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.util.List; /** * @author semancik @@ -475,4 +477,28 @@ public O createKnownObjectable(@NotNull Class clazz) { public LexicalProcessorRegistry getLexicalProcessorRegistry() { return lexicalProcessorRegistry; } + + @Override + public boolean isDefaultRelation(QName relation) { + return relation == null || defaultRelation != null && QNameUtil.match(relation, defaultRelation); + } + + @Override + public boolean relationsEquivalent(QName relation1, QName relation2) { + if (isDefaultRelation(relation1)) { + return isDefaultRelation(relation2); + } else { + return QNameUtil.match(relation1, relation2); + } + } + + @Override + public boolean relationMatches(QName relationQuery, QName relation) { + return QNameUtil.match(relationQuery, PrismConstants.Q_ANY) || relationsEquivalent(relationQuery, relation); + } + + @Override + public boolean relationMatches(@NotNull List relationQuery, QName relation) { + return relationQuery.stream().anyMatch(rq -> relationMatches(rq, relation)); + } } diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java index 6da5e097aa1..170f475b0ae 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/R_AtomicFilter.java @@ -222,11 +222,13 @@ public S_MatchingRuleEntry containsPoly(String orig) { } @Override - public S_AtomicFilterExit ref(QName relation) { - PrismReferenceValue ref = new PrismReferenceValue(); - ref.setRelation(relation); - List values = new ArrayList<>(); - values.add(ref); + public S_AtomicFilterExit ref(QName... relations) { + List values = new ArrayList<>(); + for (QName relation : relations) { + PrismReferenceValue ref = new PrismReferenceValue(); + ref.setRelation(relation); + values.add(ref); + } RefFilter filter = RefFilter.createReferenceEqual(itemPath, referenceDefinition, values); filter.setOidNullAsAny(true); filter.setTargetTypeNullAsAny(true); diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java index 319409fbbd6..e6236cda526 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/query/builder/S_ConditionEntry.java @@ -48,7 +48,7 @@ public interface S_ConditionEntry { S_MatchingRuleEntry contains(Object value); S_MatchingRuleEntry containsPoly(String orig, String norm); S_MatchingRuleEntry containsPoly(String orig); - S_AtomicFilterExit ref(QName relation); // TODO is this supported by repo query interpreter? + S_AtomicFilterExit ref(QName... relations); // TODO is this supported by repo query interpreter? S_AtomicFilterExit ref(PrismReferenceValue... value); S_AtomicFilterExit ref(Collection values); S_AtomicFilterExit ref(Collection values, boolean nullTypeAsAny); // beware, 'nullTypeAsAny' is supported only by built-in match(..) method diff --git a/infra/schema/pom.xml b/infra/schema/pom.xml index 31b099603ab..9b01e988a34 100644 --- a/infra/schema/pom.xml +++ b/infra/schema/pom.xml @@ -42,6 +42,18 @@ util 3.9-SNAPSHOT + + org.springframework + spring-core + + + org.springframework + spring-beans + + + org.springframework + spring-context + commons-collections commons-collections diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java new file mode 100644 index 00000000000..8179135b910 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java @@ -0,0 +1,84 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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 com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; +import java.util.Collection; +import java.util.List; + +/** + * TODO think about precise place of this interface + * + * @author mederly + */ +public interface RelationRegistry { + + List getRelationDefinitions(); + + RelationDefinitionType getRelationDefinition(QName relation); + + // SchemaException is thrown as SystemException as it really should not occur + + boolean isOfKind(QName relation, RelationKindType kind); + + boolean isManager(QName relation); + + boolean isDelegation(QName relation); + + boolean isMembership(QName relation); + + boolean isOwner(QName relation); + + boolean isApprover(QName relation); + + boolean processRelationOnLogin(QName relation); + + boolean processRelationOnRecompute(QName relation); + + boolean includeIntoParentOrgRef(QName relation); + + QName getDefaultRelation(); + + @NotNull + Collection getAllRelationsFor(RelationKindType kind); + + QName getDefaultRelationFor(RelationKindType kind); + + @NotNull + QName normalizeRelation(QName relation); + + void applyRelationConfiguration(SystemConfigurationType relationsDefinition); + + boolean isDefault(QName relation); + + /** + * Returns aliases of a relation. Currently these are: + * - unnormalized version of the relation QNme + * - null if the relation is the default one + * + * In the future we might return some other values (e.g. explicitly configured aliases) as well. + * But we would need to adapt prismContext.relationsEquivalent method and other comparison methods as well. + * It is perhaps not worth the effort. + */ + @NotNull + Collection getAliases(QName relation); +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java index fddfab68477..a70c494dfd6 100755 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java @@ -16,11 +16,16 @@ package com.evolveum.midpoint.schema.constants; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.AreaCategoryType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; +import org.jetbrains.annotations.NotNull; import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Collection; + +import static com.evolveum.midpoint.xml.ns._public.common.common_3.AreaCategoryType.*; +import static java.util.Collections.singletonList; /** * Built-in (hardcoded) relations. @@ -29,22 +34,31 @@ */ public enum RelationTypes { - MEMBER(SchemaConstants.ORG_DEFAULT, "", AreaCategoryType.ADMINISTRATION, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE), - MANAGER(SchemaConstants.ORG_MANAGER, "Manager", AreaCategoryType.ADMINISTRATION, AreaCategoryType.GOVERNANCE, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE), - META(SchemaConstants.ORG_META, "Meta", AreaCategoryType.POLICY), - DEPUTY(SchemaConstants.ORG_DEPUTY, "Deputy" /* no values */), - APPROVER(SchemaConstants.ORG_APPROVER, "Approver", AreaCategoryType.ADMINISTRATION, AreaCategoryType.GOVERNANCE, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE), - OWNER(SchemaConstants.ORG_OWNER, "Owner", AreaCategoryType.ADMINISTRATION, AreaCategoryType.GOVERNANCE, AreaCategoryType.ORGANIZATION, AreaCategoryType.SELF_SERVICE), - CONSENT(SchemaConstants.ORG_CONSENT, "Consent", AreaCategoryType.DATA_PROTECTION),; - + MEMBER(SchemaConstants.ORG_DEFAULT, "", RelationKindType.MEMBERSHIP, null, ADMINISTRATION, ORGANIZATION, SELF_SERVICE), + MANAGER(SchemaConstants.ORG_MANAGER, "Manager", RelationKindType.MANAGER, singletonList(RelationKindType.MEMBERSHIP), ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), + META(SchemaConstants.ORG_META, "Meta", RelationKindType.META, singletonList(RelationKindType.MEMBERSHIP), POLICY), + DEPUTY(SchemaConstants.ORG_DEPUTY, "Deputy", RelationKindType.DELEGATION, null /* no values */), + APPROVER(SchemaConstants.ORG_APPROVER, "Approver", RelationKindType.APPROVER, null, ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), + OWNER(SchemaConstants.ORG_OWNER, "Owner", RelationKindType.OWNER, null, ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), + CONSENT(SchemaConstants.ORG_CONSENT, "Consent", RelationKindType.CONSENT, null, DATA_PROTECTION); private final QName relation; private final String headerLabel; + private final RelationKindType defaultFor; + @NotNull private final Collection kinds; private final AreaCategoryType[] categories; - RelationTypes(QName relation, String headerLabel, AreaCategoryType... categories) { + RelationTypes(QName relation, String headerLabel, RelationKindType defaultFor, Collection additionalKinds, AreaCategoryType... categories) { this.relation = relation; this.headerLabel = headerLabel; + this.kinds = new ArrayList<>(); + if (defaultFor != null) { + kinds.add(defaultFor); + } + if (additionalKinds != null) { + kinds.addAll(additionalKinds); + } + this.defaultFor = defaultFor; this.categories = categories; } @@ -59,20 +73,17 @@ public String getHeaderLabel() { public String getLabelKey() { return RelationTypes.class.getSimpleName() + "." + relation.getLocalPart(); } - + + public RelationKindType getDefaultFor() { + return defaultFor; + } + + @NotNull + public Collection getKinds() { + return kinds; + } + public AreaCategoryType[] getCategories() { return categories; } - - public static RelationTypes getRelationType(QName relation) { - if (ObjectTypeUtil.isDefaultRelation(relation)) { - return RelationTypes.MEMBER; - } - for (RelationTypes relationTypes : RelationTypes.values()) { - if (QNameUtil.match(relation, relationTypes.getRelation())) { - return relationTypes; - } - } - return RelationTypes.MEMBER; - } } 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 58e5f65b884..6a8361c2192 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 @@ -139,64 +139,54 @@ public abstract class SchemaConstants { // public static final QName T_PROTECTED_BYTE_ARRAY_TYPE = new QName(NS_C, // "ProtectedByteArrayType"); + /* + * Constants for default relations. + * + * Please DO NOT use these in production code. Use RelationKind values instead. + * =========================================== + * + * You can, however, freely use these in tests. + */ + /** - * Default relation, usually meaning "has" or "is member of". Used as a relation value in object references. - * Specifies that the subject is a member of organization, or that the subject - * has been assigned a role in a way that he gets authorizations and other content - * provided by that role. + * Default membership relation. Used as a relation value in object references. + * See RelationKind.MEMBERSHIP for more details. */ public static final QName ORG_DEFAULT = new QName(NS_ORG, "default"); /** - * Relation "is manager of". Used as a relation value in object references. - * Specifies that the subject is a manager of organizational unit. + * Default 'manager' relation. Used as a relation value in object references. + * See RelationKind.MANAGER for more details. */ public static final QName ORG_MANAGER = new QName(NS_ORG, "manager"); /** - * Relation used for metarole assignments. Sometimes it is important to - * distinguish metarole and member assignments. This relation is used - * for that purpose. + * Default 'metarole assignment' relation. Used as a relation value in object references. + * See RelationKind.META for more details. */ public static final QName ORG_META = new QName(NS_ORG, "meta"); /** - * Relation "is deputy of". Used as a relation value in object references. - * Specifies that the subject is a deputy of another user. + * Default delegation relation. Used as a relation value in object references. + * See RelationKind.DELEGATION for more details. */ public static final QName ORG_DEPUTY = new QName(NS_ORG, "deputy"); /** - * Relation "is approver of". Used as a relation value in object references. - * Specifies that the subject is a (general) approver of specified (abstract) role. - * The approver will be asked for decision if the role is assigned, if there is - * a rule conflict during assignment (e.g. SoD conflict) or if there is any similar - * situation. - * - * This is a generic approver used for all the situation. The system may be customized - * with more specific approver roles, e.g. technicalApprover, securityApprover, etc. - * - * This approver is responsible for the use of the role, which mostly means - * that he decides about role assignment. It is NOT meant to approve role changes. - * Role owner is meant for that purpose. + * Default 'approver' relation. Used as a relation value in object references. + * See RelationKind.APPROVER for more details. */ public static final QName ORG_APPROVER = new QName(NS_ORG, "approver"); /** - * Relation "is owner of". Used as a relation value in object references. - * Specifies that the subject is a (business) owner of specified (abstract) role. - * The owner will be asked for decision if the role is modified, when the associated - * policy changes and so on. - * - * This owner is responsible for maintaining role definition and policies. It is - * NPT necessarily concerned with role use (e.g. assignment). The approver relation - * is meant for that purpose. + * Default 'owner' relation. Used as a relation value in object references. + * See RelationKind.OWNER for more details. */ public static final QName ORG_OWNER = new QName(NS_ORG, "owner"); /** - * Relation "is consent for". Used as a relation value in object references. - * Specifies that the subject gave a consent for using personnel information related to this role. + * Default 'consent' relation. Used as a relation value in object references. + * See RelationKind.CONSENT for more details. */ public static final QName ORG_CONSENT = new QName(NS_ORG, "consent"); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java new file mode 100644 index 00000000000..fc4e1b52504 --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java @@ -0,0 +1,347 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.relation; + +import com.evolveum.midpoint.schema.constants.RelationTypes; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; +import org.apache.commons.collections4.ListValuedMap; +import org.apache.commons.collections4.SetValuedMap; +import org.apache.commons.collections4.multimap.ArrayListValuedHashMap; +import org.apache.commons.collections4.multimap.HashSetValuedHashMap; +import org.jetbrains.annotations.NotNull; +import org.springframework.util.CollectionUtils; + +import javax.xml.namespace.QName; +import java.util.*; + +import static java.util.Collections.singleton; +import static org.apache.commons.collections4.CollectionUtils.emptyIfNull; + +/** + * Relation definitions indexed for fast querying by the relation registry. + * It is intentionally package-private. Should be used only for RelationRegistryImpl. + * + * @author mederly + */ +class IndexedRelationDefinitions { + + private static final Trace LOGGER = TraceManager.getTrace(IndexedRelationDefinitions.class); + + /** + * All valid definitions are here; duplicates and invalid ones are filtered out. + */ + @NotNull private final List definitions; + /** + * Looking up relation definition by its name. + * + * All variants of relation name are present in keySet, e.g. both 'org:approver' and 'approver' (in default configuration) + * There's also an entry with key=null, denoting the default relation. + */ + @NotNull private final Map relationDefinitionsByRelationName; + /** + * Looking up relation kinds by its name. It is returned as HashSet to allow for quick determination of presence of specified kinds. + * + * Both qualified and unqualified forms of relation name are listed here, e.g. both 'org:approver' and 'approver'. + * Also an entry with key=null is present. + */ + @NotNull private final SetValuedMap kindsByRelationName; + /** + * Looking up relations by its kind. + * + * Each relation is listed only once in values; e.g. there's 'org:approver' but not 'approver' (in default configuration) + */ + @NotNull private final SetValuedMap relationsByKind; + /** + * Default relation for each kind. + * There should be exactly one for each kind. + */ + @NotNull private final Map defaultRelationByKind; + /** + * Relations to be processed on login. Each relation is listed here under all its names. + */ + @NotNull private final Set relationsToProcessOnLogin; + /** + * Relations to be processed on recompute. Each relation is listed here under all its names. + */ + @NotNull private final Set relationsToProcessOnRecompute; + /** + * Aliases for each normalized relation QName. + */ + @NotNull private final SetValuedMap aliases; + + //region Initialization + + IndexedRelationDefinitions(@NotNull List definitions) { + List validatedDefinitions = validateDefinitions(definitions); + this.definitions = validatedDefinitions; + relationDefinitionsByRelationName = initializeRelationDefinitionsByRelationName(validatedDefinitions); + kindsByRelationName = computeKindsByRelationName(); + relationsByKind = computeRelationsByKind(); + defaultRelationByKind = computeDefaultRelationByKind(); + + addDefaultRelationToMaps(); + + relationsToProcessOnLogin = computeRelationsToProcessOnLogin(); + relationsToProcessOnRecompute = computeRelationsToProcessOnRecompute(); + + aliases = computeAliases(); + logState(); + } + + private void addDefaultRelationToMaps() { + QName defaultRelation = defaultRelationByKind.get(RelationKindType.MEMBERSHIP); + if (defaultRelation != null) { + relationDefinitionsByRelationName.put(null, relationDefinitionsByRelationName.get(defaultRelation)); + kindsByRelationName.putAll(null, kindsByRelationName.get(defaultRelation)); + } + } + + private void logState() { + if (LOGGER.isTraceEnabled()) { + LOGGER.trace("relation definitions = {}", definitions); + LOGGER.trace("relationDefinitionsByRelationName = {}", relationDefinitionsByRelationName); + LOGGER.trace("relationsByKind = {}", relationsByKind); + LOGGER.trace("defaultRelationByKind = {}", defaultRelationByKind); + LOGGER.trace("relationsToProcessOnLogin = {}", relationsToProcessOnLogin); + LOGGER.trace("relationsToProcessOnRecompute = {}", relationsToProcessOnRecompute); + LOGGER.trace("aliases = {}", aliases); + } + } + + private List validateDefinitions(@NotNull List definitions) { + List validatedDefinitions = new ArrayList<>(definitions.size()); + boolean membershipRelationExists = false; + for (RelationDefinitionType definition : definitions) { + if (definition.getRef() == null) { + LOGGER.error("Relation definition with null ref; ignoring: {}", definition); + } else { + if (QNameUtil.isUnqualified(definition.getRef())) { + LOGGER.warn("Unqualified relation name '{}'; please fix it as soon as possible; in {}", definition.getRef(), definition); + } + validatedDefinitions.add(definition); + if (!membershipRelationExists && definition.getKind().contains(RelationKindType.MEMBERSHIP)) { + membershipRelationExists = true; + } + } + } + if (!membershipRelationExists) { + LOGGER.error("No 'member' relation was defined. This would be a fatal condition, so we define one."); + validatedDefinitions.add(RelationRegistryImpl.createRelationDefinitionFromStaticDefinition(RelationTypes.MEMBER)); + } + return validatedDefinitions; + } + + /** + * Removes duplicate definitions as well. + */ + @NotNull + private Map initializeRelationDefinitionsByRelationName(List definitions) { + Map map = new HashMap<>(); + ListValuedMap expansions = new ArrayListValuedHashMap<>(); + for (Iterator iterator = definitions.iterator(); iterator.hasNext(); ) { + RelationDefinitionType definition = iterator.next(); + if (map.containsKey(definition.getRef())) { + LOGGER.error("Duplicate relation definition for '{}'; ignoring: {}", definition.getRef(), definition); + iterator.remove(); + } else { + map.put(definition.getRef(), definition); + expansions.put(definition.getRef().getLocalPart(), definition.getRef()); + } + } + // add entries for unqualified versions of the relation names + for (String unqualified : expansions.keySet()) { + List names = expansions.get(unqualified); + if (names.contains(new QName(unqualified))) { + continue; // cannot expand unqualified if the expanded value is also unqualified + } + assert !names.isEmpty(); + assert names.stream().allMatch(QNameUtil::isQualified); + @NotNull QName chosenExpansion; + if (names.size() == 1) { + chosenExpansion = names.get(0); + } else { + QName nameInOrgNamespace = names.stream() + .filter(n -> SchemaConstants.NS_ORG.equals(n.getNamespaceURI())) + .findFirst().orElse(null); + if (nameInOrgNamespace != null) { + // org:xxx expansion will be the default one + chosenExpansion = nameInOrgNamespace; + } else { + chosenExpansion = names.get(0); + LOGGER.warn("Multiple resolutions of unqualified relation name '{}' ({}); " + + "using the first one as default: '{}'. Please reconsider this as it could lead to " + + "unpredictable behavior.", unqualified, names, chosenExpansion); + } + } + assert QNameUtil.isQualified(chosenExpansion); + map.put(new QName(unqualified), map.get(chosenExpansion)); + } + return map; + } + + private SetValuedMap computeKindsByRelationName() { + SetValuedMap rv = new HashSetValuedHashMap<>(); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + for (RelationKindType kind : entry.getValue().getKind()) { + rv.put(entry.getKey(), kind); + } + } + return rv; + } + + private SetValuedMap computeRelationsByKind() { + SetValuedMap rv = new HashSetValuedHashMap<>(); + for (RelationDefinitionType definition : definitions) { + for (RelationKindType kind : definition.getKind()) { + rv.put(kind, definition.getRef()); + } + } + return rv; + } + + // not optimized for speed + @NotNull + private Collection getAllRelationNamesFor(RelationKindType kind) { + Set rv = new HashSet<>(); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + if (entry.getValue().getKind().contains(kind)) { + rv.add(entry.getKey()); + } + } + return rv; + } + + private Map computeDefaultRelationByKind() { + Map rv = new HashMap<>(); + for (RelationKindType kind : RelationKindType.values()) { + Set relationNames = relationsByKind.get(kind); + if (relationNames.isEmpty()) { + LOGGER.warn("No relations defined for kind {}, please define at least one", kind); + continue; + } + Set defaultRelationNames = new HashSet<>(); + for (QName relationName : relationNames) { + RelationDefinitionType definition = relationDefinitionsByRelationName.get(relationName); + assert definition != null; + if (definition.getDefaultFor() == kind) { + defaultRelationNames.add(relationName); + } + } + QName chosen; + if (defaultRelationNames.size() > 1) { + chosen = defaultRelationNames.iterator().next(); + LOGGER.error("More than one default relation set up for kind '{}': {}. Please choose one! Temporarily selecting '{}'", + kind, defaultRelationNames, chosen); + } else if (defaultRelationNames.size() == 1) { + chosen = defaultRelationNames.iterator().next(); + } else { + chosen = relationNames.iterator().next(); // maybe we could select org:xxx here but let's not bother now + LOGGER.warn("No default relation set up for kind '{}'. Please choose one! Temporarily selecting '{}'", kind, chosen); + } + rv.put(kind, chosen); + } + return rv; + } + + // We want to make this configurable in the future MID-3581 + private Set computeRelationsToProcessOnLogin() { + HashSet rv = new HashSet<>(); + rv.addAll(getAllRelationNamesFor(RelationKindType.MEMBERSHIP)); + rv.addAll(getAllRelationNamesFor(RelationKindType.DELEGATION)); + return rv; + } + + // We want to make this configurable in the future MID-3581 + private Set computeRelationsToProcessOnRecompute() { + HashSet rv = new HashSet<>(); + rv.addAll(getAllRelationsFor(RelationKindType.MEMBERSHIP)); + rv.addAll(getAllRelationsFor(RelationKindType.MANAGER)); + rv.addAll(getAllRelationsFor(RelationKindType.DELEGATION)); + return rv; + } + + private SetValuedMap computeAliases() { + SetValuedMap rv = new HashSetValuedHashMap<>(); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + rv.put(entry.getValue().getRef(), entry.getKey()); + } + return rv; + } + + //endregion + + //region Querying + @NotNull + List getDefinitions() { + return definitions; + } + + RelationDefinitionType getRelationDefinition(QName relation) { + return relationDefinitionsByRelationName.get(relation); + } + + boolean isOfKind(QName relation, RelationKindType kind) { + Set relationKinds = kindsByRelationName.get(relation); + return relationKinds != null && relationKinds.contains(kind); + } + + boolean processRelationOnLogin(QName relation) { + return relationsToProcessOnLogin.contains(relation); + } + + boolean processRelationOnRecompute(QName relation) { + return relationsToProcessOnRecompute.contains(relation); + } + + // We want to make this configurable in the future MID-3581 + public boolean includeIntoParentOrgRef(QName relation) { + return isOfKind(relation, RelationKindType.MEMBERSHIP) && !isOfKind(relation, RelationKindType.META); + } + + QName getDefaultRelationFor(RelationKindType kind) { + return defaultRelationByKind.get(kind); + } + + @NotNull + Collection getAllRelationsFor(RelationKindType kind) { + return emptyIfNull(relationsByKind.get(kind)); + } + + @NotNull + QName normalizeRelation(QName relation) { + RelationDefinitionType definition = getRelationDefinition(relation); + assert !(relation == null && definition == null); // there is always a default definition + return definition != null ? definition.getRef() : relation; + } + + @NotNull + Collection getAliases(QName relation) { + Set aliases = this.aliases.get(normalizeRelation(relation)); + if (!CollectionUtils.isEmpty(aliases)) { + return aliases; + } else { + // for unknown relations we would like to return at least the provided name + return singleton(relation); + } + } + //endregion +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java new file mode 100644 index 00000000000..f1455e777dc --- /dev/null +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.relation; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.constants.RelationTypes; +import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; +import org.apache.commons.lang.BooleanUtils; +import org.jetbrains.annotations.NotNull; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.xml.namespace.QName; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; + +import static java.util.Collections.emptyList; + +/** + * @author mederly + * @author semancik + */ +@Component +public class RelationRegistryImpl implements RelationRegistry { + + private static final Trace LOGGER = TraceManager.getTrace(RelationRegistryImpl.class); + + @Autowired private PrismContext prismContext; + + @NotNull + private IndexedRelationDefinitions indexedRelationDefinitions = createAndIndexRelationDefinitions(null); + + @Override + public void applyRelationConfiguration(SystemConfigurationType systemConfiguration) { + RoleManagementConfigurationType roleManagement = systemConfiguration != null ? systemConfiguration.getRoleManagement() : null; + RelationsDefinitionType relationsDef = roleManagement != null ? roleManagement.getRelations() : null; + LOGGER.info("Applying relation configuration ({} entries)", relationsDef != null ? relationsDef.getRelation().size() : 0); + indexedRelationDefinitions = createAndIndexRelationDefinitions(relationsDef); + prismContext.setDefaultRelation(indexedRelationDefinitions.getDefaultRelationFor(RelationKindType.MEMBERSHIP)); + } + + public List getRelationDefinitions() { + return indexedRelationDefinitions.getDefinitions(); + } + + @NotNull + private IndexedRelationDefinitions createAndIndexRelationDefinitions(RelationsDefinitionType relationsDef) { + List configuredRelations = emptyList(); + boolean includeDefaultRelations = true; + if (relationsDef != null) { + configuredRelations = relationsDef.getRelation(); + if (BooleanUtils.isFalse(relationsDef.isIncludeDefaultRelations())) { + includeDefaultRelations = false; + } + } + List relations = new ArrayList<>(); + for (RelationDefinitionType configuredRelation: configuredRelations) { + relations.add(cloneAndNormalize(configuredRelation)); + } + if (includeDefaultRelations) { + addDefaultRelations(relations); + } + return new IndexedRelationDefinitions(relations); + } + + private RelationDefinitionType cloneAndNormalize(RelationDefinitionType definition) { + RelationDefinitionType clone = definition.clone(); + if (clone.getDefaultFor() != null && !clone.getKind().contains(clone.getDefaultFor())) { + clone.getKind().add(clone.getDefaultFor()); + } + return clone; + } + + private void addDefaultRelations(List relations) { + for (RelationTypes defaultRelationDefinition : RelationTypes.values()) { + if (ObjectTypeUtil.findRelationDefinition(relations, defaultRelationDefinition.getRelation()) == null) { + relations.add(createRelationDefinitionFromStaticDefinition(defaultRelationDefinition)); + } + } + } + + @NotNull + static RelationDefinitionType createRelationDefinitionFromStaticDefinition(RelationTypes defaultRelationDefinition) { + RelationDefinitionType relationDef = new RelationDefinitionType(); + relationDef.setRef(defaultRelationDefinition.getRelation()); + DisplayType display = new DisplayType(); + display.setLabel(defaultRelationDefinition.getLabelKey()); + relationDef.setDisplay(display); + relationDef.setDefaultFor(defaultRelationDefinition.getDefaultFor()); + relationDef.getKind().addAll(defaultRelationDefinition.getKinds()); + relationDef.getCategory().addAll(Arrays.asList(defaultRelationDefinition.getCategories())); + return relationDef; + } + + //region =============================================================================================== query methods + + @Override + public RelationDefinitionType getRelationDefinition(QName relation) { + return indexedRelationDefinitions.getRelationDefinition(relation); + } + + @Override + public boolean isOfKind(QName relation, RelationKindType kind) { + return indexedRelationDefinitions.isOfKind(relation, kind); + } + + @Override + public boolean isMembership(QName relation) { + return isOfKind(relation, RelationKindType.MEMBERSHIP); + } + + @Override + public boolean isManager(QName relation) { + return isOfKind(relation, RelationKindType.MANAGER); + } + + @Override + public boolean isDelegation(QName relation) { + return isOfKind(relation, RelationKindType.DELEGATION); + } + + @Override + public boolean isOwner(QName relation) { + return isOfKind(relation, RelationKindType.OWNER); + } + + @Override + public boolean isApprover(QName relation) { + return isOfKind(relation, RelationKindType.APPROVER); + } + + @Override + public boolean processRelationOnLogin(QName relation) { + return indexedRelationDefinitions.processRelationOnLogin(relation); + } + + @Override + public boolean processRelationOnRecompute(QName relation) { + return indexedRelationDefinitions.processRelationOnRecompute(relation); + } + + @Override + public boolean includeIntoParentOrgRef(QName relation) { + return indexedRelationDefinitions.includeIntoParentOrgRef(relation); + } + + @Override + public QName getDefaultRelationFor(RelationKindType kind) { + return indexedRelationDefinitions.getDefaultRelationFor(kind); + } + + @NotNull + @Override + public Collection getAllRelationsFor(RelationKindType kind) { + return indexedRelationDefinitions.getAllRelationsFor(kind); + } + + @Override + public QName getDefaultRelation() { + return getDefaultRelationFor(RelationKindType.MEMBERSHIP); + } + + @NotNull + @Override + public QName normalizeRelation(QName relation) { + return indexedRelationDefinitions.normalizeRelation(relation); + } + + @Override + public boolean isDefault(QName relation) { + return prismContext.isDefaultRelation(relation); + } + + @Override + @NotNull + public Collection getAliases(QName relation) { + return indexedRelationDefinitions.getAliases(relation); + } + + //endregion +} diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java index ff53b82bdb3..502057f68cb 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/FocusTypeUtil.java @@ -20,6 +20,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentSelectorType; @@ -106,12 +107,13 @@ public static String dumpInducementConstraints(AssignmentType assignmentType) { return sb.toString(); } - public static boolean selectorMatches(AssignmentSelectorType assignmentSelector, AssignmentType assignmentType) { + public static boolean selectorMatches(AssignmentSelectorType assignmentSelector, AssignmentType assignmentType, + PrismContext prismContext) { if (assignmentType.getTargetRef() == null) { return false; } for (ObjectReferenceType selectorTargetRef: assignmentSelector.getTargetRef()) { - if (MiscSchemaUtil.referenceMatches(selectorTargetRef, assignmentType.getTargetRef())) { + if (MiscSchemaUtil.referenceMatches(selectorTargetRef, assignmentType.getTargetRef(), prismContext)) { return true; } } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java index 18a6835c4b8..c2ff7c0fa3e 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/MiscSchemaUtil.java @@ -305,10 +305,6 @@ public static AssignmentPolicyEnforcementType getAssignmentPolicyEnforcementType return assignmentPolicyEnforcement; } - public static boolean compareRelation(QName query, QName refRelation) { - return ObjectTypeUtil.relationMatches(query, refRelation); - } - public static PrismReferenceValue objectReferenceTypeToReferenceValue(ObjectReferenceType refType) { if (refType == null) { return null; @@ -397,14 +393,15 @@ public static void serializeFaultMessage(Detail detail, FaultMessage faultMessag } } - public static boolean referenceMatches(ObjectReferenceType refPattern, ObjectReferenceType ref) { + public static boolean referenceMatches(ObjectReferenceType refPattern, ObjectReferenceType ref, + PrismContext prismContext) { if (refPattern.getOid() != null && !refPattern.getOid().equals(ref.getOid())) { return false; } if (refPattern.getType() != null && !QNameUtil.match(refPattern.getType(), ref.getType())) { return false; } - if (!ObjectTypeUtil.relationMatches(refPattern.getRelation(), ref.getRelation())) { + if (!prismContext.relationMatches(refPattern.getRelation(), ref.getRelation())) { return false; } return true; 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 ada0fb9438a..0dfde0c2369 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 @@ -23,14 +23,19 @@ import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.RefFilter; +import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.util.ItemPathUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.util.LocalizableMessageBuilder; import com.evolveum.midpoint.util.QNameUtil; 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.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ItemDeltaType; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; @@ -60,6 +65,8 @@ */ public class ObjectTypeUtil { + private static final Trace LOGGER = TraceManager.getTrace(ObjectTypeUtil.class); + /** * Never returns null. Returns empty collection instead. */ @@ -238,7 +245,7 @@ public static AssignmentType createAssignmentTo(@NotNull @NotNull public static AssignmentType createAssignmentTo(@NotNull PrismObject object) { - return createAssignmentTo(object, SchemaConstants.ORG_DEFAULT); + return createAssignmentTo(object, getPrismContextFromObject(object).getDefaultRelation()); } @NotNull @@ -283,10 +290,23 @@ public static ObjectReferenceType createObjectRefWithFullObject(ObjectType objec return createObjectRefWithFullObject(objectType.asPrismObject()); } - public static ObjectReferenceType createObjectRef(ObjectType objectType) { - return createObjectRef(objectType, SchemaConstants.ORG_DEFAULT); + public static ObjectReferenceType createObjectRef(ObjectType object) { + if (object == null) { + return null; + } + PrismContext prismContext = getPrismContextFromObject(object.asPrismObject()); + return createObjectRef(object, prismContext.getDefaultRelation()); } + @NotNull + private static PrismContext getPrismContextFromObject(PrismObject object) { + PrismContext prismContext = object.getPrismContext(); + if (prismContext == null) { + throw new IllegalStateException("No prismContext in prism object " + object); + } + return prismContext; + } + public static ObjectReferenceType createObjectRef(ObjectType objectType, QName relation) { if (objectType == null) { return null; @@ -295,7 +315,10 @@ public static ObjectReferenceType createObjectRef(ObjectType objectType, QName r } public static ObjectReferenceType createObjectRef(PrismObject object) { - return createObjectRef(object, SchemaConstants.ORG_DEFAULT); + if (object == null) { + return null; + } + return createObjectRef(object, getPrismContextFromObject(object).getDefaultRelation()); } public static ObjectReferenceType createObjectRef(PrismObject object, QName relation) { @@ -629,83 +652,49 @@ public static T getExtensionItemRealValue(@Nullable ExtensionType extension, return item != null ? (T) item.getRealValue() : null; } - @NotNull - public static QName normalizeRelation(QName name) { - if (name == null) { - return SchemaConstants.ORG_DEFAULT; - } else { - return QNameUtil.setNamespaceIfMissing(name, SchemaConstants.NS_ORG, SchemaConstants.PREFIX_NS_ORG); - } - } - - public static void normalizeRelation(ObjectReferenceType reference) { + public static void normalizeRelation(ObjectReferenceType reference, RelationRegistry relationRegistry) { if (reference != null) { - reference.setRelation(normalizeRelation(reference.getRelation())); + reference.setRelation(relationRegistry.normalizeRelation(reference.getRelation())); } } - public static void normalizeRelation(PrismReferenceValue reference) { + public static void normalizeRelation(PrismReferenceValue reference, RelationRegistry relationRegistry) { if (reference != null) { - reference.setRelation(normalizeRelation(reference.getRelation())); + reference.setRelation(relationRegistry.normalizeRelation(reference.getRelation())); } } - public static void normalizeAllRelations(PrismValue value) { + public static void normalizeAllRelations(PrismValue value, RelationRegistry relationRegistry) { if (value != null) { - value.accept(createNormalizingVisitor()); + value.accept(createNormalizingVisitor(relationRegistry)); } } - public static void normalizeAllRelations(Item item) { + public static void normalizeAllRelations(Item item, RelationRegistry relationRegistry) { if (item != null) { - item.accept(createNormalizingVisitor()); + item.accept(createNormalizingVisitor(relationRegistry)); } } - private static Visitor createNormalizingVisitor() { + private static Visitor createNormalizingVisitor(RelationRegistry relationRegistry) { return v -> { if (v instanceof PrismReferenceValue) { - normalizeRelation((PrismReferenceValue) v); + normalizeRelation((PrismReferenceValue) v, relationRegistry); } }; } - public static void normalizeFilter(ObjectFilter filter) { + public static void normalizeFilter(ObjectFilter filter, RelationRegistry relationRegistry) { if (filter != null) { filter.accept(f -> { if (f instanceof RefFilter) { - emptyIfNull(((RefFilter) f).getValues()).forEach(v -> normalizeRelation(v)); + emptyIfNull(((RefFilter) f).getValues()).forEach(v -> normalizeRelation(v, relationRegistry)); } }); } } - // This is not the right place for this. But let's leave it here for now. - // See MID-3581 - public static boolean isDelegationRelation(QName relation) { - return QNameUtil.match(relation, SchemaConstants.ORG_DEPUTY); - } - - // This is not the right place for this. But let's leave it here for now. - // See MID-3581 - public static boolean isMembershipRelation(QName relation) { - return isDefaultRelation(relation) - || isManagerRelation(relation) - || QNameUtil.match(relation, SchemaConstants.ORG_META); - } - - // This is not the right place for this. But let's leave it here for now. - // See MID-3581 - public static boolean isManagerRelation(QName relation) { - return QNameUtil.match(relation, SchemaConstants.ORG_MANAGER); - } - - // This is not the right place for this. But let's leave it here for now. - // See MID-3581 - public static boolean isDefaultRelation(QName relation) { - return relation == null || QNameUtil.match(relation, SchemaConstants.ORG_DEFAULT); - } - + // TODO public static RelationDefinitionType findRelationDefinition(List relationDefinitions, QName qname) { for (RelationDefinitionType relation: relationDefinitions) { if (QNameUtil.match(qname, relation.getRef())) { @@ -715,33 +704,8 @@ public static RelationDefinitionType findRelationDefinition(List relationQuery, QName relation) { - return relationQuery.stream().anyMatch(rq -> relationMatches(rq, relation)); - } - - public static boolean relationsEquivalent(QName relation1, QName relation2) { - if (ObjectTypeUtil.isDefaultRelation(relation1)) { - return ObjectTypeUtil.isDefaultRelation(relation2); - } else { - return QNameUtil.match(relation1, relation2); - } - } - - public static boolean referenceMatches(ObjectReferenceType ref, String targetOid, QName targetType, QName relation) { + public static boolean referenceMatches(ObjectReferenceType ref, String targetOid, QName targetType, QName relation, + PrismContext prismContext) { if (ref == null) { return false; } @@ -756,7 +720,7 @@ public static boolean referenceMatches(ObjectReferenceType ref, String targetOid } } if (relation != null) { - if (!relationMatches(relation, ref.getRelation())) { + if (!prismContext.relationMatches(relation, ref.getRelation())) { return false; } } @@ -838,15 +802,6 @@ 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 @Deprecated public static Collection getSubtypeValues(@NotNull PrismObject object) { @@ -903,4 +858,24 @@ private static void addRealValue(Item extensionItem, extensionItem.add(PrismValue.fromRealValue(value).clone()); } } + + @NotNull + public static ObjectQuery createManagerQuery(Class objectTypeClass, String orgOid, + RelationRegistry relationRegistry, PrismContext prismContext) { + Collection managerRelations = relationRegistry.getAllRelationsFor(RelationKindType.MANAGER); + if (managerRelations.isEmpty()) { + LOGGER.warn("No manager relation is defined"); + return QueryBuilder.queryFor(objectTypeClass, prismContext).none().build(); + } + + List referencesToFind = new ArrayList<>(); + for (QName managerRelation : managerRelations) { + PrismReferenceValue parentOrgRefVal = new PrismReferenceValue(orgOid, OrgType.COMPLEX_TYPE); + parentOrgRefVal.setRelation(managerRelation); + referencesToFind.add(parentOrgRefVal); + } + return QueryBuilder.queryFor(objectTypeClass, prismContext) + .item(ObjectType.F_PARENT_ORG_REF).ref(referencesToFind) + .build(); + } } diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index d9a3b6ee857..37f7f35ae2e 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -16260,19 +16260,172 @@ + + + + If this relation is a default for a relation kind, specify the kind here. + + + 3.9 + RelationDefinitionType.defaultFor + + + + + + + Kind(s) of which this relation is. A value of "defaultFor", if present, is automatically considered + to be a kind for this relation, so it is not necessary to list it here. + + + 3.9 + RelationDefinitionType.kind + + + - + + + + + Denotes a set of relations serving a single purpose. + + Until midPoint 3.9, there were fixed relations denoting e.g. manager of an organization (org:manager) or an approver + of a role (org:approver). Starting with 3.9, relations are configurable, and each relation is characterized by its kind + or sometimes a set of kinds. + + So we can have e.g. three approver relations (e:securityApprover, e:technicalApprover, e:businessApprover), + a set of membership relations (org:default, e:assistant, e:external), etc. Note that here 'e' is a prefix for a custom + namespace used to define these custom (extension) relations. + + Each relation has 0, 1 or more kinds. For example, the default org:manager relation is of MANAGER and MEMBERSHIP kinds. + + For each kind, there should be a single relation marked as the default one. + + + 3.9 + + + + + + + Membership relation, usually meaning "has" or "is member of". + Used as a relation value in object references. + Specifies that the subject is a member of organization, or that the subject + has been assigned a role in a way that he gets authorizations and other content + provided by that role. + + Default relation of MEMBERSHIP kind is also considered to be the overall default relation (i.e. used when + ref.relation is null). + + + + + + + + + + Relations of "is manager of" kind. Specifies that the subject is a manager of organizational unit. + Relations of this kind are usually also of MEMBERSHIP kind. + + + + + + + + + + Relations used for metarole assignments. Sometimes it is important to + distinguish metarole and member assignments. This kind of relation is used + for that purpose. + + Relations of this kind should be also of MEMBERSHIP kind. + (Otherwise they would not provide metarole assignment functionality!) + + + + + + + + + + Relation of "is deputy of" kind. Specifies that the subject is a deputy of another user. + + + + + + + + + + Relation "is approver of" kind. + + Specifies that the subject is a (general) approver of specified (abstract) role. + The approver will be asked for decision if the role is assigned, if there is + a rule conflict during assignment (e.g. SoD conflict) or if there is any similar + situation. + + This is a generic approver used for all the situation. The system may be customized + with more specific approver roles, e.g. technicalApprover, securityApprover, etc. + + This approver is responsible for the use of the role, which mostly means + that he decides about role assignment. It is NOT meant to approve role changes. + Role owner is meant for that purpose. + + + + + + + + + + Relation of "is owner of" kind. + + Specifies that the subject is a (business) owner of specified (abstract) role. + The owner will be asked for decision if the role is modified, when the associated + policy changes and so on. + + This owner is responsible for maintaining role definition and policies. It is + NOT necessarily concerned with role use (e.g. assignment). The approver relation kind + is meant for that purpose. + + + + + + + + + + Relation "is consent for" kind. + + Specifies that the subject gave a consent for using personnel information related to this role. + + + + + + + + + Specifies category or "area" of a particular concept. Such category can be used to display the concepts in appropriate parts of user interface. For example the category may be used to display only governance-related relations in the governance - UI spanels. + UI panels. 3.9 diff --git a/infra/test-util/pom.xml b/infra/test-util/pom.xml index 349b1dbfd74..d56e6bc2a84 100644 --- a/infra/test-util/pom.xml +++ b/infra/test-util/pom.xml @@ -71,6 +71,14 @@ org.springframework spring-core + + org.springframework + spring-beans + + + org.springframework + spring-context + org.apache.felix org.osgi.core 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 0a4c2f901fc..5d5f88be90f 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 @@ -25,6 +25,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.QNameUtil; @@ -73,7 +74,7 @@ public static void assertAssigned(PrismObject focus, String if (targetRef != null) { if (refType.equals(targetRef.getType())) { if (targetOid.equals(targetRef.getOid()) && - MiscSchemaUtil.compareRelation(targetRef.getRelation(), relation)) { + getPrismContext().relationMatches(targetRef.getRelation(), relation)) { return; } } @@ -233,7 +234,7 @@ public static void assertNotAssignedOrg(PrismObject use ObjectReferenceType targetRef = assignmentType.getTargetRef(); if (targetRef != null) { if (OrgType.COMPLEX_TYPE.equals(targetRef.getType())) { - if (orgOid.equals(targetRef.getOid()) && ObjectTypeUtil.relationMatches(relation, targetRef.getRelation())) { + if (orgOid.equals(targetRef.getOid()) && getPrismContext().relationMatches(relation, targetRef.getRelation())) { AssertJUnit.fail(user + " does have assigned OrgType "+orgOid+" with relation "+relation+" while not expecting it"); } } @@ -265,7 +266,7 @@ public static void assertHasOrg(PrismObject object, St public static boolean hasOrg(PrismObject user, String orgOid, QName relation) { for (ObjectReferenceType orgRef: user.asObjectable().getParentOrgRef()) { if (orgOid.equals(orgRef.getOid()) && - MiscSchemaUtil.compareRelation(relation, orgRef.getRelation())) { + getPrismContext().relationMatches(relation, orgRef.getRelation())) { return true; } } @@ -347,4 +348,8 @@ public static void assertInstanceOf(String message, Object object, Class expe assertTrue(message+" is not instance of "+expectedClass+", it is "+object.getClass(), expectedClass.isAssignableFrom(object.getClass())); } + + private static PrismContext getPrismContext() { + return TestSpringContextHolder.getPrismContext(); + } } diff --git a/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestSpringContextHolder.java b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestSpringContextHolder.java new file mode 100644 index 00000000000..03d0086642a --- /dev/null +++ b/infra/test-util/src/main/java/com/evolveum/midpoint/test/util/TestSpringContextHolder.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.test.util; + +import com.evolveum.midpoint.prism.PrismContext; +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.stereotype.Component; + +/** + * To be used in tests only. Mainly for access PrismContext from static assertion methods. + */ + +@Component +public class TestSpringContextHolder implements ApplicationContextAware { + + private static ApplicationContext context; + + public void setApplicationContext(ApplicationContext ctx) throws BeansException { + context = ctx; + } + + @SuppressWarnings("WeakerAccess") + public static ApplicationContext getApplicationContext() { + if (context == null) { + throw new IllegalStateException("Spring application context could not be determined."); + } + return context; + } + + @SuppressWarnings("SameParameterValue") + private static T getBean(Class aClass) { + String className = aClass.getSimpleName(); + String beanName = Character.toLowerCase(className.charAt(0)) + className.substring(1); + return getBean(beanName, aClass); + } + + private static T getBean(String name, Class aClass) { + T bean = getApplicationContext().getBean(name, aClass); + if (bean == null) { + throw new IllegalStateException("Could not find " + name + " bean"); + } + return bean; + } + + public static PrismContext getPrismContext() { + return getBean(PrismContext.class); + } +} diff --git a/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java b/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java index 167e9407e96..06a72fcba05 100644 --- a/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java +++ b/infra/util/src/main/java/com/evolveum/midpoint/util/QNameUtil.java @@ -293,8 +293,12 @@ public static QName nullNamespace(QName qname) { return new QName(null, qname.getLocalPart(), qname.getPrefix()); } - public static boolean isUnqualified(QName targetTypeQName) { - return StringUtils.isBlank(targetTypeQName.getNamespaceURI()); + public static boolean isUnqualified(QName name) { + return StringUtils.isBlank(name.getNamespaceURI()); + } + + public static boolean isQualified(QName name) { + return !isUnqualified(name); } public static boolean isTolerateUndeclaredPrefixes() { diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java index 0965c35a758..2c6de54c44b 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java @@ -26,8 +26,8 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.ExpressionConstants; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -62,6 +62,7 @@ public class AccCertReviewersHelper { @Autowired private OrgStructFunctions orgStructFunctions; @Autowired private PrismContext prismContext; @Autowired private AccCertExpressionHelper expressionHelper; + @Autowired private RelationRegistry relationRegistry; AccessCertificationReviewerSpecificationType findReviewersSpecification(AccessCertificationCampaignType campaign, int stage) { AccessCertificationStageDefinitionType stageDef = CertCampaignTypeUtil.findStageDefinition(campaign, stage); @@ -201,7 +202,7 @@ private List getTargetObjectOwners(AccessCertificationCaseT } ObjectType target = resolveReference(_case.getTargetRef(), ObjectType.class, result); if (target instanceof AbstractRoleType) { - return getAssignees((AbstractRoleType) target, SchemaConstants.ORG_OWNER, result); + return getAssignees((AbstractRoleType) target, RelationKindType.OWNER, result); } else if (target instanceof ResourceType) { return ResourceTypeUtil.getOwnerRef((ResourceType) target); } else { @@ -209,24 +210,28 @@ private List getTargetObjectOwners(AccessCertificationCaseT } } - private List getAssignees(AbstractRoleType role, QName relation, OperationResult result) + private List getAssignees(AbstractRoleType role, RelationKindType relationKind, OperationResult result) throws SchemaException { List rv = new ArrayList<>(); - if (SchemaConstants.ORG_OWNER.equals(relation)) { + if (relationKind == RelationKindType.OWNER) { CollectionUtils.addIgnoreNull(rv, role.getOwnerRef()); - } else if (SchemaConstants.ORG_APPROVER.equals(relation)) { + } else if (relationKind == RelationKindType.APPROVER) { rv.addAll(role.getApproverRef()); } else { - throw new AssertionError(relation); + throw new AssertionError(relationKind); } // TODO in theory, we could look for approvers/owners of UserType, right? - PrismReferenceValue ref = new PrismReferenceValue(role.getOid()); - ref.setRelation(relation); + Collection values = new ArrayList<>(); + for (QName relation : relationRegistry.getAllRelationsFor(relationKind)) { + PrismReferenceValue ref = new PrismReferenceValue(role.getOid()); + ref.setRelation(relation); + values.add(ref); + } ObjectQuery query = QueryBuilder.queryFor(FocusType.class, prismContext) - .item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(ref) + .item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(values) .build(); List> assignees = repositoryService.searchObjects(FocusType.class, query, null, result); - LOGGER.trace("Looking for '{}' of {} using {}: found: {}", relation.getLocalPart(), role, query, assignees); + LOGGER.trace("Looking for '{}' of {} using {}: found: {}", relationKind, role, query, assignees); assignees.forEach(o -> rv.add(ObjectTypeUtil.createObjectRef(o))); return rv; } @@ -238,7 +243,7 @@ private List getObjectOwners(AccessCertificationCaseType _c } ObjectType object = resolveReference(_case.getObjectRef(), ObjectType.class, result); if (object instanceof AbstractRoleType) { - return getAssignees((AbstractRoleType) object, SchemaConstants.ORG_OWNER, result); + return getAssignees((AbstractRoleType) object, RelationKindType.OWNER, result); } else { return null; } @@ -251,7 +256,7 @@ private Collection getTargetObjectApprovers(AccessCertifica } ObjectType target = resolveReference(_case.getTargetRef(), ObjectType.class, result); if (target instanceof AbstractRoleType) { - return getAssignees((AbstractRoleType) target, SchemaConstants.ORG_APPROVER, result); + return getAssignees((AbstractRoleType) target, RelationKindType.APPROVER, result); } else if (target instanceof ResourceType) { return ResourceTypeUtil.getApproverRef((ResourceType) target); } else { @@ -266,7 +271,7 @@ private Collection getObjectApprovers(AccessCertificationCa } ObjectType object = resolveReference(_case.getObjectRef(), ObjectType.class, result); if (object instanceof AbstractRoleType) { - return getAssignees((AbstractRoleType) object, SchemaConstants.ORG_APPROVER, result); + return getAssignees((AbstractRoleType) object, RelationKindType.APPROVER, result); } else { return null; } diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java index 22f3d549a64..2c1da07a138 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java @@ -129,8 +129,8 @@ private void processAssignment(AssignmentType assignment, boolean isInducement, } private boolean relationMatches(QName assignmentRelation, List scopeRelations) { - return (!scopeRelations.isEmpty() ? scopeRelations : Collections.singletonList(SchemaConstants.ORG_DEFAULT)) - .stream().anyMatch(r -> ObjectTypeUtil.relationMatches(r, assignmentRelation)); + return (!scopeRelations.isEmpty() ? scopeRelations : Collections.singletonList(prismContext.getDefaultRelation())) + .stream().anyMatch(r -> prismContext.relationMatches(r, assignmentRelation)); } @SuppressWarnings("unused") diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java index 24526675307..68dac4125de 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/ModelInteractionService.java @@ -353,7 +353,7 @@ ExecuteCredentialResetResponseType executeCredentialsReset(PrismObject void refreshPrincipal(String oid) throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException; - List getRelationDefinitions(OperationResult parentResult) throws ObjectNotFoundException, SchemaException; + List getRelationDefinitions(); @NotNull TaskType submitTaskFromTemplate(String templateTaskOid, List> extensionItems, Task opTask, OperationResult result) diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java index 48df4df62b0..552d9b70b22 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedAssignment.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.common.LocalizationService; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.security.api.Authorization; import com.evolveum.midpoint.task.api.Task; @@ -52,8 +53,11 @@ public interface EvaluatedAssignment extends DebugDumpable AssignmentType getAssignmentType(boolean old); + // return value of null is ambiguous: either targetRef is null or targetRef.relation is null QName getRelation(); + QName getNormalizedRelation(RelationRegistry relationRegistry); + boolean isValid(); boolean isPresentInCurrentObject(); 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 d09d7d03c05..4048c02a61a 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 @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; import com.evolveum.midpoint.prism.PrismObject; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; @@ -38,7 +39,7 @@ public interface EvaluatedAssignmentTarget extends DebugDumpable { // if this target applies to focus (by direct assignment or by some inducement) // accepts all relations // TODO clarify this - boolean appliesToFocusWithAnyRelation(); + boolean appliesToFocusWithAnyRelation(RelationRegistry relationRegistry); /** * True for roles whose constructions are evaluated - i.e. those roles that are considered to be applied diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java index 8ef1ea4156a..5b9197d2e6e 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluationOrder.java @@ -50,7 +50,7 @@ public interface EvaluationOrder extends DebugDumpable, ShortDumpable, Cloneable // both current and new states must be defined Map diff(EvaluationOrder newState); - EvaluationOrder applyDifference(Map difference); + EvaluationOrder applyDifference(Map difference); boolean isDefined(); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/util/DeputyUtils.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/util/DeputyUtils.java index b78ffef675a..825b03137cc 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/util/DeputyUtils.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/util/DeputyUtils.java @@ -20,7 +20,7 @@ import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismReferenceValue; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.collections4.CollectionUtils; import org.jetbrains.annotations.NotNull; @@ -39,33 +39,35 @@ public class DeputyUtils { @NotNull - public static Collection getDelegatorReferences(@NotNull UserType user) { + public static Collection getDelegatorReferences(@NotNull UserType user, + @NotNull RelationRegistry relationRegistry) { return user.getDelegatedRef().stream() - .filter(ref -> ObjectTypeUtil.isDelegationRelation(ref.getRelation())) + .filter(ref -> relationRegistry.isDelegation(ref.getRelation())) .map(ref -> ref.asReferenceValue().clone()) .collect(Collectors.toList()); } @NotNull - public static Collection getDelegatorOids(@NotNull UserType user) { - return getDelegatorReferences(user).stream() + public static Collection getDelegatorOids(@NotNull UserType user, @NotNull RelationRegistry relationRegistry) { + return getDelegatorReferences(user, relationRegistry).stream() .map(PrismReferenceValue::getOid) .collect(Collectors.toList()); } - public static boolean isDelegationPresent(@NotNull UserType deputy, @NotNull String delegatorOid) { - return getDelegatorOids(deputy).contains(delegatorOid); + public static boolean isDelegationPresent(@NotNull UserType deputy, @NotNull String delegatorOid, + @NotNull RelationRegistry relationRegistry) { + return getDelegatorOids(deputy, relationRegistry).contains(delegatorOid); } - public static boolean isDelegationAssignment(AssignmentType assignment) { + public static boolean isDelegationAssignment(AssignmentType assignment, @NotNull RelationRegistry relationRegistry) { return assignment != null && assignment.getTargetRef() != null - && ObjectTypeUtil.isDelegationRelation(assignment.getTargetRef().getRelation()); + && relationRegistry.isDelegation(assignment.getTargetRef().getRelation()); } - public static boolean isDelegationPath(AssignmentPath assignmentPath) { + public static boolean isDelegationPath(@NotNull AssignmentPath assignmentPath, @NotNull RelationRegistry relationRegistry) { for (AssignmentPathSegment segment : assignmentPath.getSegments()) { - if (!isDelegationAssignment(segment.getAssignment())) { + if (!isDelegationAssignment(segment.getAssignment(), relationRegistry)) { return false; } } diff --git a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/SystemObjectCache.java b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/SystemObjectCache.java index 12804599e79..8c9ccb197e4 100644 --- a/model/model-common/src/main/java/com/evolveum/midpoint/model/common/SystemObjectCache.java +++ b/model/model-common/src/main/java/com/evolveum/midpoint/model/common/SystemObjectCache.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2016-2018 Evolveum * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -15,32 +15,22 @@ */ package com.evolveum.midpoint.model.common; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Component; - import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.constants.RelationTypes; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.exception.ObjectNotFoundException; 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.xml.ns._public.common.common_3.DisplayType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationsDefinitionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleManagementConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; + +import java.util.Collection; /** * Cache for system object such as SystemConfigurationType. This is a global cache, @@ -65,8 +55,6 @@ public class SystemObjectCache { private static final Trace LOGGER = TraceManager.getTrace(SystemObjectCache.class); - private static final String USER_DATA_KEY_RELATIONS = SystemObjectCache.class.getName() + ".relations"; - @Autowired @Qualifier("cacheRepositoryService") private transient RepositoryService cacheRepositoryService; @@ -131,59 +119,4 @@ private void loadSystemConfiguration(OperationResult result) throws ObjectNotFou public synchronized void invalidateCaches() { systemConfiguration = null; } - - public List getRelationDefinitions(OperationResult parentResult) throws ObjectNotFoundException, SchemaException { - PrismObject systemConfiguration = getSystemConfiguration(parentResult); - if (systemConfiguration == null) { - return createRelationDefinitions(null); - } - List cachedRelations = systemConfiguration.getUserData(USER_DATA_KEY_RELATIONS); - if (cachedRelations != null) { - return cachedRelations; - } - RoleManagementConfigurationType roleManagement = systemConfiguration.asObjectable().getRoleManagement(); - RelationsDefinitionType relationsDef = null; - if (roleManagement != null) { - relationsDef = roleManagement.getRelations(); - } - cachedRelations = createRelationDefinitions(relationsDef); - systemConfiguration.setUserData(USER_DATA_KEY_RELATIONS, cachedRelations); - return cachedRelations; - } - - private List createRelationDefinitions(RelationsDefinitionType relationsDef) { - List configuredRelations = null; - boolean includeDefaultRelations = true; - if (relationsDef != null) { - configuredRelations = relationsDef.getRelation(); - if (relationsDef.isIncludeDefaultRelations() != null && !relationsDef.isIncludeDefaultRelations()) { - includeDefaultRelations = false; - } - } - List relations = new ArrayList<>(); - if (configuredRelations != null) { - for (RelationDefinitionType configuredRelation: configuredRelations) { - relations.add(configuredRelation.clone()); - } - } - if (includeDefaultRelations) { - addDefaultRelations(relations); - } - return relations; - } - - private void addDefaultRelations(List relations) { - for (RelationTypes relationTypeEnum : RelationTypes.values()) { - if (ObjectTypeUtil.findRelationDefinition(relations, relationTypeEnum.getRelation()) != null) { - continue; - } - RelationDefinitionType relationDef = new RelationDefinitionType(); - relationDef.setRef(relationTypeEnum.getRelation()); - DisplayType display = new DisplayType(); - display.setLabel(relationTypeEnum.getLabelKey()); - relationDef.setDisplay(display); - relationDef.getCategory().addAll(Arrays.asList(relationTypeEnum.getCategories())); - relations.add(relationDef); - } - } } 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 29aa21d7371..bec30385d89 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 @@ -29,6 +29,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.repo.common.expression.*; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.BooleanUtils; import org.apache.commons.lang.Validate; @@ -105,12 +106,6 @@ import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.cache.RepositoryCache; import com.evolveum.midpoint.repo.common.CacheRegistry; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ObjectDeltaOperation; -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.RetrieveOption; -import com.evolveum.midpoint.schema.SearchResultList; -import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; @@ -182,6 +177,7 @@ public class ModelInteractionServiceImpl implements ModelInteractionService { @Qualifier("cacheRepositoryService") private transient RepositoryService cacheRepositoryService; @Autowired private SystemObjectCache systemObjectCache; + @Autowired private RelationRegistry relationRegistry; @Autowired private ValuePolicyProcessor policyProcessor; @Autowired private Protector protector; @Autowired private PrismContext prismContext; @@ -1484,6 +1480,7 @@ private boolean determineDeputyValidity(PrismObject potentialDeputy, L .channel(null) .objectResolver(objectResolver) .systemObjectCache(systemObjectCache) + .relationRegistry(relationRegistry) .prismContext(prismContext) .mappingFactory(mappingFactory) .mappingEvaluator(mappingEvaluator) @@ -1496,7 +1493,7 @@ private boolean determineDeputyValidity(PrismObject potentialDeputy, L AssignmentEvaluator assignmentEvaluator = builder.build(); for (AssignmentType assignmentType: potentialDeputy.asObjectable().getAssignment()) { - if (!DeputyUtils.isDelegationAssignment(assignmentType)) { + if (!DeputyUtils.isDelegationAssignment(assignmentType, relationRegistry)) { continue; } try { @@ -1512,7 +1509,7 @@ private boolean determineDeputyValidity(PrismObject potentialDeputy, L } for (EvaluatedAssignmentTarget target : assignment.getRoles().getNonNegativeValues()) { if (target.getTarget() != null && target.getTarget().getOid() != null - && DeputyUtils.isDelegationPath(target.getAssignmentPath()) + && DeputyUtils.isDelegationPath(target.getAssignmentPath(), relationRegistry) && ObjectTypeUtil.containsOid(assignees, target.getTarget().getOid())) { List limitations = DeputyUtils.extractLimitations(target.getAssignmentPath()); if (workItem != null && DeputyUtils.limitationsAllow(limitations, privilegeLimitationItemName, workItem) @@ -1679,8 +1676,8 @@ public void refreshPrincipal(String oid) throws ObjectNotFoundException, SchemaE } @Override - public List getRelationDefinitions(OperationResult parentResult) throws ObjectNotFoundException, SchemaException { - return systemObjectCache.getRelationDefinitions(parentResult); + public List getRelationDefinitions() { + return relationRegistry.getRelationDefinitions(); } @NotNull diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java index d784c999aa2..f3edda12999 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/controller/SystemConfigurationHandler.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.SystemConfigurationTypeUtil; import com.evolveum.midpoint.security.api.SecurityUtil; @@ -66,6 +67,7 @@ public class SystemConfigurationHandler implements ChangeHook { @Autowired private HookRegistry hookRegistry; @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; @Autowired @Qualifier("cacheRepositoryService") @@ -141,6 +143,7 @@ public HookOperationMode invoke(@NotNull ModelContext applyPrismConfiguration(configType); cacheRepositoryService.applyFullTextSearchConfiguration(config.asObjectable().getFullTextSearch()); + relationRegistry.applyRelationConfiguration(config.asObjectable()); SystemConfigurationTypeUtil.applyOperationResultHandling(config.asObjectable()); result.recordSuccessIfUnknown(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java index 258643bd013..3f321ed90b8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/OrgStructFunctionsImpl.java @@ -20,12 +20,10 @@ import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectQuery; -import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.api.RepositoryService; -import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -65,6 +63,9 @@ public class OrgStructFunctionsImpl implements OrgStructFunctions { @Autowired private PrismContext prismContext; + @Autowired + private RelationRegistry relationRegistry; + /** * Returns a list of user's managers. Formally, for each Org O which this user has (any) relation to, * all managers of O are added to the result. @@ -73,13 +74,11 @@ public class OrgStructFunctionsImpl implements OrgStructFunctions { * or defining who is a manager of a user who is itself a manager in its org.unit. (A parent org unit manager, * perhaps.) * - * @param user * @return list of oids of the respective managers - * @throws SchemaException - * @throws ObjectNotFoundException */ @Override - public Collection getManagersOids(UserType user, boolean preAuthorized) throws SchemaException, ObjectNotFoundException, SecurityViolationException { + public Collection getManagersOids(UserType user, boolean preAuthorized) throws SchemaException, + SecurityViolationException { Set retval = new HashSet<>(); for (UserType u : getManagers(user, preAuthorized)) { retval.add(u.getOid()); @@ -88,7 +87,8 @@ public Collection getManagersOids(UserType user, boolean preAuthorized) } @Override - public Collection getManagersOidsExceptUser(UserType user, boolean preAuthorized) throws SchemaException, ObjectNotFoundException, SecurityViolationException { + public Collection getManagersOidsExceptUser(UserType user, boolean preAuthorized) throws SchemaException, + SecurityViolationException { Set retval = new HashSet<>(); for (UserType u : getManagers(user, preAuthorized)) { if (!u.getOid().equals(user.getOid())) { @@ -110,17 +110,20 @@ public Collection getManagersOidsExceptUser(@NotNull Collection getManagers(UserType user, boolean preAuthorized) throws SchemaException, ObjectNotFoundException, SecurityViolationException { + public Collection getManagers(UserType user, boolean preAuthorized) throws SchemaException, + SecurityViolationException { return getManagers(user, null, false, preAuthorized); } @Override - public Collection getManagersByOrgType(UserType user, String orgType, boolean preAuthorized) throws SchemaException, ObjectNotFoundException, SecurityViolationException { + public Collection getManagersByOrgType(UserType user, String orgType, boolean preAuthorized) throws SchemaException, + SecurityViolationException { return getManagers(user, orgType, false, preAuthorized); } @Override - public Collection getManagers(UserType user, String orgType, boolean allowSelf, boolean preAuthorized) throws SchemaException, ObjectNotFoundException, SecurityViolationException { + public Collection getManagers(UserType user, String orgType, boolean allowSelf, boolean preAuthorized) throws SchemaException, + SecurityViolationException { Set retval = new HashSet<>(); if (user == null) { return retval; @@ -195,7 +198,7 @@ public Collection getOrgUnits(UserType user, QName relation, boolean pre return retval; } for (ObjectReferenceType orgRef : user.getParentOrgRef()) { - if (ObjectTypeUtil.relationMatches(relation, orgRef.getRelation())) { + if (prismContext.relationMatches(relation, orgRef.getRelation())) { retval.add(orgRef.getOid()); } } @@ -264,7 +267,7 @@ public Collection getParentOrgs(ObjectType object, QName relation, Stri List parentOrgRefs = object.getParentOrgRef(); List parentOrgs = new ArrayList<>(parentOrgRefs.size()); for (ObjectReferenceType parentOrgRef: parentOrgRefs) { - if (!ObjectTypeUtil.relationMatches(relation, parentOrgRef.getRelation())) { + if (!prismContext.relationMatches(relation, parentOrgRef.getRelation())) { continue; } OrgType parentOrg; @@ -290,12 +293,7 @@ public Collection getManagersOfOrg(String orgOid, boolean preAuthorize Set retval = new HashSet<>(); OperationResult result = new OperationResult("getManagerOfOrg"); - PrismReferenceValue parentOrgRefVal = new PrismReferenceValue(orgOid, OrgType.COMPLEX_TYPE); - parentOrgRefVal.setRelation(SchemaConstants.ORG_MANAGER); - ObjectQuery objectQuery = QueryBuilder.queryFor(ObjectType.class, prismContext) - .item(ObjectType.F_PARENT_ORG_REF).ref(parentOrgRefVal) - .build(); - + ObjectQuery objectQuery = ObjectTypeUtil.createManagerQuery(ObjectType.class, orgOid, relationRegistry, prismContext); List> members = searchObjects(ObjectType.class, objectQuery, result, preAuthorized); for (PrismObject member : members) { if (member.asObjectable() instanceof UserType) { @@ -309,7 +307,8 @@ public Collection getManagersOfOrg(String orgOid, boolean preAuthorize @Override public boolean isManagerOf(UserType user, String orgOid, boolean preAuthorized) { for (ObjectReferenceType objectReferenceType : user.getParentOrgRef()) { - if (orgOid.equals(objectReferenceType.getOid()) && ObjectTypeUtil.isManagerRelation(objectReferenceType.getRelation())) { + if (orgOid.equals(objectReferenceType.getOid()) && + relationRegistry.isManager(objectReferenceType.getRelation())) { return true; } } @@ -319,7 +318,7 @@ public boolean isManagerOf(UserType user, String orgOid, boolean preAuthorized) @Override public boolean isManager(UserType user) { for (ObjectReferenceType objectReferenceType : user.getParentOrgRef()) { - if (ObjectTypeUtil.isManagerRelation(objectReferenceType.getRelation())) { + if (relationRegistry.isManager(objectReferenceType.getRelation())) { return true; } } @@ -329,7 +328,7 @@ public boolean isManager(UserType user) { @Override public boolean isManagerOfOrgType(UserType user, String orgType, boolean preAuthorized) throws SchemaException { for (ObjectReferenceType objectReferenceType : user.getParentOrgRef()) { - if (ObjectTypeUtil.isManagerRelation(objectReferenceType.getRelation())) { + if (relationRegistry.isManager(objectReferenceType.getRelation())) { OrgType org = getOrgByOid(objectReferenceType.getOid(), preAuthorized); if (determineSubTypes(org).contains(orgType)) { return true; 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 53f2323c595..e28cb97fdf6 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 @@ -52,6 +52,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.ResultHandler; import com.evolveum.midpoint.schema.VirtualAssignmenetSpecification; import com.evolveum.midpoint.schema.constants.ExpressionConstants; @@ -101,6 +102,7 @@ public class AssignmentEvaluator { private final String channel; private final ObjectResolver objectResolver; private final SystemObjectCache systemObjectCache; + private final RelationRegistry relationRegistry; private final PrismContext prismContext; private final MappingFactory mappingFactory; private final ActivationComputer activationComputer; @@ -118,6 +120,7 @@ private AssignmentEvaluator(Builder builder) { channel = builder.channel; objectResolver = builder.objectResolver; systemObjectCache = builder.systemObjectCache; + relationRegistry = builder.relationRegistry; prismContext = builder.prismContext; mappingFactory = builder.mappingFactory; activationComputer = builder.activationComputer; @@ -233,9 +236,9 @@ public EvaluatedAssignmentImpl evaluate( new AssignmentPathImpl(prismContext), primaryAssignmentMode, evaluateOld, task, result); - AssignmentPathSegmentImpl segment = new AssignmentPathSegmentImpl(source, sourceDescription, assignmentIdi, true, evaluateOld); + AssignmentPathSegmentImpl segment = new AssignmentPathSegmentImpl(source, sourceDescription, assignmentIdi, true, evaluateOld, relationRegistry, prismContext); segment.setEvaluationOrder(getInitialEvaluationOrder(assignmentIdi, ctx)); - segment.setEvaluationOrderForTarget(EvaluationOrderImpl.ZERO); + segment.setEvaluationOrderForTarget(EvaluationOrderImpl.zero(relationRegistry)); segment.setValidityOverride(true); segment.setPathToSourceValid(true); segment.setProcessMembership(true); @@ -251,7 +254,7 @@ private EvaluationOrder getInitialEvaluationOrder( ItemDeltaItem, PrismContainerDefinition> assignmentIdi, EvaluationContext ctx) { AssignmentType assignmentType = LensUtil.getAssignmentType(assignmentIdi, ctx.evaluateOld); - return EvaluationOrderImpl.ZERO.advance(getRelation(assignmentType)); + return EvaluationOrderImpl.zero(relationRegistry).advance(getRelation(assignmentType)); } /** @@ -432,12 +435,12 @@ private boolean evaluateSegmentContent(AssignmentPathSegm } if (assignmentType.getTarget() != null || assignmentType.getTargetRef() != null) { QName relation = getRelation(assignmentType); - if (loginMode && !ObjectTypeUtil.processRelationOnLogin(relation)) { + if (loginMode && !relationRegistry.processRelationOnLogin(relation)) { 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) && !shouldEvaluateAllAssignmentRelationsOnRecompute()) { + !relationRegistry.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 @@ -864,7 +867,7 @@ private void evaluateAssignment(AssignmentPathSegmentImpl segment, PlusMinusZero ObjectType orderOneObject = getOrderOneObject(segment); - if (ObjectTypeUtil.isDelegationRelation(relation)) { + if (relationRegistry.isDelegation(relation)) { // We have to handle assignments as though they were inducements here. if (!isAllowedByLimitations(segment, roleAssignment, ctx)) { if (LOGGER.isTraceEnabled()) { @@ -882,7 +885,7 @@ private void evaluateAssignment(AssignmentPathSegmentImpl segment, PlusMinusZero segment.getEvaluationOrder().shortDump(), targetType, FocusTypeUtil.dumpAssignment(roleAssignment), nextEvaluationOrder); } String nextSourceDescription = targetType+" in "+segment.sourceDescription; - AssignmentPathSegmentImpl nextSegment = new AssignmentPathSegmentImpl(targetType, nextSourceDescription, roleAssignment, true); + AssignmentPathSegmentImpl nextSegment = new AssignmentPathSegmentImpl(targetType, nextSourceDescription, roleAssignment, true, relationRegistry, prismContext); nextSegment.setRelation(nextRelation); nextSegment.setEvaluationOrder(nextEvaluationOrder); nextSegment.setEvaluationOrderForTarget(nextEvaluationOrderForTarget); @@ -919,7 +922,7 @@ private void evaluateInducement(AssignmentPathSegmentImpl segment, PlusMinusZero return; } String subSourceDescription = targetType+" in "+segment.sourceDescription; - AssignmentPathSegmentImpl nextSegment = new AssignmentPathSegmentImpl(targetType, subSourceDescription, inducement, false); + AssignmentPathSegmentImpl nextSegment = new AssignmentPathSegmentImpl(targetType, subSourceDescription, inducement, false, relationRegistry, prismContext); // note that 'old' and 'new' values for assignment in nextSegment are the same boolean nextIsMatchingOrder = AssignmentPathSegmentImpl.computeMatchingOrder( segment.getEvaluationOrder(), nextSegment.getAssignmentNew()); @@ -1003,7 +1006,7 @@ private void adjustOrder(Holder evaluationOrderHolder, Holder evaluationOrderHolder, Holder targetClass, QName relation, Object targetDesc, EvaluationContext ctx) { - if (ctx.assignmentPath.getSegments().stream().anyMatch(aps -> DeputyUtils.isDelegationAssignment(aps.getAssignment(ctx.evaluateOld)))) { + if (ctx.assignmentPath.getSegments().stream().anyMatch(aps -> DeputyUtils.isDelegationAssignment(aps.getAssignment(ctx.evaluateOld), + relationRegistry))) { addIfNotThere(ctx.evalAssignment.getDelegationRefVals(), ctx.evalAssignment::addDelegationRefVal, membershipRefVal, "delegationRef", targetDesc); } else { @@ -1112,7 +1117,7 @@ private void collectMembershipRefVal(PrismReferenceValue membershipRefVal, Class "membershipRef", targetDesc); } } - if (OrgType.class.isAssignableFrom(targetClass) && (ObjectTypeUtil.isDefaultRelation(relation) || ObjectTypeUtil.isManagerRelation(relation))) { + if (OrgType.class.isAssignableFrom(targetClass) && relationRegistry.includeIntoParentOrgRef(relation)) { addIfNotThere(ctx.evalAssignment.getOrgRefVals(), ctx.evalAssignment::addOrgRefVal, membershipRefVal, "orgRef", targetDesc); } @@ -1145,7 +1150,7 @@ private void checkRelationWithTarget(AssignmentPathSegmentImpl segment, FocusTyp if (targetType instanceof AbstractRoleType) { // OK, just go on } else if (targetType instanceof UserType) { - if (!ObjectTypeUtil.isDelegationRelation(relation)) { + if (!relationRegistry.isDelegation(relation)) { throw new SchemaException("Unsupported relation " + relation + " for assignment of target type " + targetType + " in " + segment.sourceDescription); } } else { @@ -1182,16 +1187,13 @@ private boolean isAllowedByLimitations(AssignmentPathSegment segment, Assignment // As for the case of targetRef==null: we want to pass target-less assignments (focus mappings, policy rules etc) // from the delegator to delegatee. To block them we should use order constraints (but also for assignments?). return targetLimitation == null || nextAssignment.getTargetRef() == null || - FocusTypeUtil.selectorMatches(targetLimitation, nextAssignment); + FocusTypeUtil.selectorMatches(targetLimitation, nextAssignment, prismContext); } } private boolean isDeputyDelegation(AssignmentType assignmentType) { ObjectReferenceType targetRef = assignmentType.getTargetRef(); - if (targetRef == null) { - return false; - } - return ObjectTypeUtil.isDelegationRelation(targetRef.getRelation()); + return targetRef != null && relationRegistry.isDelegation(targetRef.getRelation()); } private Authorization createAuthorization(AuthorizationType authorizationType, String sourceDesc) { @@ -1285,7 +1287,7 @@ public PrismValueDeltaSetTriple> evaluateCondition(M @Nullable private QName getRelation(AssignmentType assignmentType) { return assignmentType.getTargetRef() != null ? - ObjectTypeUtil.normalizeRelation(assignmentType.getTargetRef().getRelation()) : null; + relationRegistry.normalizeRelation(assignmentType.getTargetRef().getRelation()) : null; } public static final class Builder { @@ -1295,6 +1297,7 @@ public static final class Builder { private String channel; private ObjectResolver objectResolver; private SystemObjectCache systemObjectCache; + private RelationRegistry relationRegistry; private PrismContext prismContext; private MappingFactory mappingFactory; private ActivationComputer activationComputer; @@ -1336,6 +1339,11 @@ public Builder systemObjectCache(SystemObjectCache val) { return this; } + public Builder relationRegistry(RelationRegistry val) { + relationRegistry = val; + return this; + } + public Builder prismContext(PrismContext val) { prismContext = val; return this; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java index ace129e2023..9fa944e68f0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java @@ -17,6 +17,7 @@ import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.common.expression.ItemDeltaItem; import com.evolveum.midpoint.model.api.context.AssignmentPathSegment; import com.evolveum.midpoint.model.api.context.EvaluationOrder; @@ -24,6 +25,7 @@ import com.evolveum.midpoint.prism.PrismContainerDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.QNameUtil; @@ -52,6 +54,9 @@ public class AssignmentPathSegmentImpl implements AssignmentPathSegment { private static final Trace LOGGER = TraceManager.getTrace(AssignmentPathSegmentImpl.class); + @NotNull private final RelationRegistry relationRegistry; + @NotNull private final PrismContext prismContext; + // "assignment path segment" information final ObjectType source; // we avoid "getter" notation for some final fields to simplify client code @@ -265,16 +270,20 @@ public class AssignmentPathSegmentImpl implements AssignmentPathSegment { AssignmentPathSegmentImpl(ObjectType source, String sourceDescription, ItemDeltaItem, PrismContainerDefinition> assignmentIdi, - boolean isAssignment, boolean evaluatedForOld) { + boolean isAssignment, boolean evaluatedForOld, @NotNull RelationRegistry relationRegistry, + @NotNull PrismContext prismContext) { this.source = source; this.sourceDescription = sourceDescription; this.assignmentIdi = assignmentIdi; this.isAssignment = isAssignment; this.evaluatedForOld = evaluatedForOld; + this.relationRegistry = relationRegistry; + this.prismContext = prismContext; } - AssignmentPathSegmentImpl(ObjectType source, String sourceDescription, AssignmentType assignment, boolean isAssignment) { - this(source, sourceDescription, createAssignmentIdi(assignment), isAssignment, false); + AssignmentPathSegmentImpl(ObjectType source, String sourceDescription, AssignmentType assignment, boolean isAssignment, + RelationRegistry relationRegistry, PrismContext prismContext) { + this(source, sourceDescription, createAssignmentIdi(assignment), isAssignment, false, relationRegistry, prismContext); } private static ItemDeltaItem, PrismContainerDefinition> createAssignmentIdi( @@ -479,7 +488,7 @@ private static boolean isMatchingConstraint(OrderConstraintsType orderConstraint @Override public boolean isDelegation() { - return ObjectTypeUtil.isDelegationRelation(relation); + return relationRegistry.isDelegation(relation); } @Override @@ -642,7 +651,7 @@ public boolean matches(@NotNull List orderConstraints) { // that are to be checked for equivalency @Override public boolean equivalent(AssignmentPathSegment otherSegment) { - if (!ObjectTypeUtil.relationsEquivalent(relation, otherSegment.getRelation())) { + if (!prismContext.relationsEquivalent(relation, otherSegment.getRelation())) { return false; } if (target == null && otherSegment.getTarget() == null) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index bcf021fef48..c8d1143e6b0 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -58,6 +58,7 @@ import com.evolveum.midpoint.provisioning.api.ResourceOperationListener; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.ObjectDeltaOperation; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; @@ -106,7 +107,6 @@ import javax.xml.namespace.QName; import java.util.*; -import java.util.Map.Entry; import static com.evolveum.midpoint.model.api.ProgressInformation.ActivityType.CLOCKWORK; import static com.evolveum.midpoint.model.api.ProgressInformation.ActivityType.WAITING; @@ -138,6 +138,7 @@ public class Clockwork { @Autowired private Clock clock; @Autowired private ModelObjectResolver objectResolver; @Autowired private SystemObjectCache systemObjectCache; + @Autowired private RelationRegistry relationRegistry; @Autowired private transient ProvisioningService provisioningService; @Autowired private transient ChangeNotificationDispatcher changeNotificationDispatcher; @Autowired private ExpressionFactory expressionFactory; @@ -1540,7 +1541,7 @@ private void authorizeAssignmentRequ assignmentDelta.addValuesToAdd(changedAssignment.asPrismContainerValue().clone()); QName relation = targetRef.getRelation(); if (relation == null) { - relation = SchemaConstants.ORG_DEFAULT; + relation = prismContext.getDefaultRelation(); } AuthorizationParameters autzParams = new AuthorizationParameters.Builder() .object(object) @@ -1570,7 +1571,7 @@ private void authorizeAssignmentRequ LOGGER.debug("{} of target {} to {} allowed with {} authorization", operationDesc, target, object, assignActionUrl); continue; } - if (ObjectTypeUtil.isDelegationRelation(relation)) { + if (relationRegistry.isDelegation(relation)) { if (securityEnforcer.isAuthorized(ModelAuthorizationAction.DELEGATE.getUrl(), getRequestAuthorizationPhase(context), autzParams, ownerResolver, task, result)) { if (LOGGER.isDebugEnabled()) { LOGGER.debug("{} of target {} to {} allowed with {} authorization", operationDesc, target, object, ModelAuthorizationAction.DELEGATE.getUrl()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java index 7244db80455..4f5ac0ff591 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentImpl.java @@ -30,8 +30,8 @@ import com.evolveum.midpoint.model.common.mapping.PrismValueDeltaSetTripleProducer; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.delta.PlusMinusZero; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.Authorization; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugUtil; @@ -122,17 +122,24 @@ public AssignmentType getAssignmentType(boolean old) { return asContainerable(assignmentIdi.getSingleValue(old)); } - @Override - public QName getRelation() { + private ObjectReferenceType getTargetRef() { AssignmentType assignmentType = getAssignmentType(); if (assignmentType == null) { return null; } - ObjectReferenceType targetRef = assignmentType.getTargetRef(); - if (targetRef == null) { - return null; - } - return ObjectTypeUtil.normalizeRelation(targetRef.getRelation()); + return assignmentType.getTargetRef(); + } + + @Override + public QName getRelation() { + ObjectReferenceType targetRef = getTargetRef(); + return targetRef != null ? targetRef.getRelation() : null; + } + + @Override + public QName getNormalizedRelation(RelationRegistry relationRegistry) { + ObjectReferenceType targetRef = getTargetRef(); + return targetRef != null ? relationRegistry.normalizeRelation(targetRef.getRelation()) : null; } @NotNull diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetCache.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetCache.java index 9a330e939a9..45d8dfc807d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetCache.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedAssignmentTargetCache.java @@ -80,7 +80,7 @@ private boolean isCacheable(AbstractRoleType targetType) { public boolean canSkip(AssignmentPathSegmentImpl segment, PlusMinusZero mode) { ObjectType target = segment.getTarget(); - if (target == null || !(target instanceof AbstractRoleType)) { + if (!(target instanceof AbstractRoleType)) { // LOGGER.trace("Non-skippable target: {}", target); return false; } 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 d57dd9f143a..ced3c10fd30 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 @@ -18,11 +18,12 @@ 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.schema.RelationRegistry; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; +import javax.xml.namespace.QName; import java.util.ArrayList; import java.util.Collection; @@ -66,7 +67,7 @@ public boolean appliesToFocus() { } @Override - public boolean appliesToFocusWithAnyRelation() { + public boolean appliesToFocusWithAnyRelation(RelationRegistry relationRegistry) { // TODO clean up this method if (appliesToFocus()) { // This covers any indirectly assigned targets, like user -> org -> parent-org -> root-org -(I)-> role @@ -77,7 +78,17 @@ public boolean appliesToFocusWithAnyRelation() { // Actually I think these should be also covered by appliesToFocus() i.e. their isMatchingOrder should be true. // But for some reason it is currently not so. EvaluationOrder order = assignmentPath.last().getEvaluationOrder(); - return order.getSummaryOrder() == 1 || order.getSummaryOrder() == 0 && order.getMatchingRelationOrder(SchemaConstants.ORG_DEPUTY) > 0; + if (order.getSummaryOrder() == 1) { + return true; + } + if (order.getSummaryOrder() != 0) { + return false; + } + int delegationCount = 0; + for (QName delegationRelation : relationRegistry.getAllRelationsFor(RelationKindType.DELEGATION)) { + delegationCount += order.getMatchingRelationOrder(delegationRelation); + } + return delegationCount > 0; } @Override diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java index 98bea9869ca..1ab5497bb66 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java @@ -22,10 +22,9 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.model.api.context.EvaluationOrder; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.QNameUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections4.MultiSet; import org.jetbrains.annotations.NotNull; @@ -37,16 +36,24 @@ public class EvaluationOrderImpl implements EvaluationOrder { public static EvaluationOrder UNDEFINED = new UndefinedEvaluationOrderImpl(); - public static EvaluationOrder ZERO = createZero(); - public static EvaluationOrder ONE = ZERO.advance(SchemaConstants.ORG_DEFAULT); @NotNull private final HashMap orderMap; // see checkConsistence + @NotNull private final RelationRegistry relationRegistry; + + public static EvaluationOrder zero(RelationRegistry relationRegistry) { + EvaluationOrderImpl eo = new EvaluationOrderImpl(relationRegistry); + eo.orderMap.put(relationRegistry.getDefaultRelation(), 0); + return eo; + } private void checkConsistence() { if (CHECK_CONSISTENCE) { orderMap.forEach((r, v) -> { - if (r == null || QNameUtil.noNamespace(r)) { - throw new IllegalStateException("Null or unqualified relation " + r + " in " + this); + if (r == null) { + throw new IllegalStateException("Null relation in " + this); + } + if (isNotNormalized(r)) { + throw new IllegalStateException("Unnormalized relation " + r + " in " + this); } if (v == null) { throw new IllegalStateException("Null value in for relation " + r + " in " + this); @@ -55,27 +62,27 @@ private void checkConsistence() { } } + private boolean isNotNormalized(QName relation) { + return relation == null || !relation.equals(relationRegistry.normalizeRelation(relation)); + } + private static final boolean CHECK_CONSISTENCE = true; - private EvaluationOrderImpl() { + private EvaluationOrderImpl(@NotNull RelationRegistry relationRegistry) { + this.relationRegistry = relationRegistry; orderMap = new HashMap<>(); } private EvaluationOrderImpl(EvaluationOrderImpl that) { + this.relationRegistry = that.relationRegistry; this.orderMap = new HashMap<>(that.orderMap); } - private static EvaluationOrderImpl createZero() { - EvaluationOrderImpl eo = new EvaluationOrderImpl(); - eo.orderMap.put(SchemaConstants.ORG_DEFAULT, 0); - return eo; - } - @Override public int getSummaryOrder() { int rv = 0; for (Entry entry : orderMap.entrySet()) { - if (!ObjectTypeUtil.isDelegationRelation(entry.getKey())) { + if (!relationRegistry.isDelegation(entry.getKey())) { rv += entry.getValue(); } } @@ -107,7 +114,7 @@ public EvaluationOrder decrease(MultiSet relations) { // must always be private: public interface will not allow to modify object state! private void advanceThis(QName relation, int amount) { - @NotNull QName normalizedRelation = ObjectTypeUtil.normalizeRelation(relation); + @NotNull QName normalizedRelation = relationRegistry.normalizeRelation(relation); orderMap.put(normalizedRelation, getMatchingRelationOrder(normalizedRelation) + amount); } @@ -117,13 +124,13 @@ public int getMatchingRelationOrder(QName relation) { if (relation == null) { return getSummaryOrder(); } - return orderMap.getOrDefault(ObjectTypeUtil.normalizeRelation(relation), 0); + return orderMap.getOrDefault(relationRegistry.normalizeRelation(relation), 0); } @Override public EvaluationOrder resetOrder(QName relation, int newOrder) { EvaluationOrderImpl clone = clone(); - clone.orderMap.put(ObjectTypeUtil.normalizeRelation(relation), newOrder); + clone.orderMap.put(relationRegistry.normalizeRelation(relation), newOrder); clone.checkConsistence(); return clone; } @@ -142,7 +149,7 @@ public Map diff(EvaluationOrder newState) { } @Override - public EvaluationOrder applyDifference(Map difference) { + public EvaluationOrder applyDifference(Map difference) { EvaluationOrderImpl clone = clone(); difference.forEach((relation, count) -> clone.advanceThis(relation, count)); clone.checkConsistence(); @@ -214,7 +221,8 @@ public void shortDump(StringBuilder sb) { @Override public Collection getExtraRelations() { return orderMap.entrySet().stream() - .filter(e -> !ObjectTypeUtil.isMembershipRelation(e.getKey()) && !ObjectTypeUtil.isDelegationRelation(e.getKey()) && e.getValue() > 0) + .filter(e -> !relationRegistry.isMembership(e.getKey()) && + !relationRegistry.isDelegation(e.getKey()) && e.getValue() > 0) .map(e -> e.getKey()) .collect(Collectors.toSet()); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 74c84b3c17f..7687a90c857 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -906,11 +906,6 @@ public static LensObjectDeltaOperation createObjectDel return objectDeltaOp; } - @Deprecated - public static boolean isDelegationRelation(QName relation) { - return ObjectTypeUtil.isDelegationRelation(relation); - } - public static void triggerRule(@NotNull EvaluatedPolicyRule rule, Collection> triggers, Collection policySituations) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java index 119282701ae..14eaebefcb4 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.model.impl.lens.projector.MappingEvaluator; import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyRuleProcessor; import com.evolveum.midpoint.model.impl.util.ModelImplUtils; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; @@ -122,6 +123,9 @@ public class AssignmentProcessor { @Autowired private SystemObjectCache systemObjectCache; + @Autowired + private RelationRegistry relationRegistry; + @Autowired private PrismContext prismContext; @@ -970,15 +974,15 @@ private void addReferences(Collection extractedReferences, boolean found = false; for (PrismReferenceValue exVal: extractedReferences) { if (MiscUtil.equals(exVal.getOid(), reference.getOid()) - && ObjectTypeUtil.relationsEquivalent(exVal.getRelation(), reference.getRelation())) { + && prismContext.relationsEquivalent(exVal.getRelation(), reference.getRelation())) { found = true; break; } } if (!found) { PrismReferenceValue ref = reference.cloneComplex(CloneStrategy.REUSE); // clone without full object instead of calling canonicalize() - if (ref.getRelation() != null && QNameUtil.isUnqualified(ref.getRelation())) { - ref.setRelation(new QName(SchemaConstants.NS_ORG, ref.getRelation().getLocalPart(), SchemaConstants.PREFIX_NS_ORG)); + if (ref.getRelation() == null || QNameUtil.isUnqualified(ref.getRelation())) { + ref.setRelation(relationRegistry.normalizeRelation(ref.getRelation())); } extractedReferences.add(ref); } @@ -994,6 +998,7 @@ private AssignmentEvaluator createAssignmentEvaluator(L .channel(context.getChannel()) .objectResolver(objectResolver) .systemObjectCache(systemObjectCache) + .relationRegistry(relationRegistry) .prismContext(prismContext) .mappingFactory(mappingFactory) .mappingEvaluator(mappingEvaluator) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/AssignmentModificationConstraintEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/AssignmentModificationConstraintEvaluator.java index fb3b46ee03e..b98891e2fee 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/AssignmentModificationConstraintEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/AssignmentModificationConstraintEvaluator.java @@ -24,7 +24,6 @@ import com.evolveum.midpoint.prism.path.ItemPath; 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.ObjectTypeUtil; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.util.LocalizableMessageBuilder; @@ -87,10 +86,11 @@ private LocalizableMessage createMessage(JAXBElement ctx, OperationResult result) throws ExpressionEvaluationException, ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, SecurityViolationException { String keyPostfix = createStateKey(ctx) + createOperationKey(ctx); + QName relation = ctx.evaluatedAssignment.getNormalizedRelation(relationRegistry); LocalizableMessage builtInMessage = new LocalizableMessageBuilder() .key(SchemaConstants.DEFAULT_POLICY_CONSTRAINT_KEY_PREFIX + CONSTRAINT_KEY_PREFIX + keyPostfix) .arg(ObjectTypeUtil.createDisplayInformation(ctx.evaluatedAssignment.getTarget(), false)) - .arg(ctx.evaluatedAssignment.getRelation() != null ? ctx.evaluatedAssignment.getRelation().getLocalPart() : null) + .arg(relation != null ? relation.getLocalPart() : null) .build(); return evaluatorHelper.createLocalizableMessage(constraint, ctx, builtInMessage, result); } @@ -123,7 +123,7 @@ private boolean relationMatches(AssignmentModificationPoli List relationsToCheck = constraint.getRelation().isEmpty() ? singletonList(null) : constraint.getRelation(); for (QName constraintRelation : relationsToCheck) { - if (MiscSchemaUtil.compareRelation(constraintRelation, ctx.evaluatedAssignment.getRelation())) { + if (prismContext.relationMatches(constraintRelation, ctx.evaluatedAssignment.getNormalizedRelation(relationRegistry))) { return true; } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ExclusionConstraintEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ExclusionConstraintEvaluator.java index 81ab61a2abb..1dbb2bbe425 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ExclusionConstraintEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ExclusionConstraintEvaluator.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.polystring.PolyString; import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -70,6 +71,7 @@ public class ExclusionConstraintEvaluator implements PolicyConstraintEvaluator EvaluatedPolicyRuleTrigger evaluate(JAXBElement second ? Collections.singletonList(primaryRelationToMatch) : new ArrayList<>(secondaryRelationsToMatch); if (relationsToMatch.isEmpty()) { - relationsToMatch.add(SchemaConstants.ORG_DEFAULT); + relationsToMatch.add(prismContext.getDefaultRelation()); } - return ObjectTypeUtil.relationMatches(relationsToMatch, assignment.getTargetRef().getRelation()); + return prismContext.relationMatches(relationsToMatch, assignment.getTargetRef().getRelation()); } } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ModificationConstraintEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ModificationConstraintEvaluator.java index f3f9e6d1b84..3782ad1c953 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ModificationConstraintEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/ModificationConstraintEvaluator.java @@ -18,6 +18,8 @@ import com.evolveum.midpoint.model.api.context.ModelState; import com.evolveum.midpoint.model.impl.lens.projector.policy.PolicyRuleEvaluationContext; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; @@ -40,6 +42,8 @@ public abstract class ModificationConstraintEvaluator String createStateKey(PolicyRuleEvaluationContext rctx) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/MultiplicityConstraintEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/MultiplicityConstraintEvaluator.java index dda2d3119fb..2ba84b647bb 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/MultiplicityConstraintEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/evaluators/MultiplicityConstraintEvaluator.java @@ -32,6 +32,7 @@ import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.prism.xml.XsdTypeMapper; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -71,6 +72,7 @@ public class MultiplicityConstraintEvaluator implements PolicyConstraintEvaluato @Autowired private ConstraintEvaluatorHelper evaluatorHelper; @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; @Autowired @Qualifier("cacheRepositoryService") private RepositoryService repositoryService; @Override @@ -95,7 +97,7 @@ private EvaluatedPolicyRuleTrigger evaluateForObject( return null; } List relationsToCheck = constraint.getValue().getRelation().isEmpty() - ? Collections.singletonList(SchemaConstants.ORG_DEFAULT) : constraint.getValue().getRelation(); + ? Collections.singletonList(prismContext.getDefaultRelation()) : constraint.getValue().getRelation(); AbstractRoleType targetRole = (AbstractRoleType) target.asObjectable(); boolean isMin = QNameUtil.match(constraint.getName(), PolicyConstraintsType.F_MIN_ASSIGNEES) @@ -175,8 +177,8 @@ private EvaluatedPolicyRuleTrigger EvaluatedPolicyRuleTrigger ObjectTypeUtil.relationMatches(constraintRelation, relation)); + .anyMatch(constraintRelation -> prismContext.relationMatches(constraintRelation, relation)); } private List getConstraintRelations(MultiplicityPolicyConstraintType constraint) { return !constraint.getRelation().isEmpty() ? constraint.getRelation() : - Collections.singletonList(SchemaConstants.ORG_DEFAULT); + Collections.singletonList(prismContext.getDefaultRelation()); } /** diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java index ce2d1795bdf..4b309495ecf 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/security/UserProfileServiceImpl.java @@ -41,19 +41,16 @@ import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.delta.PlusMinusZero; import com.evolveum.midpoint.prism.polystring.PolyString; -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.repo.api.RepositoryService; -import com.evolveum.midpoint.schema.ResultHandler; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.AdminGuiConfigTypeUtil; import com.evolveum.midpoint.schema.util.FocusTypeUtil; -import com.evolveum.midpoint.schema.util.LifecycleUtil; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.Authorization; import com.evolveum.midpoint.security.api.AuthorizationTransformer; import com.evolveum.midpoint.security.api.DelegatorWithOtherPrivilegesLimitations; @@ -108,6 +105,7 @@ public class UserProfileServiceImpl implements UserProfileService, UserDetailsSe @Autowired @Qualifier("modelObjectResolver") private ObjectResolver objectResolver; @Autowired private SystemObjectCache systemObjectCache; + @Autowired private RelationRegistry relationRegistry; @Autowired private MappingFactory mappingFactory; @Autowired private MappingEvaluator mappingEvaluator; @Autowired private SecurityHelper securityHelper; @@ -238,6 +236,7 @@ private void initializePrincipalFromAssignments(MidPointPrincipal principal, Pri .channel(null) .objectResolver(objectResolver) .systemObjectCache(systemObjectCache) + .relationRegistry(relationRegistry) .prismContext(prismContext) .mappingFactory(mappingFactory) .mappingEvaluator(mappingEvaluator) @@ -282,7 +281,7 @@ private void initializePrincipalFromAssignments(MidPointPrincipal principal, Pri } for (EvaluatedAssignmentTarget target : assignment.getRoles().getNonNegativeValues()) { if (target.isValid() && target.getTarget() != null && target.getTarget().asObjectable() instanceof UserType - && DeputyUtils.isDelegationPath(target.getAssignmentPath())) { + && DeputyUtils.isDelegationPath(target.getAssignmentPath(), relationRegistry)) { List limitations = DeputyUtils.extractLimitations(target.getAssignmentPath()); principal.addDelegatorWithOtherPrivilegesLimitations(new DelegatorWithOtherPrivilegesLimitations( (UserType) target.getTarget().asObjectable(), limitations)); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java index e3f8bd192bb..130b1d44a0e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/CorrelationConfirmationEvaluator.java @@ -28,6 +28,7 @@ import com.evolveum.midpoint.model.impl.expr.ModelExpressionThreadLocalHolder; import com.evolveum.midpoint.model.impl.util.ModelImplUtils; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import org.apache.commons.lang.Validate; import org.springframework.beans.factory.annotation.Autowired; @@ -78,6 +79,9 @@ public class CorrelationConfirmationEvaluator { @Autowired(required = true) private PrismContext prismContext; + @Autowired + private RelationRegistry relationRegistry; + @Autowired(required = true) private ExpressionFactory expressionFactory; @@ -272,7 +276,7 @@ private boolean matchUserCorrelationRule(Class focusTyp } // we assume userType is already normalized w.r.t. relations - ObjectTypeUtil.normalizeFilter(q.getFilter()); + ObjectTypeUtil.normalizeFilter(q.getFilter(), relationRegistry); return ObjectQuery.match(userType, q.getFilter(), matchingRuleRegistry); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAbstractAssignmentEvaluator.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAbstractAssignmentEvaluator.java index 7e75f58811a..5a7b3211d9e 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAbstractAssignmentEvaluator.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAbstractAssignmentEvaluator.java @@ -37,6 +37,7 @@ import com.evolveum.midpoint.model.impl.lens.projector.Projector; import com.evolveum.midpoint.prism.delta.DeltaSetTriple; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; +import com.evolveum.midpoint.schema.RelationRegistry; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.test.annotation.DirtiesContext; @@ -96,6 +97,9 @@ public abstract class TestAbstractAssignmentEvaluator extends AbstractLensTest { @Autowired private SystemObjectCache systemObjectCache; + @Autowired + private RelationRegistry relationRegistry; + @Autowired private Clock clock; @@ -1002,6 +1006,7 @@ protected AssignmentEvaluator createAssignmentEvaluator(ObjectDeltaObj .focusOdo(focusOdo) .objectResolver(objectResolver) .systemObjectCache(systemObjectCache) + .relationRegistry(relationRegistry) .prismContext(prismContext) .activationComputer(activationComputer) .now(clock.currentTimeXMLGregorianCalendar()) diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java index 082a64ded58..d53da258998 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java @@ -534,6 +534,7 @@ public void test062JackDeputyOfGuybrushDeputyOfBarbossaInLoginMode() throws Exce .channel(context.getChannel()) .objectResolver(objectResolver) .systemObjectCache(systemObjectCache) + .relationRegistry(relationRegistry) .prismContext(prismContext) .mappingFactory(mappingFactory) .mappingEvaluator(mappingEvaluator) diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java new file mode 100644 index 00000000000..fc9c7539ea9 --- /dev/null +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java @@ -0,0 +1,85 @@ +/* + * Copyright (c) 2010-2018 Evolveum + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * 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.model.impl.misc; + +import com.evolveum.midpoint.model.impl.AbstractInternalModelIntegrationTest; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.constants.RelationTypes; +import com.evolveum.midpoint.schema.constants.SchemaConstants; +import com.evolveum.midpoint.schema.result.OperationResult; +import com.evolveum.midpoint.task.api.Task; +import com.evolveum.midpoint.test.util.MidPointTestConstants; +import com.evolveum.midpoint.util.exception.SchemaException; +import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationDefinitionType; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.annotation.DirtiesContext; +import org.springframework.test.annotation.DirtiesContext.ClassMode; +import org.springframework.test.context.ContextConfiguration; +import org.testng.annotations.Test; + +import java.io.File; + +import static com.evolveum.midpoint.util.QNameUtil.unqualify; +import static org.testng.AssertJUnit.*; + +/** + * @author mederly + * + */ +@ContextConfiguration(locations = {"classpath:ctx-model-test-main.xml"}) +@DirtiesContext(classMode = ClassMode.AFTER_CLASS) +public class TestRelationRegistry extends AbstractInternalModelIntegrationTest { + + protected static final File TEST_DIR = new File(MidPointTestConstants.TEST_RESOURCES_DIR, "misc"); + + @Autowired protected RelationRegistry relationRegistry; + + @Test + public void test100DefaultRelations() throws SchemaException { + final String TEST_NAME = "test100DefaultRelations"; + + Task task = taskManager.createTaskInstance(TEST_NAME); + OperationResult result = task.getResult(); + + assertEquals("Wrong # of default relations", RelationTypes.values().length, relationRegistry.getRelationDefinitions().size()); + + RelationDefinitionType orgDefaultDef = relationRegistry.getRelationDefinition(SchemaConstants.ORG_DEFAULT); + RelationDefinitionType defaultDef = relationRegistry.getRelationDefinition(unqualify(SchemaConstants.ORG_DEFAULT)); + RelationDefinitionType nullDef = relationRegistry.getRelationDefinition(null); + assertNotNull("No definition for null relation", nullDef); + assertEquals("null and 'org:default' definitions differ", nullDef, orgDefaultDef); + assertEquals("null and 'default' definitions differ", nullDef, defaultDef); + + assertTrue(relationRegistry.isManager(SchemaConstants.ORG_MANAGER)); + assertTrue(relationRegistry.isManager(unqualify(SchemaConstants.ORG_MANAGER))); + assertFalse(relationRegistry.isManager(SchemaConstants.ORG_APPROVER)); + assertFalse(relationRegistry.isManager(unqualify(SchemaConstants.ORG_APPROVER))); + assertFalse(relationRegistry.isManager(SchemaConstants.ORG_DEFAULT)); + assertFalse(relationRegistry.isManager(unqualify(SchemaConstants.ORG_DEFAULT))); + assertFalse(relationRegistry.isManager(null)); + + assertTrue(relationRegistry.isMembership(SchemaConstants.ORG_DEFAULT)); + assertTrue(relationRegistry.isMembership(unqualify(SchemaConstants.ORG_DEFAULT))); + assertTrue(relationRegistry.isMembership(null)); + assertTrue(relationRegistry.isMembership(SchemaConstants.ORG_MANAGER)); + assertTrue(relationRegistry.isMembership(unqualify(SchemaConstants.ORG_MANAGER))); + assertFalse(relationRegistry.isMembership(SchemaConstants.ORG_APPROVER)); + assertFalse(relationRegistry.isMembership(unqualify(SchemaConstants.ORG_APPROVER))); + + // TODO + } + +} diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java index 13bb1d23e5a..e506fa1671a 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/AbstractConfiguredModelIntegrationTest.java @@ -41,10 +41,7 @@ import com.evolveum.midpoint.util.exception.*; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemObjectsType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.TaskType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.testng.AssertJUnit; import org.testng.IHookCallBack; @@ -557,17 +554,21 @@ public void initSystem(Task initTask, OperationResult initResult) throws Except ManualConnectorInstance.setRandomDelayRange(0); // System Configuration + PrismObject configuration; try { File systemConfigurationFile = getSystemConfigurationFile(); if (systemConfigurationFile != null) { - repoAddObjectFromFile(systemConfigurationFile, initResult); + configuration = repoAddObjectFromFile(systemConfigurationFile, initResult); } else { - addSystemConfigurationObject(initResult); + configuration = addSystemConfigurationObject(initResult); } } catch (ObjectAlreadyExistsException e) { throw new ObjectAlreadyExistsException("System configuration already exists in repository;" + "looks like the previous test haven't cleaned it up", e); } + if (configuration != null) { + relationRegistry.applyRelationConfiguration(configuration.asObjectable()); + } // Users userAdministrator = repoAddObjectFromFile(USER_ADMINISTRATOR_FILE, UserType.class, initResult); @@ -588,8 +589,9 @@ protected File getSystemConfigurationFile() { } // to be used in very specific cases only (it is invoked when getSystemConfigurationFile returns null). - protected void addSystemConfigurationObject(OperationResult initResult) throws IOException, CommonException, + protected PrismObject addSystemConfigurationObject(OperationResult initResult) throws IOException, CommonException, EncryptionException { + return null; } protected PrismObject getDefaultActor() { 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 c313cc614f8..f8a75bdc9d8 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 @@ -287,7 +287,7 @@ public void test320DefaultRelations() throws Exception { // WHEN displayWhen(TEST_NAME); - List relations = modelInteractionService.getRelationDefinitions(result); + List relations = modelInteractionService.getRelationDefinitions(); // THEN displayThen(TEST_NAME); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java index e62c6eb397e..39f5e31834b 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestNotifications.java @@ -92,13 +92,15 @@ protected File getSystemConfigurationFile() { } @Override - protected void addSystemConfigurationObject(OperationResult initResult) throws IOException, CommonException, + protected PrismObject addSystemConfigurationObject(OperationResult initResult) throws IOException, CommonException, EncryptionException { List configLines = IOUtils.readLines(new FileReader(SYSTEM_CONFIGURATION_FILE)); String configString = StringUtils.join(configLines, '\n'); int port = startHttpServer(); configString = configString.replaceAll("\\$\\$port\\$\\$", Integer.toString(port)); - repoAddObject(prismContext.parseObject(configString), initResult); + PrismObject sysconfigObject = prismContext.parseObject(configString); + repoAddObject(sysconfigObject, initResult); + return sysconfigObject; } private int startHttpServer() throws IOException { diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java index 51492359737..a75c9653760 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/gensync/TestEditSchema.java @@ -58,11 +58,9 @@ import com.evolveum.midpoint.schema.RetrieveOption; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.SelectorOptions; -import com.evolveum.midpoint.schema.internals.InternalCounters; 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.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.test.IntegrationTestTools; import com.evolveum.midpoint.test.util.TestUtil; @@ -1087,36 +1085,28 @@ public void test210UserDefinition() throws Exception { result.computeStatus(); TestUtil.assertSuccess(result); - assertPropertyValues(user, UserType.F_ADDITIONAL_NAME, new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertNotNull("No definition for additionalName in user", propDef); - assertEquals("Wrong additionalName displayName", "Middle Name", propDef.getDisplayName()); - assertTrue("additionalName not readable", propDef.canRead()); - } + assertPropertyValues(user, UserType.F_ADDITIONAL_NAME, (propDef, name) -> { + assertNotNull("No definition for additionalName in user", propDef); + assertEquals("Wrong additionalName displayName", "Middle Name", propDef.getDisplayName()); + assertTrue("additionalName not readable", propDef.canRead()); }, PrismTestUtil.createPolyString("Jackie")); - assertPropertyValues(user, UserType.F_COST_CENTER, new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertNotNull("No definition for costCenter in user", propDef); - assertEquals("Wrong costCenter displayOrder", (Integer)123, propDef.getDisplayOrder()); - assertTrue("costCenter not readable", propDef.canRead()); - } + assertPropertyValues(user, UserType.F_COST_CENTER, (Validator>) (propDef, name) -> { + assertNotNull("No definition for costCenter in user", propDef); + assertEquals("Wrong costCenter displayOrder", (Integer)123, propDef.getDisplayOrder()); + assertTrue("costCenter not readable", propDef.canRead()); }); - assertPropertyValues(user, UserType.F_PREFERRED_LANGUAGE, new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertNotNull("No definition for preferredLanguage in user", propDef); - assertEquals("Wrong preferredLanguage displayName", "Language", propDef.getDisplayName()); - assertTrue("preferredLanguage not readable", propDef.canRead()); - PrismReferenceValue valueEnumerationRef = propDef.getValueEnumerationRef(); - assertNotNull("No valueEnumerationRef for preferredLanguage", valueEnumerationRef); - assertEquals("Wrong valueEnumerationRef OID for preferredLanguage", LOOKUP_LANGUAGES_OID, valueEnumerationRef.getOid()); - } - }); + assertPropertyValues(user, UserType.F_PREFERRED_LANGUAGE, + (Validator>) (propDef, name) -> { + assertNotNull("No definition for preferredLanguage in user", propDef); + assertEquals("Wrong preferredLanguage displayName", "Language", propDef.getDisplayName()); + assertTrue("preferredLanguage not readable", propDef.canRead()); + PrismReferenceValue valueEnumerationRef = propDef.getValueEnumerationRef(); + assertNotNull("No valueEnumerationRef for preferredLanguage", valueEnumerationRef); + assertEquals("Wrong valueEnumerationRef OID for preferredLanguage", LOOKUP_LANGUAGES_OID, valueEnumerationRef.getOid()); + }); assertContainer(user, UserType.F_CREDENTIALS, (credentialsDef, name) -> { assertNotNull("No definition for credentials in user", credentialsDef); @@ -1167,34 +1157,25 @@ public void test213ModifiedUserJack() throws Exception { result.computeStatus(); TestUtil.assertSuccess(result); - assertPropertyValues(user, UserType.F_ADDITIONAL_NAME, new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertNotNull("No definition for additionalName in user", propDef); - assertEquals("Wrong additionalName displayName", "Middle Name", propDef.getDisplayName()); - assertTrue("additionalName not readable", propDef.canRead()); - } + assertPropertyValues(user, UserType.F_ADDITIONAL_NAME, (propDef, name) -> { + assertNotNull("No definition for additionalName in user", propDef); + assertEquals("Wrong additionalName displayName", "Middle Name", propDef.getDisplayName()); + assertTrue("additionalName not readable", propDef.canRead()); }, PrismTestUtil.createPolyString("Jackie")); - assertPropertyValues(user, UserType.F_COST_CENTER, new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertNotNull("No definition for costCenter in user", propDef); - assertEquals("Wrong costCenter displayOrder", (Integer)123, propDef.getDisplayOrder()); - assertTrue("costCenter not readable", propDef.canRead()); - } + assertPropertyValues(user, UserType.F_COST_CENTER, (propDef, name) -> { + assertNotNull("No definition for costCenter in user", propDef); + assertEquals("Wrong costCenter displayOrder", (Integer)123, propDef.getDisplayOrder()); + assertTrue("costCenter not readable", propDef.canRead()); },"G001"); // This is set by user template - assertPropertyValues(user, UserType.F_PREFERRED_LANGUAGE, new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertNotNull("No definition for preferredLanguage in user", propDef); - assertEquals("Wrong preferredLanguage displayName", "Language", propDef.getDisplayName()); - assertTrue("preferredLanguage not readable", propDef.canRead()); - PrismReferenceValue valueEnumerationRef = propDef.getValueEnumerationRef(); - assertNotNull("No valueEnumerationRef for preferredLanguage", valueEnumerationRef); - assertEquals("Wrong valueEnumerationRef OID for preferredLanguage", LOOKUP_LANGUAGES_OID, valueEnumerationRef.getOid()); - } + assertPropertyValues(user, UserType.F_PREFERRED_LANGUAGE, (propDef, name) -> { + assertNotNull("No definition for preferredLanguage in user", propDef); + assertEquals("Wrong preferredLanguage displayName", "Language", propDef.getDisplayName()); + assertTrue("preferredLanguage not readable", propDef.canRead()); + PrismReferenceValue valueEnumerationRef = propDef.getValueEnumerationRef(); + assertNotNull("No valueEnumerationRef for preferredLanguage", valueEnumerationRef); + assertEquals("Wrong valueEnumerationRef OID for preferredLanguage", LOOKUP_LANGUAGES_OID, valueEnumerationRef.getOid()); }, "en_PR"); @@ -1209,12 +1190,7 @@ public void validate(PrismContainerDefinition credentialsDef, S }, true); assertProperty(user, new ItemPath(UserType.F_CREDENTIALS, CredentialsType.F_PASSWORD, PasswordType.F_VALUE), - new Validator>() { - @Override - public void validate(PrismPropertyDefinition propDef, String name) throws Exception { - assertTrue("Password not readable", propDef.canRead()); - } - }); + (Validator>) (propDef, name) -> assertTrue("Password not readable", propDef.canRead())); assertUntouchedUserDefinition(); assertSteadyResources(); @@ -1382,7 +1358,7 @@ public void test300RoleTypes() throws Exception { final String TEST_NAME="test300RoleTypes"; displayTestTitle(TEST_NAME); - assertRoleTypes(getUser(USER_JACK_OID), "application","system","it"); + assertRoleTypes(getUser(USER_JACK_OID), "application","system", "it"); } /** @@ -1398,7 +1374,7 @@ public void test310CustomRelations() throws Exception { // WHEN displayWhen(TEST_NAME); - List relations = modelInteractionService.getRelationDefinitions(result); + List relations = modelInteractionService.getRelationDefinitions(); // THEN displayThen(TEST_NAME); 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 48fe34455f6..d768716a5f7 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 @@ -47,6 +47,7 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.task.api.TaskDebugUtil; import com.evolveum.midpoint.util.*; @@ -123,14 +124,6 @@ import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.common.ObjectResolver; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ObjectDeltaOperation; -import com.evolveum.midpoint.schema.PointInTimeType; -import com.evolveum.midpoint.schema.RepositoryDiag; -import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.SearchResultList; -import com.evolveum.midpoint.schema.SearchResultMetadata; -import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalsConfig; @@ -275,6 +268,7 @@ public abstract class AbstractModelIntegrationTest extends AbstractIntegrationTe @Autowired protected ModelPortType modelWeb; @Autowired protected RepositoryService repositoryService; @Autowired protected SystemObjectCache systemObjectCache; + @Autowired protected RelationRegistry relationRegistry; @Autowired protected ProvisioningService provisioningService; @Autowired protected HookRegistry hookRegistry; @Autowired protected Clock clock; @@ -975,7 +969,7 @@ protected void assignOrg(Class focusType, String focusO } protected void assignOrg(String userOid, String orgOid) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, ObjectAlreadyExistsException, PolicyViolationException, SecurityViolationException { - assignOrg(userOid, orgOid, SchemaConstants.ORG_DEFAULT); + assignOrg(userOid, orgOid, prismContext.getDefaultRelation()); } protected void assignOrg(String userOid, String orgOid, QName relation) @@ -1004,7 +998,7 @@ protected void assignOrg(Class focusType, String focusO } protected void unassignOrg(String userOid, String orgOid) throws ObjectNotFoundException, SchemaException, ExpressionEvaluationException, CommunicationException, ConfigurationException, ObjectAlreadyExistsException, PolicyViolationException, SecurityViolationException { - unassignOrg(userOid, orgOid, SchemaConstants.ORG_DEFAULT); + unassignOrg(userOid, orgOid, prismContext.getDefaultRelation()); } protected void unassignOrg(String userOid, String orgOid, Task task, OperationResult result) @@ -1405,7 +1399,7 @@ protected void unassignParametricRole(String userOid, String roleOid, String org } protected void assertAssignees(String targetOid, int expectedAssignees) throws SchemaException { - assertAssignees(targetOid, SchemaConstants.ORG_DEFAULT, expectedAssignees); + assertAssignees(targetOid, prismContext.getDefaultRelation(), expectedAssignees); } protected void assertAssignees(String targetOid, QName relation, int expectedAssignees) throws SchemaException { @@ -1419,7 +1413,7 @@ protected void assertAssignees(String targetOid, QName relation, int expectedAss } protected int countAssignees(String targetOid, OperationResult result) throws SchemaException { - return countAssignees(targetOid, SchemaConstants.ORG_DEFAULT, result); + return countAssignees(targetOid, prismContext.getDefaultRelation(), result); } protected int countAssignees(String targetOid, QName relation, OperationResult result) throws SchemaException { @@ -1822,7 +1816,7 @@ protected AssignmentType getUserAssignment(String userOid, String roleOid, QName List assignments = user.asObjectable().getAssignment(); for (AssignmentType assignment: assignments) { ObjectReferenceType targetRef = assignment.getTargetRef(); - if (targetRef != null && roleOid.equals(targetRef.getOid()) && ObjectTypeUtil.relationMatches(relation, + if (targetRef != null && roleOid.equals(targetRef.getOid()) && prismContext.relationMatches(relation, targetRef.getRelation())) { return assignment; } diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java index c756d21505a..ab80567da95 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportFunctions.java @@ -150,7 +150,7 @@ public List> resolveRoles(Collection assig .filter(as -> as.getTargetRef() != null && as.getTargetRef().getOid() != null && filterOids.contains(as.getTargetRef().getOid())) // filter to default relation only - ignores approvers etc - .filter(as -> ObjectTypeUtil.isDefaultRelation(as.getTargetRef().getRelation())) + .filter(as -> prismContext.isDefaultRelation(as.getTargetRef().getRelation())) .collect(Collectors.toList()); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/RelationResolver.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/RelationResolver.java index ddc60b3ab38..20a1889ed10 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/RelationResolver.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/RelationResolver.java @@ -3,6 +3,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import javax.xml.namespace.QName; +import java.util.Collection; import java.util.List; /** @@ -11,5 +12,5 @@ @FunctionalInterface public interface RelationResolver { // Must return parent-less values - List getApprovers(List relations); + List getApprovers(Collection relations); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseChangeProcessor.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseChangeProcessor.java index eae0b0489bd..9b2016e02a8 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseChangeProcessor.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseChangeProcessor.java @@ -1,6 +1,7 @@ package com.evolveum.midpoint.wf.impl.processors; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.wf.impl.util.MiscDataUtil; @@ -26,13 +27,11 @@ public abstract class BaseChangeProcessor implements ChangeProcessor, BeanNameAw private String beanName; private BeanFactory beanFactory; - @Autowired - private MiscDataUtil miscDataUtil; + @Autowired private MiscDataUtil miscDataUtil; + @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; - @Autowired - private PrismContext prismContext; - - private boolean enabled = false; + private boolean enabled = false; public String getBeanName() { return beanName; @@ -72,4 +71,9 @@ public MiscDataUtil getMiscDataUtil() { public PrismContext getPrismContext() { return prismContext; } + + @Override + public RelationRegistry getRelationRegistry() { + return relationRegistry; + } } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/ChangeProcessor.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/ChangeProcessor.java index 64d8a15938a..3802a4b5b4e 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/ChangeProcessor.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/ChangeProcessor.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.api.hooks.HookOperationMode; import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.CommunicationException; @@ -126,5 +127,7 @@ AuditEventRecord prepareWorkItemDeletedAuditRecord(WorkItemType workItem, WorkIt MiscDataUtil getMiscDataUtil(); PrismContext getPrismContext(); + + RelationRegistry getRelationRegistry(); } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java index ad4b5019291..7941a11a34c 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java @@ -35,13 +35,12 @@ import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.ObjectTreeDeltas; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SearchResultList; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.DebugUtil; -import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.CommunicationException; import com.evolveum.midpoint.util.exception.ConfigurationException; import com.evolveum.midpoint.util.exception.ExpressionEvaluationException; @@ -108,6 +107,9 @@ public abstract class BasePrimaryChangeAspect implements PrimaryChangeAspect, Be @Autowired protected PrismContext prismContext; + @Autowired + protected RelationRegistry relationRegistry; + @Autowired protected ItemApprovalProcessInterface itemApprovalProcessInterface; @@ -241,7 +243,7 @@ public RelationResolver createRelationResolver(PrismObject object, OperationR S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, prismContext).none(); for (QName approverRelation : relations) { PrismReferenceValue approverReference = new PrismReferenceValue(object.getOid()); - approverReference.setRelation(QNameUtil.qualifyIfNeeded(approverRelation, SchemaConstants.NS_ORG)); + approverReference.setRelation(relationRegistry.normalizeRelation(approverRelation)); q = q.or().item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(approverReference); } ObjectQuery query = q.build(); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java index 09d6de02d5b..3515576513e 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java @@ -21,6 +21,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.util.CloneUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -137,9 +138,9 @@ private boolean isAddOnFragment(ApprovalCompositionStrategyType cs) { } // checks the existence of approvers beforehand, because we don't want to have an empty stage - boolean addPredefined(PrismObject targetObject, @NotNull QName relationName, OperationResult result) { + boolean addPredefined(PrismObject targetObject, RelationKindType relationKind, OperationResult result) { RelationResolver resolver = primaryChangeAspect.createRelationResolver(targetObject, result); - List approvers = resolver.getApprovers(Collections.singletonList(relationName)); + List approvers = resolver.getApprovers(getRelationRegistry().getAllRelationsFor(relationKind)); if (!approvers.isEmpty()) { ApprovalStageDefinitionType stageDef = new ApprovalStageDefinitionType(); stageDef.getApproverRef().addAll(approvers); @@ -150,6 +151,10 @@ boolean addPredefined(PrismObject targetObject, @NotNull QName relationName, } } + private RelationRegistry getRelationRegistry() { + return primaryChangeAspect.getChangeProcessor().getRelationRegistry(); + } + void addPredefined(PrismObject targetObject, ApprovalStageDefinitionType stageDef) { ApprovalSchemaType schema = new ApprovalSchemaType(); schema.getStage().add(stageDef); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java index e129f9648e4..ac1de5f3ae8 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java @@ -265,7 +265,7 @@ private ApprovalSchemaBuilder.Result createSchemaWithRules(List void extractObjectBasedInstructions(@NotNull ObjectTreeDe } else if (baseConfigurationHelper.getUseDefaultApprovalPolicyRules(ctx.wfConfiguration) != DefaultApprovalPolicyRulesUsageType.NEVER) { // default rule ApprovalSchemaBuilder builder = new ApprovalSchemaBuilder(main, approvalSchemaHelper); - if (builder.addPredefined(object, SchemaConstants.ORG_OWNER, result)) { + if (builder.addPredefined(object, RelationKindType.OWNER, result)) { LOGGER.trace("Added default approval action, as no explicit one was found"); generateObjectOidIfNeeded(focusDelta, ctx.modelContext); List> deltasToApprove = singletonList(focusDelta.clone()); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index 3c700dca9e4..79a8b0b8ff9 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.model.api.context.ModelElementContext; import com.evolveum.midpoint.model.api.util.DeputyUtils; import com.evolveum.midpoint.model.api.util.ModelContextUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.model.common.SystemObjectCache; import com.evolveum.midpoint.model.impl.lens.LensFocusContext; import com.evolveum.midpoint.model.impl.lens.LensProjectionContext; @@ -93,6 +94,7 @@ public class MiscDataUtil { @Autowired private WfConfiguration wfConfiguration; @Autowired private ActivitiEngine activitiEngine; @Autowired private BaseModelInvocationProcessingHelper baseModelInvocationProcessingHelper; + @Autowired private RelationRegistry relationRegistry; public static ObjectReferenceType toObjectReferenceType(LightweightObjectRef ref) { if (ref != null) { @@ -317,16 +319,17 @@ public boolean isAuthorized(WorkItemType workItem, RequestedOperation operation, throw new SystemException(e.getMessage(), e); } for (ObjectReferenceType assignee : workItem.getAssigneeRef()) { - if (isEqualOrDeputyOf(principal, assignee.getOid())) { + if (isEqualOrDeputyOf(principal, assignee.getOid(), relationRegistry)) { return true; } } return isAmongCandidates(principal, workItem.getExternalId()); } - public boolean isEqualOrDeputyOf(MidPointPrincipal principal, String eligibleUserOid) { + public boolean isEqualOrDeputyOf(MidPointPrincipal principal, String eligibleUserOid, + RelationRegistry relationRegistry) { return principal.getOid().equals(eligibleUserOid) - || DeputyUtils.isDelegationPresent(principal.getUser(), eligibleUserOid); + || DeputyUtils.isDelegationPresent(principal.getUser(), eligibleUserOid, relationRegistry); } public WfConfigurationType getWorkflowConfiguration(SystemObjectCache systemObjectCache, OperationResult result) throws SchemaException { @@ -403,7 +406,7 @@ public boolean isMemberOfActivitiGroup(UserType userType, String activitiGroupId } public boolean matches(ObjectReferenceType groupRef, ObjectReferenceType targetRef) { - return (ObjectTypeUtil.isMembershipRelation(targetRef.getRelation())) // TODO reconsider if we allow managers here + return (relationRegistry.isMembership(targetRef.getRelation())) // TODO reconsider if we allow managers here && targetRef.getOid().equals(groupRef.getOid()); } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java index 4bbc1043b3c..69316ccad8b 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.model.api.context.ModelState; import com.evolveum.midpoint.model.api.hooks.HookOperationMode; +import com.evolveum.midpoint.model.common.SystemObjectCache; import com.evolveum.midpoint.model.impl.AbstractModelImplementationIntegrationTest; import com.evolveum.midpoint.model.impl.controller.ModelOperationTaskHandler; import com.evolveum.midpoint.model.impl.lens.Clockwork; @@ -31,6 +32,7 @@ import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.prism.util.PrismUtil; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SearchResultList; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; @@ -185,6 +187,8 @@ public class AbstractWfTestPolicy extends AbstractModelImplementationIntegration @Autowired protected MiscDataUtil miscDataUtil; @Autowired protected PrimaryChangeProcessor primaryChangeProcessor; @Autowired protected GeneralChangeProcessor generalChangeProcessor; + @Autowired protected SystemObjectCache systemObjectCache; + @Autowired protected RelationRegistry relationRegistry; protected PrismObject userAdministrator; diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java index eaff8805155..c5a3fc06174 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java @@ -368,7 +368,7 @@ protected Boolean decideOnApproval(String executionId, org.activiti.engine.task. protected List getPotentialAssignees(PrismObject user) { List rv = new ArrayList<>(); rv.add(ObjectTypeUtil.createObjectRef(user).asReferenceValue()); - rv.addAll(DeputyUtils.getDelegatorReferences(user.asObjectable())); + rv.addAll(DeputyUtils.getDelegatorReferences(user.asObjectable(), relationRegistry)); return rv; } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java index 5d6957fc1a8..7a170f86eab 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ResourceObjectConverter.java @@ -34,10 +34,7 @@ import com.evolveum.midpoint.provisioning.ucf.api.*; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; import com.evolveum.midpoint.repo.cache.RepositoryCache; -import com.evolveum.midpoint.schema.CapabilityUtil; -import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; -import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.SearchResultMetadata; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.processor.*; @@ -113,6 +110,7 @@ public class ResourceObjectConverter { @Autowired private ShadowCaretaker shadowCaretaker; @Autowired private Clock clock; @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; private static final Trace LOGGER = TraceManager.getTrace(ResourceObjectConverter.class); @@ -251,7 +249,8 @@ public AsynchronousOperationReturnValue> addResourceObje Collection> resourceAttributesAfterAdd = null; - if (ProvisioningUtil.isProtectedShadow(ctx.getObjectClassDefinition(), shadowClone, matchingRuleRegistry)) { + if (ProvisioningUtil.isProtectedShadow(ctx.getObjectClassDefinition(), shadowClone, matchingRuleRegistry, + relationRegistry)) { LOGGER.error("Attempt to add protected shadow " + shadowType + "; ignoring the request"); SecurityViolationException e = new SecurityViolationException("Cannot get protected shadow " + shadowType); result.recordFatalError(e); @@ -388,7 +387,7 @@ public AsynchronousOperationResult deleteResourceObject(ProvisioningContext ctx, Collection> identifiers = ShadowUtil .getAllIdentifiers(shadow); - if (ProvisioningUtil.isProtectedShadow(ctx.getObjectClassDefinition(), shadow, matchingRuleRegistry)) { + if (ProvisioningUtil.isProtectedShadow(ctx.getObjectClassDefinition(), shadow, matchingRuleRegistry, relationRegistry)) { LOGGER.error("Attempt to delete protected resource object " + ctx.getObjectClassDefinition() + ": " + identifiers + "; ignoring the request"); SecurityViolationException e = new SecurityViolationException("Cannot delete protected resource object " @@ -503,7 +502,8 @@ public AsynchronousOperationReturnValue> identifiers = ShadowUtil.getAllIdentifiers(repoShadow); Collection> primaryIdentifiers = ShadowUtil.getPrimaryIdentifiers(repoShadow); - if (ProvisioningUtil.isProtectedShadow(ctx.getObjectClassDefinition(), repoShadow, matchingRuleRegistry)) { + if (ProvisioningUtil.isProtectedShadow(ctx.getObjectClassDefinition(), repoShadow, matchingRuleRegistry, + relationRegistry)) { if (hasChangesOnResource(itemDeltas)) { LOGGER.error("Attempt to modify protected resource object " + objectClassDefinition + ": " + identifiers); @@ -1888,7 +1888,7 @@ private PrismObject postProcessResourceObjectRead(ProvisioningContex } ShadowType resourceObjectType = resourceObject.asObjectable(); - ProvisioningUtil.setProtectedFlag(ctx, resourceObject, matchingRuleRegistry); + ProvisioningUtil.setProtectedFlag(ctx, resourceObject, matchingRuleRegistry, relationRegistry); if (resourceObjectType.isExists() != Boolean.FALSE) { resourceObjectType.setExists(true); diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 981df025ba9..a5d2c598b4b 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -121,6 +121,7 @@ public class ShadowCache { @Autowired private ResourceObjectConverter resouceObjectConverter; @Autowired private ShadowCaretaker shadowCaretaker; @Autowired private MatchingRuleRegistry matchingRuleRegistry; + @Autowired private RelationRegistry relationRegistry; @Autowired protected ShadowManager shadowManager; @Autowired private ChangeNotificationDispatcher operationListener; @Autowired private AccessChecker accessChecker; @@ -1708,7 +1709,7 @@ public void setProtectedShadow(PrismObject shadow, OperationResult p throws ObjectNotFoundException, SchemaException, CommunicationException, ConfigurationException, ExpressionEvaluationException { ProvisioningContext ctx = ctxFactory.create(shadow, null, parentResult); ctx.assertDefinition(); - ProvisioningUtil.setProtectedFlag(ctx, shadow, matchingRuleRegistry); + ProvisioningUtil.setProtectedFlag(ctx, shadow, matchingRuleRegistry, relationRegistry); } public void applyDefinition(final ObjectQuery query, OperationResult result) @@ -2036,7 +2037,7 @@ private SearchResultMetadata searchObjectsIterativeRepository(final Provisioning shadowCaretaker.applyAttributesDefinition(ctx, shadow); // fixing MID-1640; hoping that the protected object filter uses only identifiers // (that are stored in repo) - ProvisioningUtil.setProtectedFlag(ctx, shadow, matchingRuleRegistry); + ProvisioningUtil.setProtectedFlag(ctx, shadow, matchingRuleRegistry, relationRegistry); validateShadow(shadow, true); @@ -2598,7 +2599,7 @@ void processChange(ProvisioningContext ctx, Change change, PrismObject completeShadow(ProvisioningContext ctx, transplantPasswordMetadata(repoShadowType, resultAccountShadow); // protected - ProvisioningUtil.setProtectedFlag(ctx, resultShadow, matchingRuleRegistry); + ProvisioningUtil.setProtectedFlag(ctx, resultShadow, matchingRuleRegistry, relationRegistry); // exists, dead // This may seem strange, but always take exists and dead flags from the repository. diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java index e6a2c9b3164..ae40770e65c 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/util/ProvisioningUtil.java @@ -59,10 +59,7 @@ import com.evolveum.midpoint.provisioning.ucf.api.AttributesToReturn; import com.evolveum.midpoint.provisioning.ucf.api.ExecuteProvisioningScriptOperation; import com.evolveum.midpoint.provisioning.ucf.api.ExecuteScriptArgument; -import com.evolveum.midpoint.schema.CapabilityUtil; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.PointInTimeType; -import com.evolveum.midpoint.schema.SelectorOptions; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.processor.ResourceAttribute; import com.evolveum.midpoint.schema.processor.ResourceAttributeContainer; @@ -313,8 +310,9 @@ public static RefinedResourceSchema getRefinedSchema(ResourceType resourceType) return refinedSchema; } - public static boolean isProtectedShadow(RefinedObjectClassDefinition objectClassDefinition, PrismObject shadow, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException { - boolean isProtected = false; + public static boolean isProtectedShadow(RefinedObjectClassDefinition objectClassDefinition, PrismObject shadow, + MatchingRuleRegistry matchingRuleRegistry, RelationRegistry relationRegistry) throws SchemaException { + boolean isProtected; if (objectClassDefinition == null) { isProtected = false; } else { @@ -322,16 +320,17 @@ public static boolean isProtectedShadow(RefinedObjectClassDefinition objectClass if (protectedAccountPatterns == null) { isProtected = false; } else { - isProtected = ResourceObjectPattern.matches(shadow, protectedAccountPatterns, matchingRuleRegistry); + isProtected = ResourceObjectPattern.matches(shadow, protectedAccountPatterns, matchingRuleRegistry, relationRegistry); } } - LOGGER.trace("isProtectedShadow: {}: {} = {}", new Object[] { objectClassDefinition, - shadow, isProtected }); + LOGGER.trace("isProtectedShadow: {}: {} = {}", objectClassDefinition, shadow, isProtected); return isProtected; } - public static void setProtectedFlag(ProvisioningContext ctx, PrismObject resourceObject, MatchingRuleRegistry matchingRuleRegistry) throws SchemaException, ConfigurationException, ObjectNotFoundException, CommunicationException, ExpressionEvaluationException { - if (isProtectedShadow(ctx.getObjectClassDefinition(), resourceObject, matchingRuleRegistry)) { + public static void setProtectedFlag(ProvisioningContext ctx, PrismObject resourceObject, + MatchingRuleRegistry matchingRuleRegistry, RelationRegistry relationRegistry) throws SchemaException, + ConfigurationException, ObjectNotFoundException, CommunicationException, ExpressionEvaluationException { + if (isProtectedShadow(ctx.getObjectClassDefinition(), resourceObject, matchingRuleRegistry, relationRegistry)) { resourceObject.asObjectable().setProtectedObject(true); } } diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java index 93c6fa73a2e..d0a26e5552b 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/BaseSQLRepoTest.java @@ -29,6 +29,7 @@ import com.evolveum.midpoint.repo.sql.util.HibernateToSqlTranslator; import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.MidPointConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.test.util.TestUtil; @@ -71,6 +72,7 @@ public class BaseSQLRepoTest extends AbstractTestNGSpringContextTests { @Autowired protected BaseHelper baseHelper; @Autowired protected AuditService auditService; @Autowired protected PrismContext prismContext; + @Autowired protected RelationRegistry relationRegistry; @Autowired protected SessionFactory factory; @Autowired protected ExtItemDictionary extItemDictionary; diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ObjectDeltaUpdaterTest.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ObjectDeltaUpdaterTest.java index 7712fe82bcb..db9112131e0 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ObjectDeltaUpdaterTest.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/ObjectDeltaUpdaterTest.java @@ -41,6 +41,7 @@ import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.RActivationStatus; import com.evolveum.midpoint.repo.sql.testing.QueryCountInterceptor; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.DOMUtil; @@ -84,8 +85,8 @@ public class ObjectDeltaUpdaterTest extends BaseSQLRepoTest { private static final QName LOOT = new QName(NS_P, "loot"); private static final QName WEAPON = new QName(NS_P, "weapon"); - @Autowired - private QueryCountInterceptor queryCountInterceptor; + @Autowired private QueryCountInterceptor queryCountInterceptor; + @Autowired private RelationRegistry relationRegistry; private String userOid; @@ -291,7 +292,8 @@ public void test140AddDeleteAssignment() throws Exception { AssertJUnit.assertEquals(createRef(OrgType.COMPLEX_TYPE, "444", SchemaConstants.ORG_DEFAULT), targetRef); assertReferences((Collection) a.getModifyApproverRef(), - RObjectReference.copyFromJAXB(createRef(UserType.COMPLEX_TYPE, "555", SchemaConstants.ORG_DEFAULT), new RObjectReference()) + RObjectReference.copyFromJAXB(createRef(UserType.COMPLEX_TYPE, "555", SchemaConstants.ORG_DEFAULT), new RObjectReference(), + relationRegistry) ); } finally { session.close(); @@ -356,8 +358,10 @@ public void test150AddDeleteLinkRef() throws Exception { RUser u = session.get(RUser.class, userOid); assertReferences((Collection) u.getLinkRef(), - RObjectReference.copyFromJAXB(createRef(ShadowType.COMPLEX_TYPE, "123", SchemaConstants.ORG_DEFAULT), new RObjectReference()), - RObjectReference.copyFromJAXB(createRef(ShadowType.COMPLEX_TYPE, "789", SchemaConstants.ORG_DEFAULT), new RObjectReference())); + RObjectReference.copyFromJAXB(createRef(ShadowType.COMPLEX_TYPE, "123", SchemaConstants.ORG_DEFAULT), new RObjectReference(), + relationRegistry), + RObjectReference.copyFromJAXB(createRef(ShadowType.COMPLEX_TYPE, "789", SchemaConstants.ORG_DEFAULT), new RObjectReference(), + relationRegistry)); } finally { session.close(); } @@ -386,8 +390,10 @@ public void test160AddDeleteParentRef() throws Exception { RUser u = session.get(RUser.class, userOid); assertReferences((Collection) u.getParentOrgRef(), - RObjectReference.copyFromJAXB(createRef(OrgType.COMPLEX_TYPE, "123", SchemaConstants.ORG_DEFAULT), new RObjectReference()), - RObjectReference.copyFromJAXB(createRef(OrgType.COMPLEX_TYPE, "789", SchemaConstants.ORG_DEFAULT), new RObjectReference())); + RObjectReference.copyFromJAXB(createRef(OrgType.COMPLEX_TYPE, "123", SchemaConstants.ORG_DEFAULT), new RObjectReference(), + relationRegistry), + RObjectReference.copyFromJAXB(createRef(OrgType.COMPLEX_TYPE, "789", SchemaConstants.ORG_DEFAULT), new RObjectReference(), + relationRegistry)); } finally { session.close(); } @@ -474,7 +480,8 @@ public void test180ModifyMetadataChannel() throws Exception { AssertJUnit.assertEquals(1, u.getCreateApproverRef().size()); assertReferences((Collection) u.getCreateApproverRef(), - RObjectReference.copyFromJAXB(createRef(UserType.COMPLEX_TYPE, "111", SchemaConstants.ORG_DEFAULT), new RObjectReference())); + RObjectReference.copyFromJAXB(createRef(UserType.COMPLEX_TYPE, "111", SchemaConstants.ORG_DEFAULT), new RObjectReference(), + relationRegistry)); } @Test diff --git a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java index fb3f03d571b..d0652433a98 100644 --- a/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java +++ b/repo/repo-sql-impl-test/src/test/java/com/evolveum/midpoint/repo/sql/QueryInterpreter2Test.java @@ -73,6 +73,7 @@ import static com.evolveum.midpoint.prism.query.OrderDirection.DESCENDING; import static com.evolveum.midpoint.schema.GetOperationOptions.*; import static com.evolveum.midpoint.schema.SelectorOptions.createCollection; +import static com.evolveum.midpoint.util.QNameUtil.unqualify; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractWorkItemType.F_STAGE_NUMBER; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignStateType.IN_REVIEW_STAGE; import static com.evolveum.midpoint.xml.ns._public.common.common_3.AccessCertificationCampaignType.F_OWNER_REF; @@ -1302,13 +1303,18 @@ public void test0150QueryUserAssignmentTargetRef() throws Exception { @SuppressWarnings("unchecked") Collection relationParameter = (Collection) rQuery.getQuerySource().getParameters().get("relation").getValue(); assertEquals("Wrong relation parameter value", - new HashSet<>(Arrays.asList("#", RUtil.qnameToString(SchemaConstants.ORG_DEFAULT))), + new HashSet<>(getVariantsOfDefaultRelation()), new HashSet<>(relationParameter)); } finally { close(session); } } + @NotNull + private List getVariantsOfDefaultRelation() { + return Arrays.asList("#", RUtil.qnameToString(unqualify(SchemaConstants.ORG_DEFAULT)), RUtil.qnameToString(SchemaConstants.ORG_DEFAULT)); + } + @Test public void test0152QueryUserAssignmentTargetRefManagerStandardQualified() throws Exception { Session session = open(); @@ -1882,9 +1888,7 @@ public void test0341QueryOrgTreeFindUsersRelationDefault() throws Exception { @SuppressWarnings("unchecked") Collection relationParameter = (Collection) rQuery.getQuerySource().getParameters().get("relation").getValue(); assertEquals("Wrong relation parameter value", - new HashSet<>(Arrays.asList( - "#", - RUtil.qnameToString(SchemaConstants.ORG_DEFAULT))), + new HashSet<>(getVariantsOfDefaultRelation()), new HashSet<>(relationParameter)); } finally { @@ -1996,9 +2000,7 @@ public void test0346QueryOrgTreeFindUsersRelationDefault() throws Exception { @SuppressWarnings("unchecked") Collection relationParameter = (Collection) rQuery.getQuerySource().getParameters().get("relation").getValue(); assertEquals("Wrong relation parameter value", - new HashSet<>(Arrays.asList( - "#", - RUtil.qnameToString(SchemaConstants.ORG_DEFAULT))), + new HashSet<>(getVariantsOfDefaultRelation()), new HashSet<>(relationParameter)); } finally { @@ -5133,7 +5135,7 @@ private RQuery getInterpretedQuery2Whole(Session sessi LOGGER.info("QUERY TYPE TO CONVERT :\n{}", (query.getFilter() != null ? query.getFilter().debugDump(3) : null)); } - QueryEngine2 engine = new QueryEngine2(baseHelper.getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(baseHelper.getConfiguration(), extItemDictionary, prismContext, relationRegistry); RQuery rQuery = engine.interpret(query, type, options, interpretCount, session); //just test if DB will handle it or throws some exception if (interpretCount) { diff --git a/repo/repo-sql-impl-test/src/test/resources/ctx-configuration-sql-test.xml b/repo/repo-sql-impl-test/src/test/resources/ctx-configuration-sql-test.xml index fce8ef624e4..34fe7236ac4 100644 --- a/repo/repo-sql-impl-test/src/test/resources/ctx-configuration-sql-test.xml +++ b/repo/repo-sql-impl-test/src/test/resources/ctx-configuration-sql-test.xml @@ -56,5 +56,10 @@ + + + + + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index b37857bf85f..a9b1515fbcb 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -129,6 +129,7 @@ public class SqlRepositoryServiceImpl extends SqlBaseService implements Reposito @Autowired private MatchingRuleRegistry matchingRuleRegistry; @Autowired private MidpointConfiguration midpointConfiguration; @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; private final ThreadLocal> conflictWatchersThreadLocal = new ThreadLocal<>(); @@ -1056,7 +1057,7 @@ public boolean selectorMatches(ObjectSelectorType objectS if (filterEvaluator != null) { specFilter = filterEvaluator.evaluate(specFilter); } - ObjectTypeUtil.normalizeFilter(specFilter); // we assume object is already normalized + ObjectTypeUtil.normalizeFilter(specFilter, relationRegistry); // we assume object is already normalized if (specFilter != null) { ObjectQueryUtil.assertPropertyOnly(specFilter, logMessagePrefix + " filter is not property-only filter"); } @@ -1121,7 +1122,7 @@ public void applyFullTextSearchConfiguration(FullTextSearchConfigurationType ful fullTextSearchConfiguration = fullTextSearch; } - @Override + @Override public FullTextSearchConfigurationType getFullTextSearchConfiguration() { return fullTextSearchConfiguration; } @@ -1129,6 +1130,8 @@ public FullTextSearchConfigurationType getFullTextSearchConfiguration() { @Override public void postInit(OperationResult result) throws SchemaException { + LOGGER.info("Executing repository postInit method"); + SystemConfigurationType systemConfiguration; try { systemConfiguration = getObject(SystemConfigurationType.class, @@ -1152,6 +1155,7 @@ public void postInit(OperationResult result) throws SchemaException { } } applyFullTextSearchConfiguration(systemConfiguration.getFullTextSearch()); + relationRegistry.applyRelationConfiguration(systemConfiguration); SystemConfigurationTypeUtil.applyOperationResultHandling(systemConfiguration); applyPrismConfiguration(systemConfiguration); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java index 61b3d2a5592..a2142c663f1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/RepositoryContext.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.sql.data.common.dictionary.ExtItemDictionary; +import com.evolveum.midpoint.schema.RelationRegistry; import org.jetbrains.annotations.NotNull; /** @@ -27,11 +28,14 @@ public class RepositoryContext { @NotNull public final RepositoryService repositoryService; @NotNull public final PrismContext prismContext; + @NotNull public final RelationRegistry relationRegistry; @NotNull public final ExtItemDictionary extItemDictionary; - public RepositoryContext(@NotNull RepositoryService repositoryService, @NotNull PrismContext prismContext, @NotNull ExtItemDictionary extItemDictionary) { + public RepositoryContext(@NotNull RepositoryService repositoryService, @NotNull PrismContext prismContext, + @NotNull RelationRegistry relationRegistry, @NotNull ExtItemDictionary extItemDictionary) { this.repositoryService = repositoryService; this.prismContext = prismContext; + this.relationRegistry = relationRegistry; this.extItemDictionary = extItemDictionary; } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java index 1c4efb44b79..4037eaf0142 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAbstractRole.java @@ -183,8 +183,9 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(AbstractRoleType jaxb, RAbstractRole repo, - RepositoryContext repositoryContext, IdGeneratorResult generatorResult) + RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RFocus.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); @@ -196,19 +197,19 @@ public static void copyFromJAXB(AbstractRoleType ja if (jaxb.getAutoassign() != null) { RAutoassignSpecification aa = new RAutoassignSpecification(); - RAutoassignSpecification.copyFromJAXB(jaxb.getAutoassign(), aa); + RAutoassignSpecification.formJaxb(jaxb.getAutoassign(), aa); repo.setAutoassign(aa); } for (AssignmentType inducement : jaxb.getInducement()) { RAssignment rInducement = new RAssignment(repo, RAssignmentOwner.ABSTRACT_ROLE); - RAssignment.copyFromJAXB(inducement, rInducement, jaxb, repositoryContext, generatorResult); + RAssignment.fromJaxb(inducement, rInducement, jaxb, repositoryContext, generatorResult); repo.getAssignments().add(rInducement); } for (ObjectReferenceType approverRef : jaxb.getApproverRef()) { - RObjectReference ref = RUtil.jaxbRefToRepo(approverRef, repositoryContext.prismContext, repo, RReferenceOwner.ROLE_APPROVER); + RObjectReference ref = RUtil.jaxbRefToRepo(approverRef, repo, RReferenceOwner.ROLE_APPROVER, repositoryContext.relationRegistry); if (ref != null) { repo.getApproverRef().add(ref); } @@ -218,6 +219,6 @@ public static void copyFromJAXB(AbstractRoleType ja repo.setApprovalProcess(jaxb.getApprovalProcess()); - repo.setOwnerRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); + repo.setOwnerRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.relationRegistry)); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java index 937ec654452..483acac72f3 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationCampaign.java @@ -194,13 +194,14 @@ public int hashCode() { stageNumber); } + // dynamically called public static void copyFromJAXB(AccessCertificationCampaignType jaxb, RAccessCertificationCampaign repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setDefinitionRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getDefinitionRef(), repositoryContext.prismContext)); + repo.setDefinitionRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getDefinitionRef(), repositoryContext.relationRegistry)); List cases = jaxb.getCase(); if (!cases.isEmpty()) { @@ -211,7 +212,7 @@ public static void copyFromJAXB(AccessCertificationCampaignType jaxb, RAccessCer } } - repo.setOwnerRefCampaign(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); + repo.setOwnerRefCampaign(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.relationRegistry)); repo.setHandlerUri(jaxb.getHandlerUri()); repo.setStart(jaxb.getStartTimestamp()); repo.setEnd(jaxb.getEndTimestamp()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java index 0b90becb3eb..c39bddd3e7d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RAccessCertificationDefinition.java @@ -140,6 +140,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(AccessCertificationDefinitionType jaxb, RAccessCertificationDefinition repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { @@ -148,7 +149,7 @@ public static void copyFromJAXB(AccessCertificationDefinitionType jaxb, RAccessC repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); repo.setHandlerUri(jaxb.getHandlerUri()); - repo.setOwnerRefDefinition(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); + repo.setOwnerRefDefinition(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.relationRegistry)); repo.setLastCampaignStartedTimestamp(jaxb.getLastCampaignStartedTimestamp()); repo.setLastCampaignClosedTimestamp(jaxb.getLastCampaignClosedTimestamp()); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RCase.java index dec2ce7399f..e0c12e59650 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RCase.java @@ -128,13 +128,14 @@ public String toString() { '}'; } + // dynamically called public static void copyFromJAXB(CaseType jaxb, RCase repo, RepositoryContext context, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, context, generatorResult); repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), context.prismContext)); + repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), context.relationRegistry)); repo.setState(jaxb.getState()); for (CaseWorkItemType workItem : jaxb.getWorkItem()) { repo.getWorkItems().add(RCaseWorkItem.toRepo(repo, workItem, context)); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java index 82291bb3418..39d01eceab1 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnector.java @@ -159,6 +159,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ConnectorType jaxb, RConnector repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); @@ -168,7 +169,7 @@ public static void copyFromJAXB(ConnectorType jaxb, RConnector repo, RepositoryC repo.setConnectorType(jaxb.getConnectorType()); repo.setConnectorVersion(jaxb.getConnectorVersion()); repo.setFramework(jaxb.getFramework()); - repo.setConnectorHostRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorHostRef(), repositoryContext.prismContext)); + repo.setConnectorHostRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorHostRef(), repositoryContext.relationRegistry)); if (jaxb.getConnectorHost() != null) { LOGGER.warn("Connector host from connector type won't be saved. It should be " + diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java index 498ab8e19a6..facc3130bd0 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RConnectorHost.java @@ -99,6 +99,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ConnectorHostType jaxb, RConnectorHost repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java index acfa585c349..64376c86df9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFocus.java @@ -306,6 +306,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(FocusType jaxb, RFocus repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { @@ -315,29 +316,29 @@ public static void copyFromJAXB(FocusType jaxb, RFocus repo.setCostCenter(jaxb.getCostCenter()); repo.getLinkRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getLinkRef(), repositoryContext.prismContext, repo, RReferenceOwner.USER_ACCOUNT)); + RUtil.safeListReferenceToSet(jaxb.getLinkRef(), repo, RReferenceOwner.USER_ACCOUNT, repositoryContext.relationRegistry)); repo.getRoleMembershipRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getRoleMembershipRef(), repositoryContext.prismContext, repo, RReferenceOwner.ROLE_MEMBER)); + RUtil.safeListReferenceToSet(jaxb.getRoleMembershipRef(), repo, RReferenceOwner.ROLE_MEMBER, repositoryContext.relationRegistry)); repo.getDelegatedRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getDelegatedRef(), repositoryContext.prismContext, repo, RReferenceOwner.DELEGATED)); + RUtil.safeListReferenceToSet(jaxb.getDelegatedRef(), repo, RReferenceOwner.DELEGATED, repositoryContext.relationRegistry)); repo.getPersonaRef().addAll( - RUtil.safeListReferenceToSet(jaxb.getPersonaRef(), repositoryContext.prismContext, repo, RReferenceOwner.PERSONA)); + RUtil.safeListReferenceToSet(jaxb.getPersonaRef(), repo, RReferenceOwner.PERSONA, repositoryContext.relationRegistry)); repo.setPolicySituation(RUtil.listToSet(jaxb.getPolicySituation())); for (AssignmentType assignment : jaxb.getAssignment()) { RAssignment rAssignment = new RAssignment(repo, RAssignmentOwner.FOCUS); - RAssignment.copyFromJAXB(assignment, rAssignment, jaxb, repositoryContext, generatorResult); + RAssignment.fromJaxb(assignment, rAssignment, jaxb, repositoryContext, generatorResult); repo.getAssignments().add(rAssignment); } if (jaxb.getActivation() != null) { RActivation activation = new RActivation(); - RActivation.copyFromJAXB(jaxb.getActivation(), activation, repositoryContext); + RActivation.fromJaxb(jaxb.getActivation(), activation, repositoryContext); repo.setActivation(activation); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java index 963bf33b8e5..959a31a7cce 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RForm.java @@ -75,6 +75,7 @@ public int hashCode() { return Objects.hash(super.hashCode(), nameCopy); } + // dynamically called public static void copyFromJAXB(FormType jaxb, RForm repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFunctionLibrary.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFunctionLibrary.java index 21311bd5667..2436c6db471 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFunctionLibrary.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RFunctionLibrary.java @@ -76,6 +76,7 @@ public int hashCode() { return Objects.hash(super.hashCode(), nameCopy); } + // dynamically called public static void copyFromJAXB(FunctionLibraryType jaxb, RFunctionLibrary repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java index ccda8a1119e..5b2d302c277 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RGenericObject.java @@ -88,6 +88,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(GenericObjectType jaxb, RGenericObject repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java index 4bf0f9ad814..afc93a90ff3 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RLookupTable.java @@ -57,6 +57,7 @@ public void setRows(Set rows) { this.rows = rows; } + // dynamically called public static void copyFromJAXB(LookupTableType jaxb, RLookupTable repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException, SchemaException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java index 0724b472238..68ba35b4c56 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RNode.java @@ -89,6 +89,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(NodeType jaxb, RNode repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java index a98ac3530a6..981dddf7a83 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObject.java @@ -689,6 +689,7 @@ protected static void copyToJAXB(RObject repo, ObjectT } } + // dynamically called public static void copyFromJAXB(ObjectType jaxb, RObject repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { @@ -709,18 +710,18 @@ public static void copyFromJAXB(ObjectType jaxb, RObject< .getVersion()) : 0; repo.setVersion(version); - repo.getParentOrgRef().addAll(RUtil.safeListReferenceToSet(jaxb.getParentOrgRef(), repositoryContext.prismContext, - repo, RReferenceOwner.OBJECT_PARENT_ORG)); + repo.getParentOrgRef().addAll(RUtil.safeListReferenceToSet(jaxb.getParentOrgRef(), + repo, RReferenceOwner.OBJECT_PARENT_ORG, repositoryContext.relationRegistry)); for (TriggerType trigger : jaxb.getTrigger()) { RTrigger rTrigger = new RTrigger(null); - RTrigger.copyFromJAXB(trigger, rTrigger, jaxb, repositoryContext, generatorResult); + RTrigger.fromJaxb(trigger, rTrigger, jaxb, repositoryContext, generatorResult); repo.getTrigger().add(rTrigger); } - MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext); - repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.prismContext)); + MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext, repositoryContext.relationRegistry); + repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.relationRegistry)); if (jaxb.getExtension() != null) { copyFromJAXB(jaxb.getExtension().asPrismContainerValue(), repo, repositoryContext, RObjectExtensionType.EXTENSION, generatorResult); @@ -729,7 +730,7 @@ public static void copyFromJAXB(ObjectType jaxb, RObject< repo.getTextInfoItems().addAll(RObjectTextInfo.createItemsSet(jaxb, repo, repositoryContext)); for (OperationExecutionType opExec : jaxb.getOperationExecution()) { ROperationExecution rOpExec = new ROperationExecution(repo); - ROperationExecution.copyFromJAXB(opExec, rOpExec, jaxb, repositoryContext, generatorResult); + ROperationExecution.fromJaxb(opExec, rOpExec, jaxb, repositoryContext, generatorResult); repo.getOperationExecutions().add(rOpExec); } } @@ -739,6 +740,7 @@ public String toString() { return RUtil.getDebugString(this); } + // dynamically called public static void copyFromJAXB(PrismContainerValue containerValue, RObject repo, RepositoryContext repositoryContext, RObjectExtensionType ownerType, IdGeneratorResult generatorResult) throws DtoTranslationException { RAnyConverter converter = new RAnyConverter(repositoryContext.prismContext, repositoryContext.extItemDictionary); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectCollection.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectCollection.java index 5013159e834..7f668aeea15 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectCollection.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectCollection.java @@ -76,6 +76,7 @@ public int hashCode() { return Objects.hash(super.hashCode(), nameCopy); } + // dynamically called public static void copyFromJAXB(ObjectCollectionType jaxb, RObjectCollection repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java index a64150f75c2..8a621dde3e6 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectReference.java @@ -26,6 +26,7 @@ import com.evolveum.midpoint.repo.sql.util.EntityState; import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister; import com.evolveum.midpoint.repo.sql.util.RUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import org.apache.commons.lang.Validate; @@ -36,7 +37,6 @@ import javax.persistence.*; import static com.evolveum.midpoint.repo.sql.util.RUtil.qnameToString; -import static com.evolveum.midpoint.schema.util.ObjectTypeUtil.normalizeRelation; /** * @author lazyman @@ -216,13 +216,13 @@ public static void copyToJAXB(RObjectReference repo, ObjectReferenceType jaxb) { jaxb.setRelation(RUtil.stringToQName(repo.getRelation())); } - public static ObjectReference copyFromJAXB(ObjectReferenceType jaxb, ObjectReference repo) { + public static ObjectReference copyFromJAXB(ObjectReferenceType jaxb, ObjectReference repo, RelationRegistry relationRegistry) { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); Validate.notEmpty(jaxb.getOid(), "Target oid must not be null."); repo.setType(ClassMapper.getHQLTypeForQName(jaxb.getType())); - repo.setRelation(qnameToString(normalizeRelation(jaxb.getRelation()))); + repo.setRelation(qnameToString(relationRegistry.normalizeRelation(jaxb.getRelation()))); repo.setTargetOid(jaxb.getOid()); return repo; diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java index 1a97bd777b1..fd9844aff52 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RObjectTemplate.java @@ -116,6 +116,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ObjectTemplateType jaxb, RObjectTemplate repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); @@ -124,6 +125,6 @@ public static void copyFromJAXB(ObjectTemplateType jaxb, RObjectTemplate repo, R repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); repo.getIncludeRef().addAll(RUtil.safeListReferenceToSet( - jaxb.getIncludeRef(), repositoryContext.prismContext, repo, RReferenceOwner.INCLUDE)); + jaxb.getIncludeRef(), repo, RReferenceOwner.INCLUDE, repositoryContext.relationRegistry)); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java index f8aee955892..6ea3333c906 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/ROrg.java @@ -120,6 +120,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(OrgType jaxb, ROrg repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RAbstractRole.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java index ee5d8d5e78c..dbdadf1ddab 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReport.java @@ -116,6 +116,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ReportType jaxb, RReport repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java index 3fee5a6e3b2..586e2023595 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RReportOutput.java @@ -74,11 +74,12 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ReportOutputType jaxb, RReportOutput repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setReportRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getReportRef(), repositoryContext.prismContext)); + repo.setReportRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getReportRef(), repositoryContext.relationRegistry)); } } \ No newline at end of file diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java index 35beecce586..29899eab303 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RResource.java @@ -146,12 +146,13 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ResourceType jaxb, RResource repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); - repo.setConnectorRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorRef(), repositoryContext.prismContext)); + repo.setConnectorRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConnectorRef(), repositoryContext.relationRegistry)); if (jaxb.getConnector() != null) { LOGGER.warn("Connector from resource type won't be saved. It should be translated to connector reference."); @@ -161,13 +162,13 @@ public static void copyFromJAXB(ResourceType jaxb, RResource repo, RepositoryCon if (jaxb.getBusiness() != null) { ResourceBusinessConfigurationType business = jaxb.getBusiness(); repo.getApproverRef().addAll(RUtil.safeListReferenceToSet(business.getApproverRef(), - repositoryContext.prismContext, repo, RReferenceOwner.RESOURCE_BUSINESS_CONFIGURATON_APPROVER)); + repo, RReferenceOwner.RESOURCE_BUSINESS_CONFIGURATON_APPROVER, repositoryContext.relationRegistry)); repo.setAdministrativeState(RUtil.getRepoEnumValue(business.getAdministrativeState(), RResourceAdministrativeState.class)); } if (jaxb.getOperationalState() != null) { ROperationalState repoOpState = new ROperationalState(); - ROperationalState.copyFromJAXB(jaxb.getOperationalState(), repoOpState); + ROperationalState.fromJaxb(jaxb.getOperationalState(), repoOpState); repo.setOperationalState(repoOpState); } } catch (Exception ex) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java index bf99203b414..5679bd9150f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RRole.java @@ -94,6 +94,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(RoleType jaxb, RRole repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RAbstractRole.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java index accf73f7c7f..06a92774071 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSecurityPolicy.java @@ -58,6 +58,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(SecurityPolicyType jaxb, RSecurityPolicy repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java index 662f6de55ab..658836585dd 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSequence.java @@ -77,6 +77,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(SequenceType jaxb, RSequence repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java index 5a184d6a77b..e631f26e914 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RService.java @@ -104,6 +104,7 @@ public int hashCode() { return Arrays.hashCode(new Object[]{nameCopy, serviceType, displayOrder}); } + // dynamically called public static void copyFromJAXB(ServiceType jaxb, RService repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RAbstractRole.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java index 52ebefb8099..f4197d5640f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RShadow.java @@ -259,6 +259,7 @@ public int hashCode() { return result1; } + // dynamically called public static void copyFromJAXB(ShadowType jaxb, RShadow repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); @@ -277,7 +278,7 @@ public static void copyFromJAXB(ShadowType jaxb, RShadow< } repo.setSynchronizationTimestamp(jaxb.getSynchronizationTimestamp()); - repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getResourceRef(), repositoryContext.prismContext)); + repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getResourceRef(), repositoryContext.relationRegistry)); repo.setAttemptNumber(jaxb.getAttemptNumber()); repo.setExists(jaxb.isExists()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java index 0b0b33be4bc..b0f10be3f0f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RSystemConfiguration.java @@ -77,6 +77,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(SystemConfigurationType jaxb, RSystemConfiguration repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java index 19352f690c5..324eca03d62 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RTask.java @@ -414,8 +414,9 @@ public int hashCode() { return result1; } + // dynamically called public static void copyFromJAXB(TaskType jaxb, RTask repo, RepositoryContext repositoryContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { + IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); PrismObjectDefinition taskDefinition = jaxb.asPrismObject().getDefinition(); @@ -435,17 +436,17 @@ public static void copyFromJAXB(TaskType jaxb, RTask repo, RepositoryContext rep repo.setCategory(jaxb.getCategory()); repo.setParent(jaxb.getParent()); - repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), repositoryContext.prismContext)); - repo.setOwnerRefTask(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.prismContext)); + repo.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getObjectRef(), repositoryContext.relationRegistry)); + repo.setOwnerRefTask(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOwnerRef(), repositoryContext.relationRegistry)); repo.setWaitingReason(RUtil.getRepoEnumValue(jaxb.getWaitingReason(), RTaskWaitingReason.class)); repo.setDependent(RUtil.listToSet(jaxb.getDependent())); WfContextType wfc = jaxb.getWorkflowContext(); if (wfc != null) { repo.setWfProcessInstanceId(wfc.getProcessInstanceId()); - repo.setWfRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), repositoryContext.prismContext)); - repo.setWfObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getObjectRef(), repositoryContext.prismContext)); - repo.setWfTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getTargetRef(), repositoryContext.prismContext)); + repo.setWfRequesterRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getRequesterRef(), repositoryContext.relationRegistry)); + repo.setWfObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getObjectRef(), repositoryContext.relationRegistry)); + repo.setWfTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(wfc.getTargetRef(), repositoryContext.relationRegistry)); repo.setWfStartTimestamp(wfc.getStartTimestamp()); repo.setWfEndTimestamp(wfc.getEndTimestamp()); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java index 070822d2a39..c589810e901 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RUser.java @@ -243,8 +243,9 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(UserType jaxb, RUser repo, RepositoryContext repositoryContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { + IdGeneratorResult generatorResult) throws DtoTranslationException { RFocus.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); repo.setNameCopy(RPolyString.copyFromJAXB(jaxb.getName())); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java index 166c9bf76f1..985d892d89e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/RValuePolicy.java @@ -77,6 +77,7 @@ public int hashCode() { return result; } + // dynamically called public static void copyFromJAXB(ValuePolicyType jaxb, RValuePolicy repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { RObject.copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java index e8d66123d04..c4219e84a46 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/any/RAssignmentExtension.java @@ -281,15 +281,15 @@ public int hashCode() { return result; } - public static void copyFromJAXB(ExtensionType jaxb, RAssignmentExtension repo, RAssignmentExtensionType type, - RepositoryContext repositoryContext) throws DtoTranslationException { + public static void fromJaxb(ExtensionType jaxb, RAssignmentExtension repo, RAssignmentExtensionType type, + RepositoryContext repositoryContext) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); - copyFromJAXB(jaxb.asPrismContainerValue(), repo, type, repositoryContext); + fromJaxb(jaxb.asPrismContainerValue(), repo, type, repositoryContext); } - private static void copyFromJAXB(PrismContainerValue containerValue, RAssignmentExtension repo, + private static void fromJaxb(PrismContainerValue containerValue, RAssignmentExtension repo, RAssignmentExtensionType type, RepositoryContext repositoryContext) throws DtoTranslationException { RAnyConverter converter = new RAnyConverter(repositoryContext.prismContext, repositoryContext.extItemDictionary); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java index 42f9b99e339..6faa85d5975 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java @@ -334,13 +334,13 @@ private static RAccessCertificationCase toRepo(RAccessCertificationCase rCase, A RepositoryContext context) throws DtoTranslationException { rCase.setTransient(null); // we don't try to advise hibernate - let it do its work, even if it would cost some SELECTs rCase.setId(RUtil.toInteger(case1.getId())); - rCase.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getObjectRef(), context.prismContext)); - rCase.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTargetRef(), context.prismContext)); - rCase.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTenantRef(), context.prismContext)); - rCase.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getOrgRef(), context.prismContext)); + rCase.setObjectRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getObjectRef(), context.relationRegistry)); + rCase.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTargetRef(), context.relationRegistry)); + rCase.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getTenantRef(), context.relationRegistry)); + rCase.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(case1.getOrgRef(), context.relationRegistry)); if (case1.getActivation() != null) { RActivation activation = new RActivation(); - RActivation.copyFromJAXB(case1.getActivation(), activation, context); + RActivation.fromJaxb(case1.getActivation(), activation, context); rCase.setActivation(activation); } for (AccessCertificationWorkItemType workItem : case1.getWorkItem()) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationWorkItem.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationWorkItem.java index 953d50120fb..9add2135545 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationWorkItem.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationWorkItem.java @@ -256,8 +256,8 @@ private static void toRepo(RAccessCertificationWorkItem rWorkItem, rWorkItem.setIteration(norm(workItem.getIteration())); rWorkItem.setStageNumber(workItem.getStageNumber()); rWorkItem.getAssigneeRef().addAll(RCertWorkItemReference.safeListReferenceToSet( - workItem.getAssigneeRef(), context.prismContext, rWorkItem)); - rWorkItem.setPerformerRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getPerformerRef(), context.prismContext)); + workItem.getAssigneeRef(), rWorkItem, context.relationRegistry)); + rWorkItem.setPerformerRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getPerformerRef(), context.relationRegistry)); rWorkItem.setOutcome(WorkItemTypeUtil.getOutcome(workItem)); rWorkItem.setOutputChangeTimestamp(workItem.getOutputChangeTimestamp()); rWorkItem.setCloseTimestamp(workItem.getCloseTimestamp()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java index 7b8107421d3..9d0ca25f161 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAssignment.java @@ -433,20 +433,19 @@ public int hashCode() { return result; } - public static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, RObject parent, - RepositoryContext repositoryContext) throws DtoTranslationException{ - copyFromJAXB(jaxb, repo, repositoryContext, null); + public static void fromJaxb(AssignmentType jaxb, RAssignment repo, RObject parent, + RepositoryContext repositoryContext) throws DtoTranslationException{ + fromJaxb(jaxb, repo, repositoryContext, null); repo.setOwner(parent); } - public static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, ObjectType parent, RepositoryContext repositoryContext, - IdGeneratorResult generatorResult) throws DtoTranslationException { - - copyFromJAXB(jaxb, repo, repositoryContext, generatorResult); + public static void fromJaxb(AssignmentType jaxb, RAssignment repo, ObjectType parent, RepositoryContext repositoryContext, + IdGeneratorResult generatorResult) throws DtoTranslationException { + fromJaxb(jaxb, repo, repositoryContext, generatorResult); repo.setOwnerOid(parent.getOid()); } - private static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, RepositoryContext repositoryContext, + private static void fromJaxb(AssignmentType jaxb, RAssignment repo, RepositoryContext repositoryContext, IdGeneratorResult generatorResult) throws DtoTranslationException { Validate.notNull(repo, "Repo object must not be null."); Validate.notNull(jaxb, "JAXB object must not be null."); @@ -465,13 +464,13 @@ private static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, Reposito extension.setOwner(repo); repo.setExtension(extension); - RAssignmentExtension.copyFromJAXB(jaxb.getExtension(), extension, RAssignmentExtensionType.EXTENSION, + RAssignmentExtension.fromJaxb(jaxb.getExtension(), extension, RAssignmentExtensionType.EXTENSION, repositoryContext); } if (jaxb.getActivation() != null) { RActivation activation = new RActivation(); - RActivation.copyFromJAXB(jaxb.getActivation(), activation, repositoryContext); + RActivation.fromJaxb(jaxb.getActivation(), activation, repositoryContext); repo.setActivation(activation); } @@ -479,17 +478,17 @@ private static void copyFromJAXB(AssignmentType jaxb, RAssignment repo, Reposito LOGGER.warn("Target from assignment type won't be saved. It should be translated to target reference."); } - repo.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTargetRef(), repositoryContext.prismContext)); + repo.setTargetRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTargetRef(), repositoryContext.relationRegistry)); - repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.prismContext)); + repo.setTenantRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getTenantRef(), repositoryContext.relationRegistry)); - repo.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOrgRef(), repositoryContext.prismContext)); + repo.setOrgRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getOrgRef(), repositoryContext.relationRegistry)); if (jaxb.getConstruction() != null) { - repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConstruction().getResourceRef(), repositoryContext.prismContext)); + repo.setResourceRef(RUtil.jaxbRefToEmbeddedRepoRef(jaxb.getConstruction().getResourceRef(), repositoryContext.relationRegistry)); } - MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext); + MetadataFactory.fromJAXB(jaxb.getMetadata(), repo, repositoryContext.prismContext, repositoryContext.relationRegistry); } @Override diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java index 203e0a9bfaa..759a0191ba9 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItem.java @@ -233,10 +233,10 @@ private static void toRepo(RCaseWorkItem rWorkItem, CaseWorkItemType workItem, R } rWorkItem.setId(idInt); rWorkItem.setStageNumber(workItem.getStageNumber()); - rWorkItem.setOriginalAssigneeRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getOriginalAssigneeRef(), context.prismContext)); + rWorkItem.setOriginalAssigneeRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getOriginalAssigneeRef(), context.relationRegistry)); rWorkItem.getAssigneeRef().addAll(RCaseWorkItemReference.safeListReferenceToSet( - workItem.getAssigneeRef(), context.prismContext, rWorkItem)); - rWorkItem.setPerformerRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getPerformerRef(), context.prismContext)); + workItem.getAssigneeRef(), rWorkItem, context.relationRegistry)); + rWorkItem.setPerformerRef(RUtil.jaxbRefToEmbeddedRepoRef(workItem.getPerformerRef(), context.relationRegistry)); rWorkItem.setOutcome(WorkItemTypeUtil.getOutcome(workItem)); rWorkItem.setCloseTimestamp(workItem.getCloseTimestamp()); rWorkItem.setDeadline(workItem.getDeadline()); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java index 4b4be890c62..ae1eb30657c 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RCaseWorkItemReference.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.repo.sql.data.common.container; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.sql.data.common.RObject; import com.evolveum.midpoint.repo.sql.data.common.id.RCaseWorkItemReferenceId; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; @@ -24,6 +23,7 @@ import com.evolveum.midpoint.repo.sql.query2.definition.NotQueryable; import com.evolveum.midpoint.repo.sql.util.MidPointSingleTablePersister; import com.evolveum.midpoint.repo.sql.util.RUtil; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import org.apache.commons.lang.Validate; import org.hibernate.annotations.ForeignKey; @@ -124,15 +124,15 @@ public RObjectType getType() { return super.getType(); } - public static Set safeListReferenceToSet(List list, PrismContext prismContext, - RCaseWorkItem owner) { + public static Set safeListReferenceToSet(List list, + RCaseWorkItem owner, RelationRegistry relationRegistry) { Set set = new HashSet<>(); if (list == null || list.isEmpty()) { return set; } for (ObjectReferenceType ref : list) { - RCaseWorkItemReference rRef = jaxbRefToRepo(ref, prismContext, owner); + RCaseWorkItemReference rRef = jaxbRefToRepo(ref, owner, relationRegistry); if (rRef != null) { set.add(rRef); } @@ -140,8 +140,8 @@ public static Set safeListReferenceToSet(List safeListReferenceToSet(List list, PrismContext prismContext, - RAccessCertificationWorkItem owner) { + public static Set safeListReferenceToSet(List list, + RAccessCertificationWorkItem owner, RelationRegistry relationRegistry) { Set set = new HashSet<>(); if (list == null || list.isEmpty()) { return set; } for (ObjectReferenceType ref : list) { - RCertWorkItemReference rRef = jaxbRefToRepo(ref, prismContext, owner); + RCertWorkItemReference rRef = jaxbRefToRepo(ref, owner, relationRegistry); if (rRef != null) { set.add(rRef); } @@ -152,8 +152,8 @@ public static Set safeListReferenceToSet(List safeListReferenceToSet(List list, PrismContext prismContext, - RAssignment owner, RCReferenceOwner refOwner) { + public static Set safeListReferenceToSet(List list, + RAssignment owner, RCReferenceOwner refOwner, RelationRegistry relationRegistry) { Set set = new HashSet<>(); if (list == null || list.isEmpty()) { return set; } for (ObjectReferenceType ref : list) { - RAssignmentReference rRef = jaxbRefToRepo(ref, prismContext, owner, refOwner); + RAssignmentReference rRef = jaxbRefToRepo(ref, owner, refOwner, relationRegistry); if (rRef != null) { set.add(rRef); } @@ -148,8 +150,8 @@ public static Set safeListReferenceToSet(List void handleObjectCommonAttributes(Class type, idGenerator.generate(prismObject); // normalize all relations - ObjectTypeUtil.normalizeAllRelations(prismObject); + ObjectTypeUtil.normalizeAllRelations(prismObject, relationRegistry); // full object column will be updated later } @@ -396,7 +392,7 @@ private void handleObjectTextInfoChanges(Class type, C } Set infos = RObjectTextInfo.createItemsSet((ObjectType) prismObject.asObjectable(), object, - new RepositoryContext(repositoryService, prismContext, extItemDictionary)); + new RepositoryContext(repositoryService, prismContext, relationRegistry, extItemDictionary)); if (infos == null || infos.isEmpty()) { object.getTextInfoItems().clear(); @@ -914,7 +910,9 @@ private Collection processDeltaValues(Collection results = new ArrayList(); for (PrismValue value : values) { MapperContext context = new MapperContext(); - context.setRepositoryContext(new RepositoryContext(repositoryService, prismContext, extItemDictionary)); + context.setRepositoryContext(new RepositoryContext(repositoryService, prismContext, relationRegistry, + extItemDictionary + )); context.setDelta(delta); context.setOwner(bean); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java index 0162c537240..efa82c18677 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectRetriever.java @@ -31,7 +31,6 @@ import com.evolveum.midpoint.repo.sql.data.common.any.RExtItem; import com.evolveum.midpoint.repo.sql.data.common.any.RItemKind; import com.evolveum.midpoint.repo.sql.data.common.dictionary.ExtItemDictionary; -import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; import com.evolveum.midpoint.repo.sql.data.common.type.RObjectExtensionType; import com.evolveum.midpoint.repo.sql.query.QueryException; import com.evolveum.midpoint.repo.sql.query.RQuery; @@ -85,6 +84,7 @@ public class ObjectRetriever { @Autowired private BaseHelper baseHelper; @Autowired private NameResolutionHelper nameResolutionHelper; @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; @Autowired private ExtItemDictionary extItemDictionary; @Autowired @Qualifier("repositoryService") @@ -320,7 +320,7 @@ public int countObjectsAttempt(Class type, ObjectQuery longCount = (Number) sqlQuery.uniqueResult(); } else { RQuery rQuery; - QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry); rQuery = engine.interpret(query, type, options, true, session); longCount = (Number) rQuery.uniqueResult(); @@ -352,7 +352,7 @@ public int countContainersAttempt(Class type, Objec try { session = baseHelper.beginReadOnlyTransaction(); - QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry); RQuery rQuery = engine.interpret(query, type, options, true, session); Number longCount = (Number) rQuery.uniqueResult(); LOGGER.trace("Found {} objects.", longCount); @@ -376,7 +376,7 @@ public SearchResultList> searchObjectsAtte session = baseHelper.beginReadOnlyTransaction(); RQuery rQuery; - QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry); rQuery = engine.interpret(query, type, options, false, session); @SuppressWarnings({"unchecked", "raw"}) @@ -440,7 +440,7 @@ public SearchResultList searchContainersAttempt(Cla try { session = baseHelper.beginReadOnlyTransaction(); - QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry); RQuery rQuery = engine.interpret(query, type, options, false, session); if (cases) { @@ -492,7 +492,7 @@ public SearchResultList searchContainersAttempt(Cla baseHelper.cleanupSessionAndResult(session, result); } - list.forEach(c -> ObjectTypeUtil.normalizeAllRelations(c.asPrismContainerValue())); + list.forEach(c -> ObjectTypeUtil.normalizeAllRelations(c.asPrismContainerValue(), relationRegistry)); return new SearchResultList<>(list); } @@ -594,7 +594,7 @@ private PrismObject updateLoadedObject(GetObjectResult nameResolutionHelper.resolveNamesIfRequested(session, prismObject.getValue(), options); validateObjectType(prismObject, type); - ObjectTypeUtil.normalizeAllRelations(prismObject); + ObjectTypeUtil.normalizeAllRelations(prismObject, relationRegistry); return prismObject; } @@ -739,7 +739,7 @@ public void searchObjectsIterativeAttempt(Class type, try { session = baseHelper.beginReadOnlyTransaction(); RQuery rQuery; - QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry); rQuery = engine.interpret(query, type, options, false, session); ScrollableResults results = rQuery.scroll(ScrollMode.FORWARD_ONLY); @@ -938,7 +938,7 @@ public RepositoryQueryDiagResponse executeQueryDiagnosticsRequest(RepositoryQuer final org.hibernate.Query query; final boolean isMidpointQuery = request.getImplementationLevelQuery() == null; if (isMidpointQuery) { - QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext); + QueryEngine2 engine = new QueryEngine2(getConfiguration(), extItemDictionary, prismContext, relationRegistry); RQueryImpl rQuery = (RQueryImpl) engine.interpret(request.getQuery(), request.getType(), null, false, session); query = rQuery.getQuery(); implementationLevelQuery = query.getQueryString(); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java index b22fdac41d2..78d5c012761 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/ObjectUpdater.java @@ -35,6 +35,7 @@ import com.evolveum.midpoint.repo.sql.util.PrismIdentifierGenerator; import com.evolveum.midpoint.repo.sql.util.RUtil; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.RetrieveOption; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; @@ -76,29 +77,15 @@ public class ObjectUpdater { @Qualifier("repositoryService") private RepositoryService repositoryService; - @Autowired - private BaseHelper baseHelper; - - @Autowired - private ObjectRetriever objectRetriever; - - @Autowired - private LookupTableHelper lookupTableHelper; - - @Autowired - private CertificationCaseHelper caseHelper; - - @Autowired - private OrgClosureManager closureManager; - - @Autowired - private ObjectDeltaUpdater objectDeltaUpdater; - - @Autowired - private PrismContext prismContext; - - @Autowired - private ExtItemDictionary extItemDictionary; + @Autowired private BaseHelper baseHelper; + @Autowired private ObjectRetriever objectRetriever; + @Autowired private LookupTableHelper lookupTableHelper; + @Autowired private CertificationCaseHelper caseHelper; + @Autowired private OrgClosureManager closureManager; + @Autowired private ObjectDeltaUpdater objectDeltaUpdater; + @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; + @Autowired private ExtItemDictionary extItemDictionary; public String addObjectAttempt(PrismObject object, RepoAddOptions options, OperationResult result) throws ObjectAlreadyExistsException, SchemaException { @@ -117,7 +104,7 @@ public String addObjectAttempt(PrismObject object, Rep if (LOGGER.isTraceEnabled()) { LOGGER.trace("Object\n{}", object.debugDump()); } - ObjectTypeUtil.normalizeAllRelations(object); + ObjectTypeUtil.normalizeAllRelations(object, relationRegistry); LOGGER.trace("Translating JAXB to data type."); PrismIdentifierGenerator.Operation operation = options.isOverwrite() ? @@ -432,7 +419,7 @@ public void modifyObjectAttempt(Class type, String oid // merge and update object LOGGER.trace("Translating JAXB to data type."); - ObjectTypeUtil.normalizeAllRelations(prismObject); + ObjectTypeUtil.normalizeAllRelations(prismObject, relationRegistry); PrismIdentifierGenerator idGenerator = new PrismIdentifierGenerator<>(PrismIdentifierGenerator.Operation.MODIFY); RObject rObject = createDataObjectFromJAXB(prismObject, idGenerator); rObject.setVersion(rObject.getVersion() + 1); @@ -547,9 +534,12 @@ public RObject createDataObjectFromJAXB(PrismObject pr Class clazz = ClassMapper.getHQLTypeClass(object.getClass()); try { rObject = clazz.newInstance(); + // Note that methods named "copyFromJAXB" that were _not_ called from this point were renamed e.g. to "fromJaxb", + // in order to avoid confusion with dynamically called "copyFromJAXB" method. Method method = clazz.getMethod("copyFromJAXB", object.getClass(), clazz, RepositoryContext.class, IdGeneratorResult.class); - method.invoke(clazz, object, rObject, new RepositoryContext(repositoryService, prismContext, extItemDictionary), generatorResult); + method.invoke(clazz, object, rObject, new RepositoryContext(repositoryService, prismContext, relationRegistry, + extItemDictionary), generatorResult); } catch (Exception ex) { SerializationRelatedException serializationException = ExceptionUtil.findCause(ex, SerializationRelatedException.class); if (serializationException != null) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ActivationMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ActivationMapper.java index d2f8a27d83b..6f51b163811 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ActivationMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ActivationMapper.java @@ -31,7 +31,7 @@ public class ActivationMapper implements Mapper { public RActivation map(ActivationType input, MapperContext context) { try { RActivation ractivation = new RActivation(); - RActivation.copyFromJAXB(input, ractivation, null); + RActivation.fromJaxb(input, ractivation, null); return ractivation; } catch (DtoTranslationException ex) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentMapper.java index 2d04bef5d88..a2a072f6a95 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AssignmentMapper.java @@ -48,7 +48,7 @@ public RAssignment map(AssignmentType input, MapperContext context) { RObject owner = (RObject) context.getOwner(); try { - RAssignment.copyFromJAXB(input, ass, owner, context.getRepositoryContext()); + RAssignment.fromJaxb(input, ass, owner, context.getRepositoryContext()); } catch (DtoTranslationException ex) { throw new SystemException("Couldn't translate assignment to entity", ex); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AutoassignSpecificationMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AutoassignSpecificationMapper.java index 8090b065aed..e5fb892b854 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AutoassignSpecificationMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/AutoassignSpecificationMapper.java @@ -28,7 +28,7 @@ public class AutoassignSpecificationMapper implements Mapper { public Metadata map(MetadataType input, MapperContext context) { Metadata metadata = (Metadata) context.getOwner(); try { - MetadataFactory.fromJAXB(input, metadata, context.getPrismContext()); + MetadataFactory.fromJAXB(input, metadata, context.getPrismContext(), context.getRelationRegistry()); } catch (DtoTranslationException ex) { throw new SystemException("Couldn't translate metadata to entity"); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ObjectReferenceMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ObjectReferenceMapper.java index fe8b3345a1e..f6b2cb1ef0f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ObjectReferenceMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/ObjectReferenceMapper.java @@ -44,7 +44,7 @@ public RObjectReference map(Referencable input, MapperContext context) { objectRef.setupReferenceValue(input.asReferenceValue()); } - ObjectTypeUtil.normalizeRelation(objectRef); + ObjectTypeUtil.normalizeRelation(objectRef, context.getRelationRegistry()); RObject owner = (RObject) context.getOwner(); @@ -54,7 +54,7 @@ public RObjectReference map(Referencable input, MapperContext context) { NameItemPathSegment last = named.lastNamed(); RReferenceOwner refType = RReferenceOwner.getOwnerByQName(jaxbObjectType, last.getName()); - return RUtil.jaxbRefToRepo(objectRef, context.getPrismContext(), owner, refType); + return RUtil.jaxbRefToRepo(objectRef, owner, refType, context.getRelationRegistry()); } } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationExecutionMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationExecutionMapper.java index 7a6d8238bb7..6e709d70bd0 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationExecutionMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationExecutionMapper.java @@ -35,7 +35,7 @@ public ROperationExecution map(OperationExecutionType input, MapperContext conte RObject owner = (RObject) context.getOwner(); try { - ROperationExecution.copyFromJAXB(input, execution, owner, context.getRepositoryContext()); + ROperationExecution.fromJaxb(input, execution, owner, context.getRepositoryContext()); } catch (DtoTranslationException ex) { throw new SystemException("Couldn't translate trigger to entity", ex); } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationalStateMapper.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationalStateMapper.java index 1b5057965ef..781dd41823b 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationalStateMapper.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/helpers/mapper/OperationalStateMapper.java @@ -31,7 +31,7 @@ public class OperationalStateMapper implements Mapper O map(I input, Class outputType, MapperContext context) { if (context == null) { context = new MapperContext(); } - context.setRepositoryContext(new RepositoryContext(repositoryService, prismContext, extItemDictionary)); + context.setRepositoryContext(new RepositoryContext(repositoryService, prismContext, relationRegistry, extItemDictionary)); Key key = buildKey(input.getClass(), outputType); Mapper mapper = mappers.get(key); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/InterpretationContext.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/InterpretationContext.java index 3c8b5415a4c..794ab27256d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/InterpretationContext.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/InterpretationContext.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.repo.sql.query2.definition.JpaEntityDefinition; import com.evolveum.midpoint.repo.sql.query2.hqm.RootHibernateQuery; import com.evolveum.midpoint.repo.sql.query2.resolution.ItemPathResolver; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -39,6 +40,7 @@ public class InterpretationContext { private QueryInterpreter2 interpreter; private PrismContext prismContext; + private RelationRegistry relationRegistry; private Session session; private ExtItemDictionary extItemDictionary; @@ -56,17 +58,20 @@ public class InterpretationContext { private JpaEntityDefinition rootEntityDefinition; public InterpretationContext(QueryInterpreter2 interpreter, Class type, - PrismContext prismContext, ExtItemDictionary extItemDictionary, Session session) throws QueryException { + PrismContext prismContext, RelationRegistry relationRegistry, + ExtItemDictionary extItemDictionary, Session session) throws QueryException { Validate.notNull(interpreter, "interpreter"); Validate.notNull(type, "type"); Validate.notNull(prismContext, "prismContext"); + Validate.notNull(relationRegistry, "relationRegistry"); Validate.notNull(extItemDictionary, "extItemDictionary"); Validate.notNull(session, "session"); this.interpreter = interpreter; this.type = type; this.prismContext = prismContext; + this.relationRegistry = relationRegistry; this.extItemDictionary = extItemDictionary; this.session = session; @@ -85,6 +90,10 @@ public PrismContext getPrismContext() { return prismContext; } + public RelationRegistry getRelationRegistry() { + return relationRegistry; + } + public Session getSession() { return session; } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryEngine2.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryEngine2.java index 51d9f3106de..306a60bb02e 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryEngine2.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryEngine2.java @@ -25,6 +25,7 @@ import com.evolveum.midpoint.repo.sql.query.RQuery; import com.evolveum.midpoint.repo.sql.query2.hqm.RootHibernateQuery; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.logging.Trace; @@ -44,11 +45,14 @@ public class QueryEngine2 { private SqlRepositoryConfiguration repoConfiguration; private ExtItemDictionary extItemDictionary; private PrismContext prismContext; + private final RelationRegistry relationRegistry; - public QueryEngine2(SqlRepositoryConfiguration config, ExtItemDictionary extItemDictionary, PrismContext prismContext) { + public QueryEngine2(SqlRepositoryConfiguration config, ExtItemDictionary extItemDictionary, PrismContext prismContext, + RelationRegistry relationRegistry) { this.repoConfiguration = config; this.extItemDictionary = extItemDictionary; this.prismContext = prismContext; + this.relationRegistry = relationRegistry; } public RQuery interpret(ObjectQuery query, Class type, @@ -56,7 +60,7 @@ public RQuery interpret(ObjectQuery query, Class type, boolean countingObjects, Session session) throws QueryException { QueryInterpreter2 interpreter = new QueryInterpreter2(repoConfiguration, extItemDictionary); - RootHibernateQuery hibernateQuery = interpreter.interpret(query, type, options, prismContext, countingObjects, session); + RootHibernateQuery hibernateQuery = interpreter.interpret(query, type, options, prismContext, relationRegistry, countingObjects, session); Query hqlQuery = hibernateQuery.getAsHqlQuery(session); if (LOGGER.isTraceEnabled()) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryInterpreter2.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryInterpreter2.java index c8a11b58f90..00543d67c6d 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryInterpreter2.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/QueryInterpreter2.java @@ -40,6 +40,7 @@ import com.evolveum.midpoint.repo.sql.query2.restriction.*; import com.evolveum.midpoint.repo.sql.util.*; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; @@ -48,7 +49,6 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType; import org.apache.commons.lang3.StringUtils; import org.hibernate.Session; -import org.hibernate.criterion.Projections; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -110,12 +110,12 @@ public SqlRepositoryConfiguration getRepoConfiguration() { } public RootHibernateQuery interpret(ObjectQuery query, @NotNull Class type, - Collection> options, @NotNull PrismContext prismContext, - boolean countingObjects, @NotNull Session session) throws QueryException { + Collection> options, @NotNull PrismContext prismContext, + @NotNull RelationRegistry relationRegistry, boolean countingObjects, @NotNull Session session) throws QueryException { boolean distinctRequested = GetOperationOptions.isDistinct(SelectorOptions.findRootOptions(options)); LOGGER.trace("Interpreting query for type '{}' (counting={}, distinctRequested={}), query:\n{}", type, countingObjects, distinctRequested, query); - InterpretationContext context = new InterpretationContext(this, type, prismContext, extItemDictionary, session); + InterpretationContext context = new InterpretationContext(this, type, prismContext, relationRegistry, extItemDictionary, session); interpretQueryFilter(context, query); String rootAlias = context.getHibernateQuery().getPrimaryEntityAlias(); ResultStyle resultStyle = getResultStyle(context); @@ -144,7 +144,8 @@ u.oid in (select distinct u.oid from RUser u where ...) hibernateQuery.addProjectionElementsFor(resultStyle.getIdentifiers(rootAlias)); if (distinct && !distinctBlobCapable) { String subqueryText = "\n" + hibernateQuery.getAsHqlText(2, true); - InterpretationContext wrapperContext = new InterpretationContext(this, type, prismContext, extItemDictionary, session); + InterpretationContext wrapperContext = new InterpretationContext(this, type, prismContext, relationRegistry, + extItemDictionary, session); interpretPagingAndSorting(wrapperContext, query, false); RootHibernateQuery wrapperQuery = wrapperContext.getHibernateQuery(); if (repoConfiguration.isUsingSQLServer() && resultStyle.getIdentifiers("").size() > 1) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/OrgRestriction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/OrgRestriction.java index e96541e6fb5..a9a5fde7209 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/OrgRestriction.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/OrgRestriction.java @@ -58,7 +58,7 @@ public Condition interpret() throws QueryException { String relationParamName = ""; QName relation = filter.getOrgRef().getRelation(); if (doesRelationRestrictionExist(relation)) { - relationParamName = hibernateQuery.addParameter("relation", ReferenceRestriction.getRelationsToTest(relation)); + relationParamName = hibernateQuery.addParameter("relation", ReferenceRestriction.getRelationsToTest(relation, context)); } String oidQueryText; // oid in ... switch (filter.getScope()) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/ReferenceRestriction.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/ReferenceRestriction.java index df04f5b3d96..ac3ccb39cfa 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/ReferenceRestriction.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/query2/restriction/ReferenceRestriction.java @@ -33,8 +33,6 @@ import com.evolveum.midpoint.repo.sql.query2.hqm.condition.OrCondition; import com.evolveum.midpoint.repo.sql.util.ClassMapper; import com.evolveum.midpoint.repo.sql.util.RUtil; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.MiscUtil; import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.util.exception.SchemaException; @@ -45,8 +43,7 @@ import javax.xml.namespace.QName; import java.util.*; - -import static com.evolveum.midpoint.repo.sql.util.RUtil.qnameToString; +import java.util.stream.Collectors; /** * @author lazyman @@ -85,7 +82,7 @@ public Condition interpretInternal() throws QueryException { } oids.add(value.getOid()); if (value.getRelation() == null) { - relations.add(SchemaConstants.ORG_DEFAULT); + relations.add(context.getPrismContext().getDefaultRelation()); } else { // we intentionally don't normalize relations namespaces, to be able to do namespace-insensitive searches // so the caller is responsible to unify namespaces if he needs to optimize queries (use IN instead of OR) @@ -135,7 +132,7 @@ private Condition createRefCondition(RootHibernateQuery hibernateQuery, AndCondition conjunction = hibernateQuery.createAnd(); conjunction.add(hibernateQuery.createEqOrInOrNull(hqlDataInstance.getHqlPath() + "." + TARGET_OID_HQL_PROPERTY, oids)); - List relationsToTest = getRelationsToTest(relation); + List relationsToTest = getRelationsToTest(relation, getContext()); if (!relationsToTest.isEmpty()) { conjunction.add(hibernateQuery.createEqOrInOrNull(hqlPath + "." + RELATION_HQL_PROPERTY, relationsToTest)); } @@ -151,26 +148,13 @@ private Condition createRefCondition(RootHibernateQuery hibernateQuery, // // Return: empty list means "nothing to test". @NotNull - static List getRelationsToTest(QName relation) { - if (ObjectTypeUtil.isDefaultRelation(relation)) { - // Return references without relation or with "default" relation - return Arrays.asList(RUtil.QNAME_DELIMITER, qnameToString(SchemaConstants.ORG_DEFAULT)); - } else if (QNameUtil.match(relation, PrismConstants.Q_ANY)) { - // Return all relations => no restriction - return Collections.emptyList(); - } else { - // return references with specific relation - List rv = new ArrayList<>(); - rv.add(qnameToString(relation)); - if (QNameUtil.noNamespace(relation)) { - rv.add(qnameToString(QNameUtil.setNamespaceIfMissing(relation, SchemaConstants.NS_ORG, null))); - } else if (SchemaConstants.NS_ORG.equals(relation.getNamespaceURI())) { - rv.add(qnameToString(new QName(relation.getLocalPart()))); - } else { - // non-empty non-standard NS => nothing to add - } - return rv; - } + static List getRelationsToTest(QName relation, InterpretationContext context) { + if (QNameUtil.match(relation, PrismConstants.Q_ANY)) { + return Collections.emptyList(); // Return all relations => no restriction + } else { + Collection aliases = context.getRelationRegistry().getAliases(relation); + return aliases.stream().map(RUtil::qnameToString).collect(Collectors.toList()); + } } private Condition handleEqInOrNull(RootHibernateQuery hibernateQuery, String propertyName, Object value) { diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java index beab9676051..805d980653f 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/util/RUtil.java @@ -28,13 +28,13 @@ import com.evolveum.midpoint.repo.sql.data.common.container.RAssignment; import com.evolveum.midpoint.repo.sql.data.common.container.RAssignmentReference; import com.evolveum.midpoint.repo.sql.data.common.container.RTrigger; -import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedNamedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.REmbeddedReference; import com.evolveum.midpoint.repo.sql.data.common.embedded.RPolyString; import com.evolveum.midpoint.repo.sql.data.common.enums.ROperationResultStatus; import com.evolveum.midpoint.repo.sql.data.common.enums.SchemaEnum; import com.evolveum.midpoint.repo.sql.data.common.other.RObjectType; import com.evolveum.midpoint.repo.sql.data.common.other.RReferenceOwner; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.exception.SystemException; @@ -158,15 +158,15 @@ public static List safeSetReferencesToList(Set list, PrismContext prismContext, - RObject owner, RReferenceOwner refOwner) { + public static Set safeListReferenceToSet(List list, + RObject owner, RReferenceOwner refOwner, RelationRegistry relationRegistry) { Set set = new HashSet<>(); if (list == null || list.isEmpty()) { return set; } for (ObjectReferenceType ref : list) { - RObjectReference rRef = RUtil.jaxbRefToRepo(ref, prismContext, owner, refOwner); + RObjectReference rRef = RUtil.jaxbRefToRepo(ref, owner, refOwner, relationRegistry); if (rRef != null) { set.add(rRef); } @@ -174,8 +174,8 @@ public static Set safeListReferenceToSet(List list, PrismCo return set; } - public static RObjectReference jaxbRefToRepo(ObjectReferenceType reference, PrismContext prismContext, - RObject owner, RReferenceOwner refOwner) { + public static RObjectReference jaxbRefToRepo(ObjectReferenceType reference, + RObject owner, RReferenceOwner refOwner, RelationRegistry relationRegistry) { if (reference == null) { return null; } @@ -186,31 +186,31 @@ public static RObjectReference jaxbRefToRepo(ObjectReferenceType reference, Pris RObjectReference repoRef = new RObjectReference(); repoRef.setReferenceType(refOwner); repoRef.setOwner(owner); - RObjectReference.copyFromJAXB(reference, repoRef); + RObjectReference.copyFromJAXB(reference, repoRef, relationRegistry); return repoRef; } public static REmbeddedReference jaxbRefToEmbeddedRepoRef(ObjectReferenceType jaxb, - PrismContext prismContext) { + RelationRegistry relationRegistry) { if (jaxb == null) { return null; } REmbeddedReference ref = new REmbeddedReference(); - REmbeddedReference.copyFromJAXB(jaxb, ref); + REmbeddedReference.fromJaxb(jaxb, ref, relationRegistry); return ref; } - public static REmbeddedNamedReference jaxbRefToEmbeddedNamedRepoRef(ObjectReferenceType jaxb) { - if (jaxb == null) { - return null; - } - REmbeddedNamedReference ref = new REmbeddedNamedReference(); - REmbeddedNamedReference.copyFromJAXB(jaxb, ref); - - return ref; - } +// public static REmbeddedNamedReference jaxbRefToEmbeddedNamedRepoRef(ObjectReferenceType jaxb) { +// if (jaxb == null) { +// return null; +// } +// REmbeddedNamedReference ref = new REmbeddedNamedReference(); +// REmbeddedNamedReference.copyFromJAXB(jaxb, ref); +// +// return ref; +// } public static Integer getIntegerFromString(String val) { if (val == null || !val.matches("[0-9]+")) { diff --git a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java index 614e7658246..1bed093d74b 100644 --- a/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java +++ b/repo/repo-test-util/src/main/java/com/evolveum/midpoint/test/AbstractIntegrationTest.java @@ -2086,7 +2086,7 @@ protected void assertRoleMembershipRef(PrismObject focu if (!expectedOid.equals(hasRef.getOid())) { return false; } - if (!ObjectTypeUtil.relationMatches(relation, hasRef.getRelation())) { + if (!prismContext.relationMatches(relation, hasRef.getRelation())) { return false; } return true; diff --git a/repo/repo-test-util/src/main/resources/ctx-configuration-test-no-repo.xml b/repo/repo-test-util/src/main/resources/ctx-configuration-test-no-repo.xml index 4f90a32761d..53971a1aad9 100644 --- a/repo/repo-test-util/src/main/resources/ctx-configuration-test-no-repo.xml +++ b/repo/repo-test-util/src/main/resources/ctx-configuration-test-no-repo.xml @@ -55,6 +55,8 @@ + + diff --git a/repo/repo-test-util/src/main/resources/ctx-configuration-test.xml b/repo/repo-test-util/src/main/resources/ctx-configuration-test.xml index f0e5b4dfdb8..dca231803d8 100644 --- a/repo/repo-test-util/src/main/resources/ctx-configuration-test.xml +++ b/repo/repo-test-util/src/main/resources/ctx-configuration-test.xml @@ -66,6 +66,8 @@ + + diff --git a/repo/security-enforcer-impl/src/main/java/com/evolveum/midpoint/security/enforcer/impl/SecurityEnforcerImpl.java b/repo/security-enforcer-impl/src/main/java/com/evolveum/midpoint/security/enforcer/impl/SecurityEnforcerImpl.java index 5fbb7409c61..ac6a3989a37 100644 --- a/repo/security-enforcer-impl/src/main/java/com/evolveum/midpoint/security/enforcer/impl/SecurityEnforcerImpl.java +++ b/repo/security-enforcer-impl/src/main/java/com/evolveum/midpoint/security/enforcer/impl/SecurityEnforcerImpl.java @@ -16,13 +16,13 @@ package com.evolveum.midpoint.security.enforcer.impl; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.List; import java.util.function.Consumer; import javax.xml.namespace.QName; +import com.evolveum.midpoint.schema.RelationRegistry; import org.apache.commons.lang.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -66,9 +66,7 @@ import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalsConfig; import com.evolveum.midpoint.schema.result.OperationResult; -import com.evolveum.midpoint.schema.util.MiscSchemaUtil; import com.evolveum.midpoint.schema.util.ObjectQueryUtil; -import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.Authorization; import com.evolveum.midpoint.security.api.AuthorizationConstants; import com.evolveum.midpoint.security.api.MidPointPrincipal; @@ -129,7 +127,8 @@ public class SecurityEnforcerImpl implements SecurityEnforcer { @Autowired private TaskManager taskManager; @Autowired private ExpressionFactory expressionFactory; @Autowired private PrismContext prismContext; - + @Autowired private RelationRegistry relationRegistry; + @Autowired @Qualifier("securityContextManager") private SecurityContextManager securityContextManager; @@ -679,7 +678,7 @@ private boolean isApplicable(SubjectedObjectSelectorType continue; } if (principal.getOid().equals(objectAssignmentTargetRef.getOid())) { - if (QNameUtil.match(SchemaConstants.ORG_DEPUTY, objectAssignmentTargetRef.getRelation())) { + if (relationRegistry.isDelegation(objectAssignmentTargetRef.getRelation())) { found = true; break; } @@ -750,7 +749,7 @@ private boolean isSelf(SubjectedObjectSelectorType spec) throws SchemaException private boolean matchesOrgRelation(PrismObject object, ObjectReferenceType subjectParentOrgRef, OrgRelationObjectSpecificationType specOrgRelation, String autzHumanReadableDesc, String desc) throws SchemaException { - if (!MiscSchemaUtil.compareRelation(specOrgRelation.getSubjectRelation(), subjectParentOrgRef.getRelation())) { + if (!prismContext.relationMatches(specOrgRelation.getSubjectRelation(), subjectParentOrgRef.getRelation())) { return false; } if (BooleanUtils.isTrue(specOrgRelation.isIncludeReferenceOrg()) && subjectParentOrgRef.getOid().equals(object.getOid())) { @@ -783,7 +782,7 @@ private boolean hasParentOrgRef(PrismObject object, St private boolean matchesRoleRelation(PrismObject object, ObjectReferenceType subjectRoleMembershipRef, RoleRelationObjectSpecificationType specRoleRelation, String autzHumanReadableDesc, String desc) throws SchemaException { - if (!MiscSchemaUtil.compareRelation(specRoleRelation.getSubjectRelation(), subjectRoleMembershipRef.getRelation())) { + if (!prismContext.relationMatches(specRoleRelation.getSubjectRelation(), subjectRoleMembershipRef.getRelation())) { return false; } if (BooleanUtils.isTrue(specRoleRelation.isIncludeReferenceRole()) && subjectRoleMembershipRef.getOid().equals(object.getOid())) { @@ -797,7 +796,7 @@ private boolean matchesRoleRelation(PrismObject object if (!subjectRoleMembershipRef.getOid().equals(objectRoleMembershipRef.getOid())) { continue; } - if (!MiscSchemaUtil.compareRelation(specRoleRelation.getObjectRelation(), objectRoleMembershipRef.getRelation())) { + if (!prismContext.relationMatches(specRoleRelation.getObjectRelation(), objectRoleMembershipRef.getRelation())) { continue; } return true; @@ -1254,7 +1253,7 @@ private ObjectFilter preProcessObje ObjectFilter objSpecOrgRelationFilter = null; QName subjectRelation = specOrgRelation.getSubjectRelation(); for (ObjectReferenceType subjectParentOrgRef: principal.getUser().getParentOrgRef()) { - if (MiscSchemaUtil.compareRelation(subjectRelation, subjectParentOrgRef.getRelation())) { + if (prismContext.relationMatches(subjectRelation, subjectParentOrgRef.getRelation())) { S_FilterEntryOrEmpty q = QueryBuilder.queryFor(ObjectType.class, prismContext); S_AtomicFilterExit q2; if (specOrgRelation.getScope() == null || specOrgRelation.getScope() == OrgScopeType.ALL_DESCENDANTS) { @@ -1484,7 +1483,7 @@ private ObjectFilter processRoleRelationFilter(MidPointPrincipal principal, Auth QName subjectRelation = specRoleRelation.getSubjectRelation(); boolean isRoleOidOk = false; for (ObjectReferenceType subjectRoleMembershipRef: principal.getUser().getRoleMembershipRef()) { - if (!MiscSchemaUtil.compareRelation(subjectRelation, subjectRoleMembershipRef.getRelation())) { + if (!prismContext.relationMatches(subjectRelation, subjectRoleMembershipRef.getRelation())) { continue; } if (!PrismReferenceValue.containsOid(queryRoleRefs, subjectRoleMembershipRef.getOid())) { @@ -1533,7 +1532,7 @@ private ObjectFilter applyOwnerFilterOwnerRef(ItemPath ow .item(ownerRefPath, ownerRefDef).ref(principal.getUser().getOid()); // TODO don't understand this code for (ObjectReferenceType subjectParentOrgRef: principal.getUser().getParentOrgRef()) { - if (ObjectTypeUtil.isDefaultRelation(subjectParentOrgRef.getRelation())) { + if (prismContext.isDefaultRelation(subjectParentOrgRef.getRelation())) { builder = builder.or().item(ownerRefPath, ownerRefDef).ref(subjectParentOrgRef.getOid()); } } diff --git a/repo/system-init/src/main/resources/ctx-configuration.xml b/repo/system-init/src/main/resources/ctx-configuration.xml index c6bdc448596..992dc93ca5f 100644 --- a/repo/system-init/src/main/resources/ctx-configuration.xml +++ b/repo/system-init/src/main/resources/ctx-configuration.xml @@ -60,6 +60,7 @@ + diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java index afe4c822493..9836bfca612 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/TaskManagerQuartzImpl.java @@ -38,6 +38,7 @@ import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.repo.api.PreconditionViolationException; import com.evolveum.midpoint.repo.api.RepoAddOptions; +import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.task.api.*; import com.evolveum.midpoint.task.quartzimpl.handlers.PartitioningTaskHandler; import com.evolveum.midpoint.task.quartzimpl.work.WorkStateManager; @@ -71,11 +72,6 @@ import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.repo.api.RepositoryService; -import com.evolveum.midpoint.schema.GetOperationOptions; -import com.evolveum.midpoint.schema.ResultHandler; -import com.evolveum.midpoint.schema.SearchResultList; -import com.evolveum.midpoint.schema.SearchResultMetadata; -import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.result.OperationResultStatus; import com.evolveum.midpoint.security.api.SecurityContextManager; @@ -176,6 +172,7 @@ public class TaskManagerQuartzImpl implements TaskManager, BeanFactoryAware { @Autowired private PrismContext prismContext; @Autowired private WorkStateManager workStateManager; @Autowired private WorkersManager workersManager; + @Autowired private RelationRegistry relationRegistry; @Autowired @Qualifier("securityContextManager") @@ -1742,7 +1739,11 @@ public RepositoryService getRepositoryService() { return repositoryService; } - public ExecutionManager getExecutionManager() { + public RelationRegistry getRelationRegistry() { + return relationRegistry; + } + + public ExecutionManager getExecutionManager() { return executionManager; } diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java index f022fc73489..f998c994cb6 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/cluster/ClusterManager.java @@ -213,13 +213,10 @@ public void startClusterManagerThread() { clusterManagerThread.start(); } - - private RepositoryService getRepositoryService() { return taskManager.getRepositoryService(); } - public String dumpNodeInfo(NodeType node) { return node.getNodeIdentifier() + " (" + node.getHostname() + ")"; } @@ -299,6 +296,7 @@ public void checkSystemConfigurationChanged(OperationResult parentResult) { SecurityUtil.setRemoteHostAddressHeaders(config.asObjectable()); getRepositoryService().applyFullTextSearchConfiguration(config.asObjectable().getFullTextSearch()); + taskManager.getRelationRegistry().applyRelationConfiguration(config.asObjectable()); SystemConfigurationTypeUtil.applyOperationResultHandling(config.asObjectable()); } else { if (LOGGER.isTraceEnabled()) { diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestPlentyOfAssignments.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestPlentyOfAssignments.java index 9962a248bbc..ace4552d945 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestPlentyOfAssignments.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestPlentyOfAssignments.java @@ -748,7 +748,7 @@ private void assertRoleMembershipRef(PrismObject user, String roleOidF private void assertRoleMembershipRef(PrismObject user, String roleOid, QName relation) { List roleMembershipRefs = user.asObjectable().getRoleMembershipRef(); for (ObjectReferenceType roleMembershipRef: roleMembershipRefs) { - if (ObjectTypeUtil.referenceMatches(roleMembershipRef, roleOid, RoleType.COMPLEX_TYPE, relation)) { + if (ObjectTypeUtil.referenceMatches(roleMembershipRef, roleOid, RoleType.COMPLEX_TYPE, relation, prismContext)) { return; } } diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/notorious/AbstractNotoriousTest.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/notorious/AbstractNotoriousTest.java index 1b6c3bbd194..190c9088549 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/notorious/AbstractNotoriousTest.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/notorious/AbstractNotoriousTest.java @@ -15,16 +15,10 @@ */ package com.evolveum.midpoint.testing.story.notorious; -import static org.testng.AssertJUnit.assertEquals; - import java.io.File; -import java.io.IOException; import java.util.ArrayList; import java.util.Collection; -import java.util.HashMap; import java.util.List; -import java.util.Map; -import java.util.function.Consumer; import javax.xml.namespace.QName; @@ -35,13 +29,10 @@ import com.evolveum.midpoint.model.api.context.ModelContext; import com.evolveum.midpoint.prism.PrismObject; -import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.prism.delta.ItemDelta; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.internals.InternalCounters; -import com.evolveum.midpoint.schema.internals.InternalInspector; import com.evolveum.midpoint.schema.internals.InternalMonitor; import com.evolveum.midpoint.schema.internals.InternalOperationClasses; import com.evolveum.midpoint.schema.internals.InternalsConfig; @@ -53,13 +44,9 @@ import com.evolveum.midpoint.test.util.MidPointTestConstants; import com.evolveum.midpoint.testing.story.AbstractStoryTest; import com.evolveum.midpoint.testing.story.CountingInspector; -import com.evolveum.midpoint.util.DebugDumpable; -import com.evolveum.midpoint.util.DebugUtil; -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.xml.ns._public.common.common_3.AbstractRoleType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.midpoint.xml.ns._public.common.common_3.OrgType; @@ -1214,7 +1201,7 @@ private void assertRoleMembershipRefs(PrismObject user, String oidForm private void assertRoleMembershipRefNonExclusive(PrismObject user, String roleOid, QName roleType, QName relation) { List roleMembershipRefs = user.asObjectable().getRoleMembershipRef(); for (ObjectReferenceType roleMembershipRef: roleMembershipRefs) { - if (ObjectTypeUtil.referenceMatches(roleMembershipRef, roleOid, roleType, relation)) { + if (ObjectTypeUtil.referenceMatches(roleMembershipRef, roleOid, roleType, relation, prismContext)) { return; } } From 333aae488d7ac6d75047f3bdc523837fd2c031df Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 10 Sep 2018 13:06:34 +0200 Subject: [PATCH 02/12] Add missing default relation resolution (MID-3581) ObjectTypeUtil.createObjectRef (and related methods) took prismContext from objects; this was not entirely correct, so now the prismContext is to be supplied explicitly by the caller. --- .../api/component/MemberPopupTabPanel.java | 10 +---- .../MultiTypesMemberPopupTabPanel.java | 11 +---- .../ResourceTypeAssignmentPopupTabPanel.java | 4 +- .../midpoint/gui/api/page/PageBase.java | 4 +- .../gui/api/util/WebComponentUtil.java | 13 +++++- .../gui/api/util/WebModelServiceUtils.java | 3 +- .../ApplicablePolicyGroupPanel.java | 4 +- .../assignment/SimpleRoleSelector.java | 2 +- .../web/component/form/ValueChoosePanel.java | 2 +- .../input/RelationDropDownChoicePanel.java | 3 +- .../objectdetails/ObjectHistoryTabPanel.java | 4 +- .../web/component/prism/show/ScenePanel.java | 4 +- .../component/wizard/resource/NameStep.java | 4 +- .../page/admin/cases/PageCaseWorkItems.java | 11 +++-- .../dto/CertCaseOrWorkItemDto.java | 4 +- .../component/AuditLogViewerPanel.java | 3 +- .../admin/resources/ResourceContentPanel.java | 12 ++---- .../admin/roles/AbstractRoleMemberPanel.java | 5 +-- .../admin/roles/MemberOperationsHelper.java | 12 ++++-- .../admin/users/component/TreeTablePanel.java | 8 ++-- .../web/page/admin/workflow/PageWorkItem.java | 2 +- .../workflow/dto/WorkItemDtoProvider.java | 4 +- .../web/page/self/PageSelfDashboard.java | 2 +- .../web/page/self/UserViewTabPanel.java | 3 +- .../midpoint/schema/util/ObjectTypeUtil.java | 40 ++++++++----------- .../impl/AccCertCaseOperationsHelper.java | 11 +++-- .../impl/AccCertOpenerHelper.java | 2 +- .../impl/AccCertQueryHelper.java | 3 +- .../impl/AccCertReviewersHelper.java | 6 +-- ...AccessCertificationClosingTaskHandler.java | 2 +- ...ssCertificationRemediationTaskHandler.java | 4 +- .../DirectAssignmentCertificationHandler.java | 5 +-- .../ExclusionCertificationHandler.java | 4 +- .../test/AbstractCertificationTest.java | 2 +- .../context/EvaluatedCompositeTrigger.java | 6 ++- .../context/EvaluatedExclusionTrigger.java | 6 ++- .../EvaluatedHasAssignmentTrigger.java | 4 +- .../context/EvaluatedModificationTrigger.java | 4 +- .../context/EvaluatedMultiplicityTrigger.java | 4 +- .../api/context/EvaluatedPolicyRule.java | 3 +- .../context/EvaluatedPolicyRuleTrigger.java | 4 +- .../context/EvaluatedSituationTrigger.java | 6 ++- .../api/context/EvaluatedStateTrigger.java | 4 +- .../context/EvaluatedTimeValidityTrigger.java | 4 +- .../context/EvaluatedTransitionTrigger.java | 6 ++- .../ModelInteractionServiceImpl.java | 6 +-- .../impl/expr/MidpointFunctionsImpl.java | 6 +-- ...ImportAccountsFromResourceTaskHandler.java | 2 +- .../model/impl/importer/ObjectImporter.java | 2 +- .../impl/lens/AssignmentPathSegmentImpl.java | 4 +- .../midpoint/model/impl/lens/Clockwork.java | 6 +-- .../impl/lens/EvaluatedPolicyRuleImpl.java | 8 ++-- .../model/impl/lens/LensElementContext.java | 4 +- .../midpoint/model/impl/lens/LensUtil.java | 2 +- .../impl/lens/OperationalDataManager.java | 10 ++--- .../projector/focus/AssignmentProcessor.java | 2 +- .../projector/policy/PolicyRuleEnforcer.java | 2 +- .../projector/policy/PolicyStateRecorder.java | 2 +- .../model/impl/scripting/PipelineData.java | 2 +- .../impl/sync/ReconciliationTaskHandler.java | 10 ++--- .../impl/validator/ResourceValidatorImpl.java | 9 +++-- .../impl/lens/TestAssignmentProcessor2.java | 12 +++--- .../model/impl/visualizer/TestVisualizer.java | 1 - .../midpoint/model/intest/TestActivation.java | 2 +- .../intest/rbac/TestAssignmentValidity.java | 2 +- .../report/impl/ReportCreateTaskHandler.java | 2 +- .../evolveum/midpoint/wf/util/QueryUtils.java | 10 +++-- ...rovalSchemaExecutionInformationHelper.java | 2 +- .../wf/impl/activiti/dao/WorkItemManager.java | 2 +- .../impl/processes/common/ActivitiUtil.java | 4 +- .../processes/itemApproval/MidpointUtil.java | 2 +- .../wf/impl/processors/BaseAuditHelper.java | 2 +- .../PcpChildWfTaskCreationInstruction.java | 2 +- .../aspect/BasePrimaryChangeAspect.java | 4 +- .../assignments/AddAssignmentAspect.java | 2 +- .../assignments/ModifyAssignmentAspect.java | 2 +- .../entitlements/AddAssociationAspect.java | 2 +- .../primary/policy/ApprovalSchemaBuilder.java | 2 +- .../policy/AssignmentPolicyAspectPart.java | 2 +- .../primary/policy/PolicyRuleBasedAspect.java | 2 +- .../impl/tasks/WfTaskCreationInstruction.java | 8 ++-- .../wf/impl/policy/AbstractWfTestPolicy.java | 2 +- .../AbstractTestAssignmentApproval.java | 2 +- .../impl/policy/other/TestMiscellaneous.java | 4 +- .../provisioning/impl/ShadowCache.java | 6 +-- .../provisioning/impl/ShadowManager.java | 8 +--- .../midpoint/audit/api/AuditEventRecord.java | 4 +- .../repo/sql/SqlAuditServiceImpl.java | 3 +- .../story/TestConsistencyMechanism.java | 2 +- 89 files changed, 214 insertions(+), 225 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java index 9fa35cdaa4b..8611200336c 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MemberPopupTabPanel.java @@ -18,24 +18,17 @@ import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.schema.constants.ObjectTypes; -import com.evolveum.midpoint.schema.constants.RelationTypes; -import com.evolveum.midpoint.schema.constants.SchemaConstants; -import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.exception.SchemaException; import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; import com.evolveum.midpoint.web.component.input.RelationDropDownChoicePanel; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.collections.CollectionUtils; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.panel.Fragment; -import org.apache.wicket.model.Model; import javax.xml.namespace.QName; import java.util.ArrayList; @@ -94,8 +87,7 @@ protected ObjectDelta prepareDelta(){ Class classType = WebComponentUtil.qnameToClass(pageBase.getPrismContext(), getObjectType().getTypeQName()); delta = ObjectDelta.createEmptyModifyDelta(classType, "fakeOid", pageBase.getPrismContext()); AssignmentType newAssignment = new AssignmentType(); - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject()); - ref.setRelation(getRelationValue()); + ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject(), getRelationValue()); newAssignment.setTargetRef(ref); pageBase.getPrismContext().adopt(newAssignment); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java index 17e47e8ebd1..e721fd817f3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/MultiTypesMemberPopupTabPanel.java @@ -19,15 +19,9 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.schema.constants.ObjectTypes; -import com.evolveum.midpoint.schema.constants.RelationTypes; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; -import com.evolveum.midpoint.task.api.Task; -import com.evolveum.midpoint.task.api.TaskCategory; -import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.util.logging.LoggingUtils; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.page.admin.roles.AbstractRoleMemberPanel; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -35,8 +29,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.EnumChoiceRenderer; -import org.apache.wicket.model.IModel; -import org.apache.wicket.model.Model; import javax.xml.namespace.QName; import java.util.ArrayList; @@ -93,8 +85,7 @@ protected void onUpdate(AjaxRequestTarget target) { @Override protected ObjectDelta prepareDelta(){ Class classType = WebComponentUtil.qnameToClass(getPageBase().getPrismContext(), getObjectType().getTypeQName()); - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject()); - ref.setRelation(getRelationValue()); + ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getAbstractRoleTypeObject(), getRelationValue()); return ObjectDelta.createModificationAddReference(classType, "fakeOid", ObjectType.F_PARENT_ORG_REF, getPageBase().getPrismContext(), ref.asReferenceValue()); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java index c4215ced7e2..103dcfb3f41 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ResourceTypeAssignmentPopupTabPanel.java @@ -161,7 +161,9 @@ protected Map getSelectedAssignmentsMap(){ ShadowKindType kind = getKindValue(); String intent = getIntentValue(); selectedObjects.forEach(selectedObject -> { - assignmentList.put(selectedObject.getOid(), ObjectTypeUtil.createAssignmentWithConstruction(selectedObject.asPrismObject(), kind, intent)); + assignmentList.put(selectedObject.getOid(), + ObjectTypeUtil.createAssignmentWithConstruction( + selectedObject.asPrismObject(), kind, intent, getPageBase().getPrismContext())); }); return assignmentList; } 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 e1b8a90d077..5734febd965 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 @@ -165,9 +165,7 @@ import javax.management.MBeanServer; import javax.management.MBeanServerFactory; import javax.management.ObjectName; -import javax.xml.namespace.QName; -import java.io.Serializable; import java.util.*; /** @@ -358,7 +356,7 @@ protected Integer load() { Task task = createSimpleTask(OPERATION_LOAD_WORK_ITEM_COUNT); S_FilterEntryOrEmpty q = QueryBuilder.queryFor(WorkItemType.class, getPrismContext()); ObjectQuery query = QueryUtils.filterForAssignees(q, getPrincipal(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS).build(); + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()).build(); // TODO MID-3581 return getModelService().countContainers(WorkItemType.class, query, null, task, task.getResult()); } catch (SchemaException | SecurityViolationException | ExpressionEvaluationException | ObjectNotFoundException | CommunicationException | ConfigurationException e) { LoggingUtils.logExceptionAsWarning(LOGGER, "Couldn't load work item count", e); 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 115472bae4c..dfa74ed13ff 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 @@ -2489,7 +2489,8 @@ public static boolean getElementVisibility(UserInterfaceElementVisibilityType vi return true; } - public static IModel createAbstractRoleConfirmationMessage(String actionName, ColumnMenuAction action, MainObjectListPanel abstractRoleTable, PageBase pageBase) { + public static IModel createAbstractRoleConfirmationMessage(String actionName, + ColumnMenuAction action, MainObjectListPanel abstractRoleTable, PageBase pageBase) { List selectedRoles = new ArrayList<>(); if (action.getRowModel() == null) { selectedRoles.addAll(abstractRoleTable.getSelectedObjects()); @@ -2499,7 +2500,11 @@ public static IModel createAbstractRoleCon OperationResult result = new OperationResult("Search Members"); boolean atLeastOneWithMembers = false; for (AR selectedRole : selectedRoles) { - ObjectQuery query = QueryBuilder.queryFor(FocusType.class, pageBase.getPrismContext()).item(FocusType.F_ROLE_MEMBERSHIP_REF).ref(ObjectTypeUtil.createObjectRef(selectedRole).asReferenceValue()).maxSize(1).build(); + ObjectQuery query = QueryBuilder.queryFor(FocusType.class, pageBase.getPrismContext()) + .item(FocusType.F_ROLE_MEMBERSHIP_REF)// TODO MID-3581 + .ref(ObjectTypeUtil.createObjectRef(selectedRole, pageBase.getPrismContext()).asReferenceValue()) + .maxSize(1) + .build(); List> members = WebModelServiceUtils.searchObjects(FocusType.class, query, result, pageBase); if (CollectionUtils.isNotEmpty(members)) { atLeastOneWithMembers = true; @@ -2601,6 +2606,10 @@ public static List getRelationDefinitions(ModelServiceLo return pageBase.getModelInteractionService().getRelationDefinitions(); } + public static RelationDefinitionType getRelationDefinition(QName relation) { + return getRelationRegistry().getRelationDefinition(relation); + } + public static DropDownChoice createTriStateCombo(String id, IModel model) { final IChoiceRenderer renderer = new IChoiceRenderer() { 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 91834255daa..9e5a9af7b2b 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 @@ -33,7 +33,6 @@ 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.PropertyOrReferenceWrapper; import com.evolveum.midpoint.web.component.prism.ValueStatus; import com.evolveum.midpoint.web.page.error.PageError; import com.evolveum.midpoint.web.page.login.PageLogin; @@ -160,7 +159,7 @@ public static List createObjectRefer for(PrismObject object: objects){ referenceMap.put(object.getOid(), WebComponentUtil.getName(object)); - references.add(ObjectTypeUtil.createObjectRef(object)); + references.add(ObjectTypeUtil.createObjectRef(object, page.getPrismContext())); } return references; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java index 7f6a21487dd..c24b4d16806 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/ApplicablePolicyGroupPanel.java @@ -20,7 +20,6 @@ import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; -import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismContainerValue; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.query.ObjectQuery; @@ -30,7 +29,6 @@ import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; -import com.evolveum.midpoint.web.component.data.column.IsolatedCheckBoxPanel; import com.evolveum.midpoint.web.component.prism.*; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -174,7 +172,7 @@ private void onPolicyAddedOrRemoved(PrismObject assignmentTarg if (added){ //TODO: not sure if this is correct way of creating new value.. this value is added directly to the origin object... what about deltas?? PrismContainerValue newAssignment = assignmentsModel.getObject().getItem().createNewValue(); - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(assignmentTargetObject); + ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(assignmentTargetObject, getPageBase().getPrismContext()); AssignmentType assignmentType = newAssignment.asContainerable(); assignmentType.setTargetRef(ref); Task task = getPageBase().createSimpleTask("Creating new applicable policy"); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java index f25f32a4b5a..992d7f3b43e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/assignment/SimpleRoleSelector.java @@ -160,7 +160,7 @@ private void toggleRole(PrismObject role) { } } - AssignmentType newAssignment = ObjectTypeUtil.createAssignmentTo(role); +// AssignmentType newAssignment = ObjectTypeUtil.createAssignmentTo(role, prismContext); //TODO //create ContainerValueWrapper for new assignment // getAssignmentModel().getObject().add(newAssignment); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java index ee2f2c0924e..d9c0dc150c6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/form/ValueChoosePanel.java @@ -125,7 +125,7 @@ protected boolean isEditButtonEnabled() { } protected void replaceIfEmpty(ObjectType object) { - ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(object); + ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(object, getPageBase().getPrismContext()); getModel().setObject((T) ort.asReferenceValue()); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java index fab210b8052..f3370e51ac5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/RelationDropDownChoicePanel.java @@ -108,8 +108,7 @@ public QName getObject(String id, IModel choices) { @Override public Object getDisplayValue(QName object) { - RelationDefinitionType def = - ObjectTypeUtil.findRelationDefinition(WebComponentUtil.getRelationDefinitions(RelationDropDownChoicePanel.this.getPageBase()), object); + RelationDefinitionType def = WebComponentUtil.getRelationDefinition(object); if (def != null){ DisplayType display = def.getDisplay(); if (display != null){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java index 87e7d6b6ed9..a2bd645e3d5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/objectdetails/ObjectHistoryTabPanel.java @@ -48,14 +48,12 @@ import com.evolveum.midpoint.web.page.admin.PageAdminObjectDetails; import com.evolveum.midpoint.web.page.admin.reports.component.AuditLogViewerPanel; import com.evolveum.midpoint.web.page.admin.reports.dto.AuditSearchDto; -import com.evolveum.midpoint.web.page.admin.users.PageUserHistory; import com.evolveum.midpoint.web.page.admin.users.PageXmlDataReview; import com.evolveum.midpoint.web.session.AuditLogStorage; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType; import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventStageType; import com.evolveum.midpoint.xml.ns._public.common.common_3.FocusType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.UserType; /** * Created by honchar. @@ -166,7 +164,7 @@ protected long getCurrentPage() { private AuditSearchDto createAuditSearchDto(F focus) { AuditSearchDto searchDto = new AuditSearchDto(); - ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(focus); + ObjectReferenceType ort = ObjectTypeUtil.createObjectRef(focus, getPrismContext()); searchDto.setTargetNames(asList(ort)); searchDto.setEventStage(AuditEventStageType.EXECUTION); return searchDto; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java index 51cda0140bd..c05d5b462a4 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/show/ScenePanel.java @@ -42,8 +42,6 @@ import org.apache.wicket.model.*; import org.jetbrains.annotations.NotNull; -import java.util.List; - /** * @author mederly */ @@ -147,7 +145,7 @@ public void onClick(AjaxRequestTarget target) { PrismContainerValue value = getModelObject().getScene().getSourceValue(); if (value != null && value.getParent() instanceof PrismObject) { PrismObject object = (PrismObject) value.getParent(); - WebComponentUtil.dispatchToObjectDetailsPage(ObjectTypeUtil.createObjectRef(object), getPageBase(), false); + WebComponentUtil.dispatchToObjectDetailsPage(ObjectTypeUtil.createObjectRef(object, getPageBase().getPrismContext()), getPageBase(), false); } } }; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java index 0315869c7ca..4c961e1b2e7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/wizard/resource/NameStep.java @@ -449,7 +449,7 @@ public void applyState() { ResourceType resourceType = resource.asObjectable(); resourceType.setName(PolyStringType.fromOrig(resourceNameModel.getObject())); resourceType.setDescription(resourceDescriptionModel.getObject()); - resourceType.setConnectorRef(ObjectTypeUtil.createObjectRef(connector)); + resourceType.setConnectorRef(ObjectTypeUtil.createObjectRef(connector, prismContext)); delta = ObjectDelta.createAddDelta(resource); } else { PrismObject oldResourceObject = @@ -470,7 +470,7 @@ public void applyState() { String oldConnectorOid = oldResource.getConnectorRef() != null ? oldResource.getConnectorRef().getOid() : null; String newConnectorOid = connector.getOid(); if (!StringUtils.equals(oldConnectorOid, newConnectorOid)) { - i = i.item(ResourceType.F_CONNECTOR_REF).replace(ObjectTypeUtil.createObjectRef(connector).asReferenceValue()); + i = i.item(ResourceType.F_CONNECTOR_REF).replace(ObjectTypeUtil.createObjectRef(connector, prismContext).asReferenceValue()); } if (!isConfigurationSchemaCompatible(connector)) { i = i.item(ResourceType.F_CONNECTOR_CONFIGURATION).replace(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java index 29f33676916..c4d5f613c01 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java @@ -142,7 +142,7 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio } else { // not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being) query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS) + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()) // TODO MID-3581 .and().item(CaseWorkItemType.F_CLOSE_TIMESTAMP).isNull().build(); } IsolatedCheckBoxPanel includeClosedCases = (IsolatedCheckBoxPanel) getCaseWorkItemsSearchField(ID_SEARCH_FILTER_INCLUDE_CLOSED_CASES); @@ -161,8 +161,10 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio ObjectType resource = resources.get(0); if (resource != null) { query.addFilter( + // TODO MID-3581 QueryBuilder.queryFor(CaseWorkItemType.class, getPrismContext()) - .item(PrismConstants.T_PARENT, CaseType.F_OBJECT_REF).ref(ObjectTypeUtil.createObjectRef(resource).asReferenceValue()).buildFilter() + .item(PrismConstants.T_PARENT, CaseType.F_OBJECT_REF).ref(ObjectTypeUtil.createObjectRef(resource, + getPrismContext()).asReferenceValue()).buildFilter() ); } } @@ -175,9 +177,10 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio if (assignees != null && assignees.size() > 0) { ObjectType assignee = assignees.get(0); if (assignee != null) { + // TODO MID-3581 query.addFilter( QueryBuilder.queryFor(CaseWorkItemType.class, getPrismContext()) - .item(CaseWorkItemType.F_ASSIGNEE_REF).ref(ObjectTypeUtil.createObjectRef(assignee).asReferenceValue()).buildFilter() + .item(CaseWorkItemType.F_ASSIGNEE_REF).ref(ObjectTypeUtil.createObjectRef(assignee, getPrismContext()).asReferenceValue()).buildFilter() ); } } @@ -432,7 +435,7 @@ private void searchFilterPerformed(AjaxRequestTarget target) { private Function objectReferenceTransformer = (Function & Serializable) (ObjectType o) -> - ObjectTypeUtil.createObjectRef(o); + ObjectTypeUtil.createObjectRef(o, getPrismContext()); private static class ButtonBar extends Fragment { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java index 0e08d6b8bb0..d3eb32690cf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/certification/dto/CertCaseOrWorkItemDto.java @@ -57,12 +57,14 @@ public class CertCaseOrWorkItemDto extends Selectable { private String objectName; private String targetName; private String deadlineAsString; + private QName defaultRelation; CertCaseOrWorkItemDto(@NotNull AccessCertificationCaseType _case, PageBase page) { this.certCase = _case; this.objectName = getName(_case.getObjectRef()); this.targetName = getName(_case.getTargetRef()); this.deadlineAsString = computeDeadlineAsString(page); + this.defaultRelation = page.getPrismContext().getDefaultRelation(); } // ugly hack (for now) - we extract the name from serialization metadata @@ -107,7 +109,7 @@ public QName getTargetType() { } public ObjectReferenceType getCampaignRef() { - return ObjectTypeUtil.createObjectRef(getCampaign()); + return ObjectTypeUtil.createObjectRef(getCampaign(), defaultRelation); } public Long getCaseId() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java index 6149d8f023b..d4bb14ce59a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AuditLogViewerPanel.java @@ -51,7 +51,6 @@ import com.evolveum.midpoint.audit.api.AuditEventRecord; import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.component.button.CsvDownloadButtonPanel; -import com.evolveum.midpoint.gui.api.component.path.ItemPathDto; import com.evolveum.midpoint.gui.api.component.path.ItemPathPanel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils; @@ -363,7 +362,7 @@ public boolean isVisible() { // Serializable as it becomes part of panel which is serialized private Function objectReferenceTransformer = (Function & Serializable) (ObjectType o) -> - ObjectTypeUtil.createObjectRef(o); + ObjectTypeUtil.createObjectRef(o, getPageBase().getPrismContext()); // Serializable as it becomes part of panel which is serialized private Function stringTransformer = diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java index bd4f7d5a55e..7b274d97afc 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/resources/ResourceContentPanel.java @@ -22,10 +22,8 @@ import javax.xml.namespace.QName; -import com.evolveum.midpoint.gui.api.GuiConstants; import com.evolveum.midpoint.gui.api.component.PendingOperationPanel; import com.evolveum.midpoint.web.component.menu.cog.ButtonInlineMenuItem; -import com.evolveum.midpoint.web.component.prism.ObjectWrapper; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.lang.StringUtils; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -99,7 +97,6 @@ import com.evolveum.midpoint.web.component.data.column.ColumnMenuAction; import com.evolveum.midpoint.web.component.data.column.ColumnTypeDto; import com.evolveum.midpoint.web.component.data.column.ColumnUtils; -import com.evolveum.midpoint.web.component.data.column.InlineMenuHeaderColumn; import com.evolveum.midpoint.web.component.data.column.LinkColumn; import com.evolveum.midpoint.web.component.data.column.ObjectLinkColumn; import com.evolveum.midpoint.web.component.dialog.ConfirmationPanel; @@ -108,7 +105,6 @@ import com.evolveum.midpoint.web.component.search.Search; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.page.admin.configuration.component.HeaderMenuAction; import com.evolveum.midpoint.web.page.admin.resources.ResourceContentTabPanel.Operation; import com.evolveum.midpoint.web.page.admin.resources.content.PageAccount; import com.evolveum.midpoint.web.page.admin.server.PageTaskAdd; @@ -446,7 +442,7 @@ private void newTaskPerformed(String category, AjaxRequestTarget target) { } PrismObject resource = getResourceModel().getObject(); - taskType.setObjectRef(ObjectTypeUtil.createObjectRef(resource)); + taskType.setObjectRef(ObjectTypeUtil.createObjectRef(resource, getPageBase().getPrismContext())); taskType.setCategory(category); setResponsePage(new PageTaskAdd(taskType)); @@ -1147,7 +1143,7 @@ private void changeOwner(ShadowType selected, AjaxRequestTarget target, FocusTyp if (owner != null) { delta = ReferenceDelta.createModificationDelete(FocusType.F_LINK_REF, getFocusDefinition(), - ObjectTypeUtil.createObjectRef(shadow).asReferenceValue()); + ObjectTypeUtil.createObjectRef(shadow, getPageBase().getPrismContext()).asReferenceValue()); ((Collection) modifications).add(delta); changeOwnerInternal(owner.getOid(), modifications, target); @@ -1163,7 +1159,7 @@ private void changeOwner(ShadowType selected, AjaxRequestTarget target, FocusTyp FocusType owner = loadShadowOwner(shadow.getOid()); if (owner != null) { delta = ReferenceDelta.createModificationDelete(FocusType.F_LINK_REF, - getFocusDefinition(), ObjectTypeUtil.createObjectRef(shadow).asReferenceValue()); + getFocusDefinition(), ObjectTypeUtil.createObjectRef(shadow, getPageBase().getPrismContext()).asReferenceValue()); ((Collection) modifications).add(delta); changeOwnerInternal(owner.getOid(), modifications, target); @@ -1171,7 +1167,7 @@ private void changeOwner(ShadowType selected, AjaxRequestTarget target, FocusTyp modifications = new ArrayList<>(); delta = ReferenceDelta.createModificationAdd(FocusType.F_LINK_REF, getFocusDefinition(), - ObjectTypeUtil.createObjectRef(shadow).asReferenceValue()); + ObjectTypeUtil.createObjectRef(shadow, getPageBase().getPrismContext()).asReferenceValue()); ((Collection) modifications).add(delta); changeOwnerInternal(ownerToChange.getOid(), modifications, target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java index 731bb04c5a2..77bfa582b05 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/AbstractRoleMemberPanel.java @@ -38,7 +38,6 @@ import org.apache.wicket.extensions.markup.html.repeater.data.table.export.AbstractExportableColumn; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; -import org.apache.wicket.markup.html.form.DropDownChoice; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.IChoiceRenderer; import org.apache.wicket.markup.repeater.Item; @@ -52,13 +51,11 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.query.AndFilter; import com.evolveum.midpoint.prism.query.NotFilter; 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.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.schema.GetOperationOptions; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.ObjectTypes; @@ -666,7 +663,7 @@ protected ObjectQuery createAllMemberQuery(Collection relations) { protected ObjectReferenceType createReference() { - ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getModelObject()); + ObjectReferenceType ref = ObjectTypeUtil.createObjectRef(getModelObject(), getPageBase().getPrismContext()); return ref; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java index d4c0841bc92..6755b01e1a9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java @@ -158,15 +158,18 @@ public static void initObject public static ObjectQuery createDirectMemberQuery(R targetObject, QName objectType, Collection relations, ObjectViewDto tenant, ObjectViewDto project, PrismContext prismContext) { ObjectQuery query; + // TODO MID-3581 fix the query from the point of relations! S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, prismContext) .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF) .ref(createReferenceValuesList(targetObject, relations)); if (tenant != null && tenant.getObjectType() != null) { - q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF).ref(ObjectTypeUtil.createObjectRef(tenant.getObjectType()).asReferenceValue()); + q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_TENANT_REF).ref(ObjectTypeUtil.createObjectRef(tenant.getObjectType(), + prismContext).asReferenceValue()); } if (project != null && project.getObjectType() !=null) { - q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType()).asReferenceValue()); + q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType(), + prismContext).asReferenceValue()); } query = q.build(); @@ -311,7 +314,8 @@ protected static ObjectDelta getDeleteAssignmentDel protected static ObjectDelta getAddParentOrgDelta(R targetObject, Collection relations, PrismContext prismContext) throws SchemaException { ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(ObjectType.class, "fakeOid", prismContext); if (relations == null || relations.isEmpty()) { - delta.addModificationAddReference(ObjectType.F_PARENT_ORG_REF, ObjectTypeUtil.createObjectRef(targetObject).asReferenceValue()); + delta.addModificationAddReference(ObjectType.F_PARENT_ORG_REF, ObjectTypeUtil.createObjectRef(targetObject, + prismContext).asReferenceValue()); return delta; } @@ -324,7 +328,7 @@ protected static ObjectDelta getAddParentOrgDelta(R protected static ObjectDelta getDeleteParentOrgDelta(R targetObject, Collection relations, PrismContext prismContext) throws SchemaException { if (relations == null || relations.isEmpty()) { return ObjectDelta.createModificationDeleteReference(ObjectType.class, "fakeOid", - ObjectType.F_PARENT_ORG_REF, prismContext, ObjectTypeUtil.createObjectRef(targetObject).asReferenceValue()); + ObjectType.F_PARENT_ORG_REF, prismContext, ObjectTypeUtil.createObjectRef(targetObject, prismContext).asReferenceValue()); } ObjectDelta delta = ObjectDelta.createEmptyModifyDelta(ObjectType.class, "fakeOid", prismContext); 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 feb311a88d3..a7cbdf4cda3 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 @@ -358,7 +358,7 @@ public InlineMenuItemAction initAction() { public void onClick(AjaxRequestTarget target) { try { initObjectForAdd( - ObjectTypeUtil.createObjectRef(getRowModel().getObject().getValue()), + ObjectTypeUtil.createObjectRef(getRowModel().getObject().getValue(), getPageBase().getPrismContext()), OrgType.COMPLEX_TYPE, null, target); } catch (SchemaException e) { throw new SystemException(e.getMessage(), e); @@ -396,7 +396,7 @@ private void initObjectForAdd(ObjectReferenceType parentOrgRef, QName type, QNam // TODO: fix MID-3234 if (parentOrgRef == null) { ObjectType org = getTreePanel().getSelected().getValue(); - parentOrgRef = ObjectTypeUtil.createObjectRef(org); + parentOrgRef = ObjectTypeUtil.createObjectRef(org, prismContext); parentOrgRef.setRelation(relation); objType.getParentOrgRef().add(parentOrgRef); } else { @@ -454,7 +454,7 @@ private void moveConfirmPerformed(SelectableBean orgToMove, SelectableB try { for (OrgType parentOrg : toMove.getParentOrg()) { AssignmentType oldRoot = new AssignmentType(); - oldRoot.setTargetRef(ObjectTypeUtil.createObjectRef(parentOrg)); + oldRoot.setTargetRef(ObjectTypeUtil.createObjectRef(parentOrg, getPageBase().getPrismContext())); moveOrgDelta.addModification(ContainerDelta.createModificationDelete(OrgType.F_ASSIGNMENT, OrgType.class, getPageBase().getPrismContext(), oldRoot.asPrismContainerValue())); @@ -464,7 +464,7 @@ private void moveConfirmPerformed(SelectableBean orgToMove, SelectableB } AssignmentType newRoot = new AssignmentType(); - newRoot.setTargetRef(ObjectTypeUtil.createObjectRef(selected.getValue())); + newRoot.setTargetRef(ObjectTypeUtil.createObjectRef(selected.getValue(), getPageBase().getPrismContext())); moveOrgDelta.addModification(ContainerDelta.createModificationAdd(OrgType.F_ASSIGNMENT, OrgType.class, getPageBase().getPrismContext(), newRoot.asPrismContainerValue())); // moveOrgDelta.addModification(ReferenceDelta.createModificationAdd(OrgType.F_PARENT_ORG_REF, diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java index 63817b0173b..286693a4e78 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/PageWorkItem.java @@ -348,7 +348,7 @@ private void delegateConfirmedPerformed(AjaxRequestTarget target, UserType deleg OperationResult result = new OperationResult(OPERATION_DELEGATE_WORK_ITEM); try { WorkItemDto dto = workItemDtoModel.getObject(); - List delegates = Collections.singletonList(ObjectTypeUtil.createObjectRef(delegate)); + List delegates = Collections.singletonList(ObjectTypeUtil.createObjectRef(delegate, getPrismContext())); try { assumePowerOfAttorneyIfRequested(result); getWorkflowService().delegateWorkItem(dto.getWorkItemId(), delegates, WorkItemDelegationMethodType.ADD_ASSIGNEES, result); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java index 9f69418e05e..bd6c65ed161 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java @@ -184,8 +184,8 @@ private ObjectQuery createQuery(OperationResult result) throws SchemaException { return QueryUtils.filterForGroups(q, currentUserOid(), getRepositoryService(), result).build(); } else { // not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being) - return QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS).build(); + return QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), // TODO MID-3581 + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()).build(); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java index 569c48ea2d8..4ab6f89ca37 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java @@ -288,7 +288,7 @@ private CallableResult> loadWorkItems() { // (Note that the current code is consistent with the other places where work items are displayed.) S_FilterEntryOrEmpty q = QueryBuilder.queryFor(WorkItemType.class, getPrismContext()); ObjectQuery query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS) + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()) // TODO MID-3581 .desc(F_CREATE_TIMESTAMP) .build(); Collection> options = diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java index 97f7f9177d9..600fe36e733 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/UserViewTabPanel.java @@ -160,8 +160,7 @@ public IModel getBody() { if (relation == null){ return createStringResource("RelationTypes.ANY"); } - List defList = WebComponentUtil.getRelationDefinitions(UserViewTabPanel.this.getPageBase()); - RelationDefinitionType def = ObjectTypeUtil.findRelationDefinition(defList, model.getObject()); + RelationDefinitionType def = WebComponentUtil.getRelationDefinition(model.getObject()); if (def != null) { DisplayType display = def.getDisplay(); if (display != null) { 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 0dfde0c2369..273a295610c 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 @@ -244,8 +244,9 @@ public static AssignmentType createAssignmentTo(@NotNull } @NotNull - public static AssignmentType createAssignmentTo(@NotNull PrismObject object) { - return createAssignmentTo(object, getPrismContextFromObject(object).getDefaultRelation()); + public static AssignmentType createAssignmentTo(@NotNull PrismObject object, + PrismContext prismContext) { + return createAssignmentTo(object, prismContext.getDefaultRelation()); } @NotNull @@ -262,10 +263,11 @@ public static AssignmentType createAssignmentTo(@NotNull } @NotNull - public static AssignmentType createAssignmentWithConstruction(@NotNull PrismObject object, ShadowKindType kind, String intent) { - AssignmentType assignment = new AssignmentType(object.getPrismContext()); - ConstructionType construction = new ConstructionType(object.getPrismContext()); - construction.setResourceRef(createObjectRef(object)); + public static AssignmentType createAssignmentWithConstruction(@NotNull PrismObject object, ShadowKindType kind, + String intent, PrismContext prismContext) { + AssignmentType assignment = new AssignmentType(prismContext); + ConstructionType construction = new ConstructionType(prismContext); + construction.setResourceRef(createObjectRef(object, prismContext)); construction.setKind(kind); construction.setIntent(intent); assignment.setConstruction(construction); @@ -283,30 +285,20 @@ public static ObjectReferenceType createObjectRef(PrismReferenceValue prv) { return ort; } - public static ObjectReferenceType createObjectRefWithFullObject(ObjectType objectType) { + public static ObjectReferenceType createObjectRefWithFullObject(ObjectType objectType, PrismContext prismContext) { if (objectType == null) { return null; } - return createObjectRefWithFullObject(objectType.asPrismObject()); + return createObjectRefWithFullObject(objectType.asPrismObject(), prismContext); } - public static ObjectReferenceType createObjectRef(ObjectType object) { + public static ObjectReferenceType createObjectRef(ObjectType object, PrismContext prismContext) { if (object == null) { return null; } - PrismContext prismContext = getPrismContextFromObject(object.asPrismObject()); return createObjectRef(object, prismContext.getDefaultRelation()); } - @NotNull - private static PrismContext getPrismContextFromObject(PrismObject object) { - PrismContext prismContext = object.getPrismContext(); - if (prismContext == null) { - throw new IllegalStateException("No prismContext in prism object " + object); - } - return prismContext; - } - public static ObjectReferenceType createObjectRef(ObjectType objectType, QName relation) { if (objectType == null) { return null; @@ -314,11 +306,11 @@ public static ObjectReferenceType createObjectRef(ObjectType objectType, QName r return createObjectRef(objectType.asPrismObject(), relation); } - public static ObjectReferenceType createObjectRef(PrismObject object) { + public static ObjectReferenceType createObjectRef(PrismObject object, PrismContext prismContext) { if (object == null) { return null; } - return createObjectRef(object, getPrismContextFromObject(object).getDefaultRelation()); + return createObjectRef(object, prismContext.getDefaultRelation()); } public static ObjectReferenceType createObjectRef(PrismObject object, QName relation) { @@ -336,11 +328,12 @@ public static ObjectReferenceType createObjectRef(PrismOb return ref; } - public static ObjectReferenceType createObjectRefWithFullObject(PrismObject object) { + public static ObjectReferenceType createObjectRefWithFullObject(PrismObject object, + PrismContext prismContext) { if (object == null) { return null; } - ObjectReferenceType ref = createObjectRef(object); + ObjectReferenceType ref = createObjectRef(object, prismContext); ref.asReferenceValue().setObject(object); return ref; } @@ -694,7 +687,6 @@ public static void normalizeFilter(ObjectFilter filter, RelationRegistry relatio } } - // TODO public static RelationDefinitionType findRelationDefinition(List relationDefinitions, QName qname) { for (RelationDefinitionType relation: relationDefinitions) { if (QNameUtil.match(qname, relation.getRef())) { diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java index ec4a06ea1f6..8741be8500c 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertCaseOperationsHelper.java @@ -43,7 +43,6 @@ import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang.ObjectUtils; import org.jetbrains.annotations.NotNull; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -99,7 +98,7 @@ void recordDecision(String campaignOid, long caseId, long workItemId, AccessCert throw new ObjectNotFoundException("Work item " + workItemId + " was not found in campaign " + toShortString(campaign) + ", case " + caseId); } - ObjectReferenceType responderRef = ObjectTypeUtil.createObjectRef(securityContextManager.getPrincipal().getUser()); + ObjectReferenceType responderRef = ObjectTypeUtil.createObjectRef(securityContextManager.getPrincipal().getUser(), prismContext); XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); ItemPath workItemPath = new ItemPath(F_CASE, caseId, F_WORK_ITEM, workItemId); Collection> deltaList = DeltaBuilder.deltaFor(AccessCertificationCampaignType.class, prismContext) @@ -146,8 +145,8 @@ void delegateWorkItems(String campaignOid, List MidPointPrincipal principal = securityContextManager.getPrincipal(); result.addContext("user", toShortString(principal.getUser())); - ObjectReferenceType initiator = ObjectTypeUtil.createObjectRef(principal.getUser()); - ObjectReferenceType attorney = ObjectTypeUtil.createObjectRef(principal.getAttorney()); + ObjectReferenceType initiator = ObjectTypeUtil.createObjectRef(principal.getUser(), prismContext); + ObjectReferenceType attorney = ObjectTypeUtil.createObjectRef(principal.getAttorney(), prismContext); XMLGregorianCalendar now = clock.currentTimeXMLGregorianCalendar(); List> deltas = new ArrayList<>(); @@ -212,8 +211,8 @@ public void escalateCampaign(String campaignOid, EscalateWorkItemActionType esca throws SchemaException, ObjectNotFoundException, ObjectAlreadyExistsException, SecurityViolationException { MidPointPrincipal principal = securityContextManager.getPrincipal(); result.addContext("user", toShortString(principal.getUser())); - ObjectReferenceType initiator = ObjectTypeUtil.createObjectRef(principal.getUser()); - ObjectReferenceType attorney = ObjectTypeUtil.createObjectRef(principal.getAttorney()); + ObjectReferenceType initiator = ObjectTypeUtil.createObjectRef(principal.getUser(), prismContext); + ObjectReferenceType attorney = ObjectTypeUtil.createObjectRef(principal.getAttorney(), prismContext); List workItems = queryHelper.searchOpenWorkItems( CertCampaignTypeUtil.createWorkItemsForCampaignQuery(campaignOid, prismContext), diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertOpenerHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertOpenerHelper.java index c108d60f292..5748eba613c 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertOpenerHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertOpenerHelper.java @@ -124,7 +124,7 @@ private AccessCertificationCampaignType createCampaignObject(AccessCertification newCampaign.setDescription(definition.getDescription()); newCampaign.setOwnerRef(securityContextManager.getPrincipal().toObjectReference()); newCampaign.setTenantRef(definition.getTenantRef()); - newCampaign.setDefinitionRef(ObjectTypeUtil.createObjectRef(definition)); + newCampaign.setDefinitionRef(ObjectTypeUtil.createObjectRef(definition, prismContext)); if (definition.getHandlerUri() != null) { newCampaign.setHandlerUri(definition.getHandlerUri()); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java index d4dadbe6a9c..7ff40838c23 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java @@ -138,7 +138,8 @@ private ObjectFilter getReviewerAndEnabledFilterForWI(MidPointPrincipal principa return QueryUtils.filterForAssignees( QueryBuilder.queryFor(AccessCertificationWorkItemType.class, prismContext), principal, - OtherPrivilegesLimitationType.F_CERTIFICATION_WORK_ITEMS) + OtherPrivilegesLimitationType.F_CERTIFICATION_WORK_ITEMS, + prismContext) // TODO MID-3581 .and().item(F_CLOSE_TIMESTAMP).isNull() .buildFilter(); } else { diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java index 2c6de54c44b..d1c3f3bb8f1 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java @@ -135,7 +135,7 @@ private List getMembers(ObjectReferenceType abstractRoleRef .item(UserType.F_ROLE_MEMBERSHIP_REF).ref(abstractRoleRef.getOid()) .build(); return repositoryService.searchObjects(UserType.class, query, null, result).stream() - .map(obj -> ObjectTypeUtil.createObjectRef(obj)) + .map(obj -> ObjectTypeUtil.createObjectRef(obj, prismContext)) // TODO MID-3581 .collect(Collectors.toList()); } @@ -184,7 +184,7 @@ private Collection getObjectManagers(AccessCertificationCas } List retval = new ArrayList<>(managers.size()); for (UserType manager : managers) { - retval.add(ObjectTypeUtil.createObjectRef(manager)); + retval.add(ObjectTypeUtil.createObjectRef(manager, prismContext)); } return retval; } catch (SecurityViolationException e) { @@ -232,7 +232,7 @@ private List getAssignees(AbstractRoleType role, RelationKi .build(); List> assignees = repositoryService.searchObjects(FocusType.class, query, null, result); LOGGER.trace("Looking for '{}' of {} using {}: found: {}", relationKind, role, query, assignees); - assignees.forEach(o -> rv.add(ObjectTypeUtil.createObjectRef(o))); + assignees.forEach(o -> rv.add(ObjectTypeUtil.createObjectRef(o, prismContext))); return rv; } diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java index 02b83d79ccb..f6dc9857849 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationClosingTaskHandler.java @@ -265,7 +265,7 @@ public void launch(AccessCertificationCampaignType campaign, OperationResult par Task task = taskManager.createTaskInstance(); task.setHandlerUri(HANDLER_URI); task.setName(new PolyStringType("Closing " + campaign.getName())); - task.setObjectRef(ObjectTypeUtil.createObjectRef(campaign)); + task.setObjectRef(ObjectTypeUtil.createObjectRef(campaign, prismContext)); task.setOwner(repositoryService.getObject(UserType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), null, result)); taskManager.switchToBackground(task, result); result.setBackgroundTaskOid(task.getOid()); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java index 44a91caf2bf..e8d5e21969b 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccessCertificationRemediationTaskHandler.java @@ -17,6 +17,7 @@ import com.evolveum.midpoint.certification.api.OutcomeUtils; import com.evolveum.midpoint.certification.impl.handlers.CertificationHandler; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -63,6 +64,7 @@ public class AccessCertificationRemediationTaskHandler implements TaskHandler { @Autowired private AccCertGeneralHelper helper; @Autowired private AccCertCaseOperationsHelper caseHelper; @Autowired private AccCertQueryHelper queryHelper; + @Autowired private PrismContext prismContext; @Autowired @Qualifier("cacheRepositoryService") private RepositoryService repositoryService; private static final transient Trace LOGGER = TraceManager.getTrace(AccessCertificationRemediationTaskHandler.class); @@ -188,7 +190,7 @@ public void launch(AccessCertificationCampaignType campaign, OperationResult par task.setName(polyString); // Set reference to the resource - task.setObjectRef(ObjectTypeUtil.createObjectRef(campaign)); + task.setObjectRef(ObjectTypeUtil.createObjectRef(campaign, prismContext)); task.setOwner(repositoryService.getObject(UserType.class, SystemObjectsType.USER_ADMINISTRATOR.value(), null, result)); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java index 2c1da07a138..2cf11b01747 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/DirectAssignmentCertificationHandler.java @@ -20,7 +20,6 @@ import com.evolveum.midpoint.repo.common.expression.ExpressionVariables; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.schema.constants.ExpressionConstants; -import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ActivationUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; @@ -33,8 +32,6 @@ 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.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.springframework.stereotype.Component; @@ -96,7 +93,7 @@ private void processAssignment(AssignmentType assignment, boolean isInducement, AccessCertificationAssignmentCaseType assignmentCase = new AccessCertificationAssignmentCaseType(prismContext); assignmentCase.setAssignment(assignment.clone()); assignmentCase.setIsInducement(isInducement); - assignmentCase.setObjectRef(ObjectTypeUtil.createObjectRef(object)); + assignmentCase.setObjectRef(ObjectTypeUtil.createObjectRef(object, prismContext)); assignmentCase.setTenantRef(assignment.getTenantRef()); assignmentCase.setOrgRef(assignment.getOrgRef()); assignmentCase.setActivation(assignment.getActivation()); diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/ExclusionCertificationHandler.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/ExclusionCertificationHandler.java index c7e9bd9912c..ed08749b8c0 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/ExclusionCertificationHandler.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/handlers/ExclusionCertificationHandler.java @@ -23,8 +23,6 @@ import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.task.api.Task; import com.evolveum.midpoint.util.exception.*; -import com.evolveum.midpoint.util.logging.Trace; -import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.springframework.stereotype.Component; @@ -71,7 +69,7 @@ public Collection c private void processAssignment(AssignmentType assignment, ObjectType object, List caseList) { AccessCertificationAssignmentCaseType assignmentCase = new AccessCertificationAssignmentCaseType(prismContext); assignmentCase.setAssignment(assignment.clone()); - assignmentCase.setObjectRef(ObjectTypeUtil.createObjectRef(object)); + assignmentCase.setObjectRef(ObjectTypeUtil.createObjectRef(object, prismContext)); assignmentCase.setTenantRef(assignment.getTenantRef()); assignmentCase.setOrgRef(assignment.getOrgRef()); assignmentCase.setActivation(assignment.getActivation()); diff --git a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java index d3ab42e95e3..beec289fd23 100644 --- a/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java +++ b/model/certification-impl/src/test/java/com/evolveum/midpoint/certification/test/AbstractCertificationTest.java @@ -423,7 +423,7 @@ protected void assertDefinitionAndOwner(AccessCertificationCampaignType campaign AccessCertificationDefinitionType certificationDefinition, String expectedOwnerOid) { assertRefEquals("Unexpected ownerRef", ObjectTypeUtil.createObjectRef(expectedOwnerOid, ObjectTypes.USER), campaign.getOwnerRef()); assertRefEquals("Unexpected definitionRef", - ObjectTypeUtil.createObjectRef(certificationDefinition), + ObjectTypeUtil.createObjectRef(certificationDefinition, prismContext), campaign.getDefinitionRef()); } diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedCompositeTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedCompositeTrigger.java index 6c3551d5d31..05c8fb2d44a 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedCompositeTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedCompositeTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.EvaluatedLogicalTriggerType; @@ -77,11 +78,12 @@ protected void debugDumpSpecific(StringBuilder sb, int indent) { } @Override - public EvaluatedLogicalTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedLogicalTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedLogicalTriggerType rv = new EvaluatedLogicalTriggerType(); fillCommonContent(rv); if (!options.isRespectFinalFlag() || !isFinal()) { - innerTriggers.forEach(t -> rv.getEmbedded().add(t.toEvaluatedPolicyRuleTriggerType(options))); + innerTriggers.forEach(t -> rv.getEmbedded().add(t.toEvaluatedPolicyRuleTriggerType(options, prismContext))); } return rv; } diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedExclusionTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedExclusionTrigger.java index 8fee04be27c..da4c1a7e875 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedExclusionTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedExclusionTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.LocalizableMessage; @@ -90,11 +91,12 @@ protected void debugDumpSpecific(StringBuilder sb, int indent) { } @Override - public EvaluatedExclusionTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedExclusionTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedExclusionTriggerType rv = new EvaluatedExclusionTriggerType(); fillCommonContent(rv); if (options.getTriggeredRulesStorageStrategy() == FULL) { - rv.setConflictingObjectRef(ObjectTypeUtil.createObjectRef(conflictingTarget)); + rv.setConflictingObjectRef(ObjectTypeUtil.createObjectRef(conflictingTarget, prismContext)); rv.setConflictingObjectDisplayName(ObjectTypeUtil.getDisplayName(conflictingTarget)); if (conflictingPath != null) { rv.setConflictingObjectPath(conflictingPath.toAssignmentPathType(options.isIncludeAssignmentsContent())); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedHasAssignmentTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedHasAssignmentTrigger.java index 1e77a004f63..e8acf4ff967 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedHasAssignmentTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedHasAssignmentTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; @@ -31,7 +32,8 @@ public EvaluatedHasAssignmentTrigger(@NotNull PolicyConstraintKindType kind, @No } @Override - public EvaluatedHasAssignmentTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedHasAssignmentTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedHasAssignmentTriggerType rv = new EvaluatedHasAssignmentTriggerType(); fillCommonContent(rv); return rv; diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedModificationTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedModificationTrigger.java index bc83fbe68f4..89023229309 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedModificationTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedModificationTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; @@ -31,7 +32,8 @@ public EvaluatedModificationTrigger(@NotNull PolicyConstraintKindType kind, @Not } @Override - public EvaluatedModificationTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedModificationTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedModificationTriggerType rv = new EvaluatedModificationTriggerType(); fillCommonContent(rv); return rv; diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedMultiplicityTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedMultiplicityTrigger.java index 1c4b60c8782..db883fcd932 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedMultiplicityTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedMultiplicityTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; @@ -31,7 +32,8 @@ public EvaluatedMultiplicityTrigger(@NotNull PolicyConstraintKindType kind, @Not } @Override - public EvaluatedMultiplicityTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedMultiplicityTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedMultiplicityTriggerType rv = new EvaluatedMultiplicityTriggerType(); fillCommonContent(rv); return rv; diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java index 2d84efe33be..cbfaf8fa6fb 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRule.java @@ -20,6 +20,7 @@ import java.util.List; import java.util.function.Predicate; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.DebugDumpable; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.util.TreeNode; @@ -69,7 +70,7 @@ default boolean isTriggered() { Collection getPolicyExceptions(); void addToEvaluatedPolicyRuleTypes(Collection rules, PolicyRuleExternalizationOptions options, - Predicate> triggerSelector); + Predicate> triggerSelector, PrismContext prismContext); boolean isGlobal(); diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRuleTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRuleTrigger.java index 45065f803f0..d35f067c887 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRuleTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedPolicyRuleTrigger.java @@ -15,6 +15,7 @@ */ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.schema.util.LocalizationUtil; import com.evolveum.midpoint.schema.util.PolicyRuleTypeUtil; import com.evolveum.midpoint.util.DebugDumpable; @@ -144,7 +145,8 @@ public String toDiagShortcut() { return PolicyRuleTypeUtil.toDiagShortcut(constraintKind); } - public EvaluatedPolicyRuleTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedPolicyRuleTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedPolicyRuleTriggerType rv = new EvaluatedPolicyRuleTriggerType(); fillCommonContent(rv); return rv; diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedSituationTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedSituationTrigger.java index 9dde1b58a33..0c17edd81a1 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedSituationTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedSituationTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.schema.util.PolicyRuleTypeUtil; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.LocalizableMessage; @@ -103,11 +104,12 @@ protected void debugDumpSpecific(StringBuilder sb, int indent) { } @Override - public EvaluatedSituationTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedSituationTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedSituationTriggerType rv = new EvaluatedSituationTriggerType(); fillCommonContent(rv); if (!options.isRespectFinalFlag() || !isFinal()) { - sourceRules.forEach(r -> r.addToEvaluatedPolicyRuleTypes(rv.getSourceRule(), options, null)); + sourceRules.forEach(r -> r.addToEvaluatedPolicyRuleTypes(rv.getSourceRule(), options, null, prismContext)); } return rv; } diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedStateTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedStateTrigger.java index 017dcbe9964..6fb3d4a2719 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedStateTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedStateTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.EvaluatedStateTriggerType; import com.evolveum.midpoint.xml.ns._public.common.common_3.PolicyConstraintKindType; @@ -33,7 +34,8 @@ public EvaluatedStateTrigger(@NotNull PolicyConstraintKindType kind, @NotNull St } @Override - public EvaluatedStateTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedStateTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedStateTriggerType rv = new EvaluatedStateTriggerType(); fillCommonContent(rv); return rv; diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTimeValidityTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTimeValidityTrigger.java index 800d47dcb8e..5e16bb9f7ed 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTimeValidityTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTimeValidityTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.jetbrains.annotations.NotNull; @@ -31,7 +32,8 @@ public EvaluatedTimeValidityTrigger(@NotNull PolicyConstraintKindType kind, @Not } @Override - public EvaluatedTimeValidityTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedTimeValidityTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedTimeValidityTriggerType rv = new EvaluatedTimeValidityTriggerType(); fillCommonContent(rv); return rv; diff --git a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTransitionTrigger.java b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTransitionTrigger.java index ac403fd4948..983c01c2b17 100644 --- a/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTransitionTrigger.java +++ b/model/model-api/src/main/java/com/evolveum/midpoint/model/api/context/EvaluatedTransitionTrigger.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.model.api.context; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.util.DebugUtil; import com.evolveum.midpoint.util.LocalizableMessage; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -75,11 +76,12 @@ protected void debugDumpSpecific(StringBuilder sb, int indent) { } @Override - public EvaluatedTransitionTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options) { + public EvaluatedTransitionTriggerType toEvaluatedPolicyRuleTriggerType(PolicyRuleExternalizationOptions options, + PrismContext prismContext) { EvaluatedTransitionTriggerType rv = new EvaluatedTransitionTriggerType(); fillCommonContent(rv); if (!options.isRespectFinalFlag() || !isFinal()) { - innerTriggers.forEach(t -> rv.getEmbedded().add(t.toEvaluatedPolicyRuleTriggerType(options))); + innerTriggers.forEach(t -> rv.getEmbedded().add(t.toEvaluatedPolicyRuleTriggerType(options, prismContext))); } return rv; } 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 bec30385d89..9bfb9d9ac6d 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 @@ -1445,7 +1445,7 @@ private void getDeputyAssignees(List deputies, AbstractWork continue; } if (determineDeputyValidity(potentialDeputy, workItem.getAssigneeRef(), workItem, OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, task, result)) { - deputies.add(ObjectTypeUtil.createObjectRefWithFullObject(potentialDeputy)); + deputies.add(ObjectTypeUtil.createObjectRefWithFullObject(potentialDeputy, prismContext)); oidsToSkip.add(potentialDeputy.getOid()); } } @@ -1465,7 +1465,7 @@ private void getDeputyAssigneesNoWorkItem(List deputies, Ob continue; } if (determineDeputyValidity(potentialDeputy, Collections.singletonList(assigneeRef), null, limitationItemName, task, result)) { - deputies.add(ObjectTypeUtil.createObjectRefWithFullObject(potentialDeputy)); + deputies.add(ObjectTypeUtil.createObjectRefWithFullObject(potentialDeputy, prismContext)); oidsToSkip.add(potentialDeputy.getOid()); } } @@ -1696,7 +1696,7 @@ public TaskType submitTaskFromTemplate(String templateTaskOid, List> newTask.setName(PolyStringType.fromOrig(newTask.getName().getOrig() + " " + (int) (Math.random() * 10000))); newTask.setOid(null); newTask.setTaskIdentifier(null); - newTask.setOwnerRef(createObjectRef(principal.getUser())); + newTask.setOwnerRef(createObjectRef(principal.getUser(), prismContext)); newTask.setExecutionStatus(RUNNABLE); for (Item extensionItem : extensionItems) { newTask.asPrismObject().getExtension().add(extensionItem.clone()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java index 12e00d7ef1b..ae572184a3d 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/expr/MidpointFunctionsImpl.java @@ -16,7 +16,6 @@ package com.evolveum.midpoint.model.impl.expr; import com.evolveum.midpoint.common.LocalizationService; -import com.evolveum.midpoint.common.SynchronizationUtils; import com.evolveum.midpoint.common.refinery.RefinedAttributeDefinition; import com.evolveum.midpoint.common.refinery.RefinedObjectClassDefinition; import com.evolveum.midpoint.common.refinery.RefinedResourceSchema; @@ -54,7 +53,6 @@ import com.evolveum.midpoint.provisioning.api.ProvisioningService; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.repo.common.expression.ExpressionFactory; -import com.evolveum.midpoint.repo.common.expression.ExpressionUtil; import com.evolveum.midpoint.schema.*; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -1389,7 +1387,7 @@ public Map parseXmlToMap(String xml) { public List getMembersAsReferences(String orgOid) throws SchemaException, SecurityViolationException, CommunicationException, ConfigurationException, ObjectNotFoundException, ExpressionEvaluationException { return getMembers(orgOid).stream() - .map(obj -> createObjectRef(obj)) + .map(obj -> createObjectRef(obj, prismContext)) .collect(Collectors.toList()); } @@ -1607,7 +1605,7 @@ public TaskType executeChangesAsynchronously(Collection> deltas, newTask.setName(PolyStringType.fromOrig(newTask.getName().getOrig() + " " + (int) (Math.random()*10000))); newTask.setOid(null); newTask.setTaskIdentifier(null); - newTask.setOwnerRef(createObjectRef(principal.getUser())); + newTask.setOwnerRef(createObjectRef(principal.getUser(), prismContext)); newTask.setExecutionStatus(RUNNABLE); newTask.setHandlerUri(ModelPublicConstants.EXECUTE_DELTAS_TASK_HANDLER_URI); if (deltas.isEmpty()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java index 9d3dcec3e88..19e2fc7b91e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ImportAccountsFromResourceTaskHandler.java @@ -140,7 +140,7 @@ public void launch(ResourceType resource, QName objectclass, Task task, Operatio // Set reference to the resource - task.setObjectRef(ObjectTypeUtil.createObjectRef(resource)); + task.setObjectRef(ObjectTypeUtil.createObjectRef(resource, prismContext)); try { PrismProperty objectclassProp = objectclassPropertyDefinition.instantiate(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java index aeea21e416e..e6116735acf 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/importer/ObjectImporter.java @@ -245,7 +245,7 @@ private EventResult importParsedObject(PrismObject pri metaData.setCreateChannel(channel); metaData.setCreateTimestamp(clock.currentTimeXMLGregorianCalendar()); if (task.getOwner() != null) { - metaData.setCreatorRef(ObjectTypeUtil.createObjectRef(task.getOwner())); + metaData.setCreatorRef(ObjectTypeUtil.createObjectRef(task.getOwner(), prismContext)); } object.asObjectable().setMetadata(metaData); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java index 9fa944e68f0..fb2d4897120 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/AssignmentPathSegmentImpl.java @@ -622,11 +622,11 @@ public AssignmentPathSegmentType toAssignmentPathSegmentType(boolean includeAssi rv.setAssignmentId(assignment.getId()); } if (source != null) { - rv.setSourceRef(ObjectTypeUtil.createObjectRef(source)); + rv.setSourceRef(ObjectTypeUtil.createObjectRef(source, prismContext)); rv.setSourceDisplayName(ObjectTypeUtil.getDisplayName(source)); } if (target != null) { - rv.setTargetRef(ObjectTypeUtil.createObjectRef(target)); + rv.setTargetRef(ObjectTypeUtil.createObjectRef(target, prismContext)); rv.setTargetDisplayName(ObjectTypeUtil.getDisplayName(target)); } rv.setMatchingOrder(isMatchingOrder()); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java index c8d1143e6b0..85151ee289e 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/Clockwork.java @@ -927,10 +927,10 @@ private void setOperationContext(OperationExecutionType operation, task = task.getParentForLightweightAsynchronousTask(); } if (task.isPersistent()) { - operation.setTaskRef(ObjectTypeUtil.createObjectRef(task.getTaskPrismObject())); + operation.setTaskRef(ObjectTypeUtil.createObjectRef(task.getTaskPrismObject(), prismContext)); } operation.setStatus(overallStatus); - operation.setInitiatorRef(ObjectTypeUtil.createObjectRef(task.getOwner())); // TODO what if the real initiator is different? (e.g. when executing approved changes) + operation.setInitiatorRef(ObjectTypeUtil.createObjectRef(task.getOwner(), prismContext)); // TODO what if the real initiator is different? (e.g. when executing approved changes) operation.setChannel(channel); operation.setTimestamp(now); } @@ -1103,7 +1103,7 @@ private void auditEvent(LensContext context, AuditEven AuditEventRecord auditRecord = new AuditEventRecord(eventType, stage); if (primaryObject != null) { - auditRecord.setTarget(primaryObject.clone()); + auditRecord.setTarget(primaryObject.clone(), prismContext); // } else { // throw new IllegalStateException("No primary object in:\n"+context.dump()); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java index e01e245d8c3..4c4cea39b52 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluatedPolicyRuleImpl.java @@ -337,7 +337,7 @@ public List> extractShortMessages() { @Override public void addToEvaluatedPolicyRuleTypes(Collection rules, PolicyRuleExternalizationOptions options, - Predicate> triggerSelector) { + Predicate> triggerSelector, PrismContext prismContext) { EvaluatedPolicyRuleType rv = new EvaluatedPolicyRuleType(); rv.setRuleName(getName()); boolean isFull = options.getTriggeredRulesStorageStrategy() == FULL; @@ -345,7 +345,7 @@ public void addToEvaluatedPolicyRuleTypes(Collection ru rv.setAssignmentPath(assignmentPath.toAssignmentPathType(options.isIncludeAssignmentsContent())); } if (isFull && directOwner != null) { - rv.setDirectOwnerRef(ObjectTypeUtil.createObjectRef(directOwner)); + rv.setDirectOwnerRef(ObjectTypeUtil.createObjectRef(directOwner, prismContext)); rv.setDirectOwnerDisplayName(ObjectTypeUtil.getDisplayName(directOwner)); } for (EvaluatedPolicyRuleTrigger trigger : triggers) { @@ -354,10 +354,10 @@ public void addToEvaluatedPolicyRuleTypes(Collection ru } if (trigger instanceof EvaluatedSituationTrigger && trigger.isHidden()) { for (EvaluatedPolicyRule sourceRule : ((EvaluatedSituationTrigger) trigger).getSourceRules()) { - sourceRule.addToEvaluatedPolicyRuleTypes(rules, options, null); + sourceRule.addToEvaluatedPolicyRuleTypes(rules, options, null, prismContext); } } else { - rv.getTrigger().add(trigger.toEvaluatedPolicyRuleTriggerType(options)); + rv.getTrigger().add(trigger.toEvaluatedPolicyRuleTriggerType(options, prismContext)); } } if (rv.getTrigger().isEmpty()) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensElementContext.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensElementContext.java index 3f2ce5e0022..93b2b61ad32 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensElementContext.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensElementContext.java @@ -654,14 +654,14 @@ private PrismObject cloneObject(PrismObject thisObject) { void storeIntoLensElementContextType(LensElementContextType lensElementContextType, boolean reduced) throws SchemaException { if (objectOld != null) { if (reduced) { - lensElementContextType.setObjectOldRef(ObjectTypeUtil.createObjectRef(objectOld)); + lensElementContextType.setObjectOldRef(ObjectTypeUtil.createObjectRef(objectOld, getPrismContext())); } else { lensElementContextType.setObjectOld(objectOld.asObjectable()); } } if (objectNew != null) { if (reduced) { - lensElementContextType.setObjectNewRef(ObjectTypeUtil.createObjectRef(objectNew)); + lensElementContextType.setObjectNewRef(ObjectTypeUtil.createObjectRef(objectNew, getPrismContext())); } else { lensElementContextType.setObjectNew(objectNew.asObjectable()); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java index 7687a90c857..f2a26f20cea 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/LensUtil.java @@ -576,7 +576,7 @@ public static Collection getForcedA if (virtualAssignmenetSpecification != null) { ResultHandler handler = (object, parentResult) -> { - AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(object); + AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(object, prismContext); return forcedAssignments.add(assignment); }; diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationalDataManager.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationalDataManager.java index 6474458b9af..936752516d8 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationalDataManager.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/OperationalDataManager.java @@ -81,7 +81,7 @@ private MetadataType collectRequestMetadata(LensContext void applyCreateMetadata(LensContext context, metaData.setCreateChannel(channel); metaData.setCreateTimestamp(now); if (task.getOwner() != null) { - metaData.setCreatorRef(createObjectRef(task.getOwner())); + metaData.setCreatorRef(createObjectRef(task.getOwner(), prismContext)); } - metaData.setCreateTaskRef(task.getOid() != null ? createObjectRef(task.getTaskPrismObject()) : null); + metaData.setCreateTaskRef(task.getOid() != null ? createObjectRef(task.getTaskPrismObject(), prismContext) : null); } public Collection> createModifyMetadataDeltas(LensContext context, @@ -264,9 +264,9 @@ public Collection> c return DeltaBuilder.deltaFor(objectType, prismContext) .item(metadataPath.subPath(MetadataType.F_MODIFY_CHANNEL)).replace(LensUtil.getChannel(context, task)) .item(metadataPath.subPath(MetadataType.F_MODIFY_TIMESTAMP)).replace(now) - .item(metadataPath.subPath(MetadataType.F_MODIFIER_REF)).replace(createObjectRef(task.getOwner())) + .item(metadataPath.subPath(MetadataType.F_MODIFIER_REF)).replace(createObjectRef(task.getOwner(), prismContext)) .item(metadataPath.subPath(MetadataType.F_MODIFY_TASK_REF)).replaceRealValues( - task.getOid() != null ? singleton(createObjectRef(task.getTaskPrismObject())) : emptySet()) + task.getOid() != null ? singleton(createObjectRef(task.getTaskPrismObject(), prismContext)) : emptySet()) .asItemDeltas(); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java index 14eaebefcb4..af2bf3553f2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/focus/AssignmentProcessor.java @@ -729,7 +729,7 @@ private void createAssignmentDelta(LensContext context, ContainerDelta assignmentDelta = ContainerDelta.createDelta(FocusType.F_ASSIGNMENT, focusClass, prismContext); AssignmentType assignment = new AssignmentType(); ConstructionType constructionType = new ConstructionType(); - constructionType.setResourceRef(ObjectTypeUtil.createObjectRef(accountContext.getResource())); + constructionType.setResourceRef(ObjectTypeUtil.createObjectRef(accountContext.getResource(), prismContext)); assignment.setConstruction(constructionType); assignmentDelta.addValueToAdd(assignment.asPrismContainerValue()); PrismContainerDefinition containerDefinition = prismContext.getSchemaRegistry().findObjectDefinitionByCompileTimeClass(focusClass).findContainerDefinition(FocusType.F_ASSIGNMENT); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleEnforcer.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleEnforcer.java index e23445dcdaa..8175ee4f864 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleEnforcer.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyRuleEnforcer.java @@ -141,7 +141,7 @@ private void enforceTriggeredRules(EvaluationContext evalCtx, Collection enforceAll || t.isEnforcementOverride()); + t -> enforceAll || t.isEnforcementOverride(), prismContext); List> messageTrees = EvaluatedPolicyRuleUtil.extractMessages(triggersFiltered, EvaluatedPolicyRuleUtil.MessageKind.NORMAL); for (TreeNode messageTree : messageTrees) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyStateRecorder.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyStateRecorder.java index b0ed2ee6060..528ef035c63 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyStateRecorder.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/projector/policy/PolicyStateRecorder.java @@ -119,7 +119,7 @@ private ComputationResult compute(@NotNull List rulesToReco if (recordAction.getPolicyRules() != TriggeredPolicyRulesStorageStrategyType.NONE) { PolicyRuleExternalizationOptions externalizationOptions = new PolicyRuleExternalizationOptions( recordAction.getPolicyRules(), false, true); - rule.addToEvaluatedPolicyRuleTypes(cr.newTriggeredRules, externalizationOptions, null); + rule.addToEvaluatedPolicyRuleTypes(cr.newTriggeredRules, externalizationOptions, null, prismContext); } } cr.oldPolicySituations.addAll(existingPolicySituation); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java index 1989c332131..e498bceb3c2 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/scripting/PipelineData.java @@ -178,7 +178,7 @@ private Collection resolveQuery(Class ObjectQuery query = QueryJaxbConvertor.createObjectQuery(type, queryBean, context.getPrismContext()); SearchResultList> objects = context.getModelService() .searchObjects(type, query, null, context.getTask(), result); - return objects.stream().map(o -> ObjectTypeUtil.createObjectRef(o)).collect(Collectors.toList()); + return objects.stream().map(o -> ObjectTypeUtil.createObjectRef(o, context.getPrismContext())).collect(Collectors.toList()); } static PipelineData parseFrom(ValueListType input, Map frozenInitialVariables, PrismContext prismContext) { diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index 4142b6b5481..3daa840b655 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -238,7 +238,7 @@ public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketT long reconStartTimestamp = clock.currentTimeMillis(); AuditEventRecord requestRecord = new AuditEventRecord(AuditEventType.RECONCILIATION, AuditEventStage.REQUEST); - requestRecord.setTarget(resource); + requestRecord.setTarget(resource, prismContext); requestRecord.setMessage("Stage: " + stage + ", Work bucket: " + workBucket); auditService.audit(requestRecord, localCoordinatorTask); @@ -320,7 +320,7 @@ public TaskWorkBucketProcessingResult run(Task localCoordinatorTask, WorkBucketT } AuditEventRecord executionRecord = new AuditEventRecord(AuditEventType.RECONCILIATION, AuditEventStage.EXECUTION); - executionRecord.setTarget(resource); + executionRecord.setTarget(resource, prismContext); executionRecord.setOutcome(OperationResultStatus.SUCCESS); executionRecord.setMessage(requestRecord.getMessage()); auditService.audit(executionRecord, localCoordinatorTask); @@ -391,7 +391,7 @@ public void launch(ResourceType resource, QName objectclass, Task task, Operatio task.setName(polyString); // Set reference to the resource - task.setObjectRef(ObjectTypeUtil.createObjectRef(resource)); + task.setObjectRef(ObjectTypeUtil.createObjectRef(resource, prismContext)); try { task.setExtensionPropertyValue(ModelConstants.OBJECTCLASS_PROPERTY_NAME, objectclass); @@ -453,7 +453,7 @@ private void processErrorFinal(TaskRunResult runResult, String errorDesc, Except runResult.setRunResultStatus(runResultStatus); AuditEventRecord executionRecord = new AuditEventRecord(AuditEventType.RECONCILIATION, AuditEventStage.EXECUTION); - executionRecord.setTarget(resource); + executionRecord.setTarget(resource, prismContext); executionRecord.setOutcome(OperationResultStatus.FATAL_ERROR); executionRecord.setMessage(ex.getMessage()); auditService.audit(executionRecord , task); @@ -553,7 +553,7 @@ private boolean performShadowReconciliation(final PrismObject reso .item(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP).le(XmlTypeConverter.createXMLGregorianCalendar(startTimestamp)) .or().item(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP).isNull() .endBlock() - .and().item(ShadowType.F_RESOURCE_REF).ref(ObjectTypeUtil.createObjectRef(resource).asReferenceValue()) + .and().item(ShadowType.F_RESOURCE_REF).ref(ObjectTypeUtil.createObjectRef(resource, prismContext).asReferenceValue()) // TODO MID-3581 .and().item(ShadowType.F_OBJECT_CLASS).eq(objectclassDef.getTypeName()) .build(); diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java index 7cce81316d5..cc44142780a 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/validator/ResourceValidatorImpl.java @@ -94,9 +94,10 @@ private static class ResourceValidationContext { ResourceValidationContext( @NotNull PrismObject resourceObject, @NotNull Scope scope, @NotNull Task task, - @NotNull ValidationResult validationResult, ResourceSchema resourceSchema) { + @NotNull ValidationResult validationResult, ResourceSchema resourceSchema, + PrismContext prismContext) { this.resourceObject = resourceObject; - this.resourceRef = ObjectTypeUtil.createObjectRef(resourceObject); + this.resourceRef = ObjectTypeUtil.createObjectRef(resourceObject, prismContext); this.scope = scope; this.task = task; this.validationResult = validationResult; @@ -118,10 +119,10 @@ public ValidationResult validate(@NotNull PrismObject resourceObje } catch (Throwable t) { vr.add(Issue.Severity.WARNING, CAT_SCHEMA, C_NO_SCHEMA, getString(CLASS_DOT + C_NO_SCHEMA, t.getMessage()), - ObjectTypeUtil.createObjectRef(resourceObject), ItemPath.EMPTY_PATH); + ObjectTypeUtil.createObjectRef(resourceObject, prismContext), ItemPath.EMPTY_PATH); } - ResourceValidationContext ctx = new ResourceValidationContext(resourceObject, scope, task, vr, resourceSchema); + ResourceValidationContext ctx = new ResourceValidationContext(resourceObject, scope, task, vr, resourceSchema, prismContext); SchemaHandlingType schemaHandling = resource.getSchemaHandling(); if (schemaHandling != null) { diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java index 70fdd89eefd..27da9707c51 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/lens/TestAssignmentProcessor2.java @@ -2039,7 +2039,7 @@ private void createObjectsInFourthPart(boolean deleteFirst, Task task, Operation assign(org11, org1); assign(org21, org2); // org1->roleAdmin - AssignmentType inducement = ObjectTypeUtil.createAssignmentTo(roleAdmin.asPrismObject()) + AssignmentType inducement = ObjectTypeUtil.createAssignmentTo(roleAdmin.asPrismObject(), prismContext) .beginOrderConstraint() .orderMin("1") .orderMax("unbounded") @@ -2048,7 +2048,7 @@ private void createObjectsInFourthPart(boolean deleteFirst, Task task, Operation org1.getInducement().add(inducement); // org2->roleAdmin - AssignmentType inducement2 = ObjectTypeUtil.createAssignmentTo(roleAdmin.asPrismObject()) + AssignmentType inducement2 = ObjectTypeUtil.createAssignmentTo(roleAdmin.asPrismObject(), prismContext) .beginOrderConstraint() .order(1) .relation(SchemaConstants.ORG_MANAGER) @@ -2069,7 +2069,7 @@ private void createObjectsInFourthPart(boolean deleteFirst, Task task, Operation * Org41 Admin */ assign(org41, org4); - AssignmentType inducement4 = ObjectTypeUtil.createAssignmentTo(roleAdmin.asPrismObject()) + AssignmentType inducement4 = ObjectTypeUtil.createAssignmentTo(roleAdmin.asPrismObject(), prismContext) .beginOrderConstraint() .orderMin("0") .orderMax("unbounded") @@ -2229,7 +2229,7 @@ private String createDumpConditionCode(String text) { } private void induce(AbstractRoleType source, AbstractRoleType target, int inducementOrder) { - AssignmentType inducement = ObjectTypeUtil.createAssignmentTo(target.asPrismObject()); + AssignmentType inducement = ObjectTypeUtil.createAssignmentTo(target.asPrismObject(), prismContext); if (inducementOrder > 1) { inducement.setOrder(inducementOrder); } @@ -2237,12 +2237,12 @@ private void induce(AbstractRoleType source, AbstractRoleType target, int induce } private void assign(AbstractRoleType source, AbstractRoleType target) { - AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(target.asPrismObject()); + AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(target.asPrismObject(), prismContext); source.getAssignment().add(assignment); } private void assign(AbstractRoleType source, AbstractRoleType target, QName relation) { - AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(target.asPrismObject()); + AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(target.asPrismObject(), prismContext); assignment.getTargetRef().setRelation(relation); source.getAssignment().add(assignment); } diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/visualizer/TestVisualizer.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/visualizer/TestVisualizer.java index 6b86cbb83ad..110344d167d 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/visualizer/TestVisualizer.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/visualizer/TestVisualizer.java @@ -22,7 +22,6 @@ import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismObject; import com.evolveum.midpoint.prism.delta.ObjectDelta; -import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; import com.evolveum.midpoint.prism.util.PrismTestUtil; import com.evolveum.midpoint.prism.xml.XmlTypeConverter; import com.evolveum.midpoint.schema.MidPointPrismContextFactory; diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java index 28b7034f71d..b3cb5b0a4c1 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/TestActivation.java @@ -2664,7 +2664,7 @@ public void test600AddUser1() throws Exception { PrismObject user1 = prismContext.createObject(UserType.class); DeltaBuilder.deltaFor(UserType.class, prismContext) .item(UserType.F_NAME).replace(new PolyString("user1")) - .item(UserType.F_ASSIGNMENT).add(ObjectTypeUtil.createAssignmentTo(resourceDummyCoral).asPrismContainerValue()) + .item(UserType.F_ASSIGNMENT).add(ObjectTypeUtil.createAssignmentTo(resourceDummyCoral, prismContext).asPrismContainerValue()) .item(ACTIVATION_ADMINISTRATIVE_STATUS_PATH).replace(ActivationStatusType.DISABLED) .asObjectDelta(null) .applyTo((PrismObject) user1); diff --git a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java index 9787cfbf486..d4f526708b5 100644 --- a/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java +++ b/model/model-intest/src/test/java/com/evolveum/midpoint/model/intest/rbac/TestAssignmentValidity.java @@ -1775,7 +1775,7 @@ public void test250JackAssignFocusExistsResource() throws Exception { ActivationType activation = new ActivationType(); activation.setValidFrom(getTimestamp("PT10M")); - AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(resourceDummyFocusExists).activation(activation); + AssignmentType assignment = ObjectTypeUtil.createAssignmentTo(resourceDummyFocusExists, prismContext).activation(activation); // WHEN displayWhen(TEST_NAME); diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java index 05b8e3242cc..fd64be050c3 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportCreateTaskHandler.java @@ -516,7 +516,7 @@ private void saveReportOutputType(String filePath, ReportType reportType, Task t throw new IllegalStateException("Found more than one node with ID " + task.getNode()); } - reportOutputType.setNodeRef(ObjectTypeUtil.createObjectRef(nodes.iterator().next())); + reportOutputType.setNodeRef(ObjectTypeUtil.createObjectRef(nodes.iterator().next(), prismContext)); ObjectDelta objectDelta = null; Collection> deltas = new ArrayList<>(); diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java index a62c7630894..811f5d6ecc3 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java @@ -17,6 +17,7 @@ package com.evolveum.midpoint.wf.util; import com.evolveum.midpoint.model.api.util.DeputyUtils; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; @@ -49,12 +50,13 @@ public class QueryUtils { * * Note that work item limitations are supported only in the current (crude) form: all or none. */ + // TODO consider other default relations here!!! MID-3851 public static S_AtomicFilterExit filterForAssignees(S_FilterEntryOrEmpty q, MidPointPrincipal principal, - QName limitationItemName) throws SchemaException { + QName limitationItemName, PrismContext prismContext) { if (principal == null) { return q.none(); } else { - return q.item(WorkItemType.F_ASSIGNEE_REF).ref(getPotentialAssigneesForUser(principal, limitationItemName)); + return q.item(WorkItemType.F_ASSIGNEE_REF).ref(getPotentialAssigneesForUser(principal, limitationItemName, prismContext)); } } @@ -64,12 +66,12 @@ public static S_FilterExit filterForGroups(S_FilterEntryOrEmpty q, String userOi } private static List getPotentialAssigneesForUser(MidPointPrincipal principal, - QName limitationItemName) throws SchemaException { + QName limitationItemName, PrismContext prismContext) { List rv = new ArrayList<>(); rv.add(new PrismReferenceValue(principal.getOid(), UserType.COMPLEX_TYPE)); for (DelegatorWithOtherPrivilegesLimitations delegator : principal.getDelegatorWithOtherPrivilegesLimitationsCollection()) { if (DeputyUtils.limitationsAllow(delegator.getLimitations(), limitationItemName)) { - rv.add(ObjectTypeUtil.createObjectRef(delegator.getDelegator()).asReferenceValue()); + rv.add(ObjectTypeUtil.createObjectRef(delegator.getDelegator(), prismContext).asReferenceValue()); } } return rv; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/ApprovalSchemaExecutionInformationHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/ApprovalSchemaExecutionInformationHelper.java index d4a0b9a3d5c..ec24e0eeab3 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/ApprovalSchemaExecutionInformationHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/ApprovalSchemaExecutionInformationHelper.java @@ -94,7 +94,7 @@ List getApprovalSchemaPreview(ModelConte private ApprovalSchemaExecutionInformationType getApprovalSchemaExecutionInformation(TaskType wfTask, boolean purePreview, Task opTask, OperationResult result) { ApprovalSchemaExecutionInformationType rv = new ApprovalSchemaExecutionInformationType(prismContext); - rv.setTaskRef(ObjectTypeUtil.createObjectRefWithFullObject(wfTask)); + rv.setTaskRef(ObjectTypeUtil.createObjectRefWithFullObject(wfTask, prismContext)); WfContextType wfc = wfTask.getWorkflowContext(); if (wfc == null) { result.recordFatalError("Workflow context in " + wfTask + " is missing or not accessible."); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemManager.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemManager.java index a5bd54a717d..35dfa03c254 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemManager.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/activiti/dao/WorkItemManager.java @@ -249,7 +249,7 @@ public void delegateWorkItem(String workItemId, List delega ObjectReferenceType initiator = causeInformation == null || causeInformation.getType() == WorkItemEventCauseTypeType.USER_ACTION ? - ObjectTypeUtil.createObjectRef(principal.getUser()) : null; + ObjectTypeUtil.createObjectRef(principal.getUser(), prismContext) : null; LOGGER.trace("Delegating work item {} to {}: escalation={}; cause={}", workItemId, delegates, escalation != null ? escalation.getName() + "/" + escalation.getDisplayName() : "none", causeInformation); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java index 2bfbdd1b348..9b55ef1ad60 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/common/ActivitiUtil.java @@ -176,8 +176,8 @@ public static List toLightweightReferences(Collection variables, PrismContext prismContext) { if (currentUser != null) { - event.setInitiatorRef(ObjectTypeUtil.createObjectRef(currentUser.getUser())); - event.setAttorneyRef(ObjectTypeUtil.createObjectRef(currentUser.getAttorney())); + event.setInitiatorRef(ObjectTypeUtil.createObjectRef(currentUser.getUser(), prismContext)); + event.setAttorneyRef(ObjectTypeUtil.createObjectRef(currentUser.getAttorney(), prismContext)); } event.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date())); event.setExternalWorkItemId(workItemId); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/MidpointUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/MidpointUtil.java index 204fd929044..ef0bbb683e0 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/MidpointUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processes/itemApproval/MidpointUtil.java @@ -130,7 +130,7 @@ private static Collection expandAbstractRole(ObjectReferenc return getCacheRepositoryService() .searchObjects(UserType.class, query, null, new OperationResult("dummy")) .stream() - .map(o -> ObjectTypeUtil.createObjectRef(o)) + .map(o -> ObjectTypeUtil.createObjectRef(o, prismContext)) .collect(Collectors.toList()); } catch (SchemaException e) { throw new SystemException("Couldn't resolve " + approverRef + ": " + e.getMessage(), e); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java index 69b95755634..b813e7ca0a7 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/BaseAuditHelper.java @@ -111,7 +111,7 @@ private ObjectReferenceType resolveIfNeeded(ObjectReferenceType ref, OperationRe } try { return ObjectTypeUtil.createObjectRef( - repositoryService.getObject(types.getClassDefinition(), ref.getOid(), null, result)); + repositoryService.getObject(types.getClassDefinition(), ref.getOid(), null, result), prismContext); } catch (ObjectNotFoundException|SchemaException e) { LoggingUtils.logUnexpectedException(LOGGER, "Couldn't resolve {}", e, ref); return ref; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java index 80542555a28..61dfa0368e2 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/PcpChildWfTaskCreationInstruction.java @@ -84,7 +84,7 @@ public void prepareCommonAttributes(PrimaryChangeAspect aspect, ModelContext CaseCreationEventType event = new CaseCreationEventType(); event.setTimestamp(XmlTypeConverter.createXMLGregorianCalendar(new Date())); if (requester != null) { - event.setInitiatorRef(ObjectTypeUtil.createObjectRef(requester)); + event.setInitiatorRef(ObjectTypeUtil.createObjectRef(requester, getPrismContext())); // attorney does not need to be set here (for now) } event.setBusinessContext(((LensContext) modelContext).getRequestBusinessContext()); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java index 7941a11a34c..1d4429bbeb4 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/aspect/BasePrimaryChangeAspect.java @@ -198,7 +198,7 @@ private List r SearchResultList> targets = repositoryService.searchObjects(clazz, ObjectQuery.createObjectQuery(evaluatedFilter), null, result); return targets.stream() - .map(ObjectTypeUtil::createObjectRef) + .map(object -> ObjectTypeUtil.createObjectRef(object, prismContext)) .collect(Collectors.toList()); } finally { @@ -257,7 +257,7 @@ public RelationResolver createRelationResolver(PrismObject object, OperationR Set> distinctObjects = new HashSet<>(objects); LOGGER.trace("Found {} approver(s): {}", distinctObjects.size(), DebugUtil.toStringLazily(distinctObjects)); return distinctObjects.stream() - .map(ObjectTypeUtil::createObjectRef) + .map(object1 -> ObjectTypeUtil.createObjectRef(object1, prismContext)) .collect(Collectors.toList()); }; } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/AddAssignmentAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/AddAssignmentAspect.java index 2abc42e304d..229b2bacbd8 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/AddAssignmentAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/AddAssignmentAspect.java @@ -246,7 +246,7 @@ private List prepareTaskInstructions(ModelCon instruction.setDeltasToProcess(delta); instruction.setObjectRef(modelContext, result); - instruction.setTargetRef(createObjectRef(target), result); + instruction.setTargetRef(createObjectRef(target, prismContext), result); String andExecuting = instruction.isExecuteApprovedChangeImmediately() ? "and execution " : ""; instruction.setTaskName("Approval " + andExecuting + "of assigning " + targetName + " to " + assigneeName); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ModifyAssignmentAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ModifyAssignmentAspect.java index 6781245c2f1..8d0dfb87f38 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ModifyAssignmentAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/assignments/ModifyAssignmentAspect.java @@ -228,7 +228,7 @@ private List prepareJobCreateInstructions(Mod instruction.setDeltasToProcess(delta); instruction.setObjectRef(modelContext, result); - instruction.setTargetRef(ObjectTypeUtil.createObjectRef(target), result); + instruction.setTargetRef(ObjectTypeUtil.createObjectRef(target, prismContext), result); // set the names of midPoint task and activiti process instance String andExecuting = instruction.isExecuteApprovedChangeImmediately() ? "and execution " : ""; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/entitlements/AddAssociationAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/entitlements/AddAssociationAspect.java index c00d19db439..a670d68ffe2 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/entitlements/AddAssociationAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/entitlements/AddAssociationAspect.java @@ -248,7 +248,7 @@ private boolean existsEquivalentValue(PrismObject shadowOld, PrismCo instruction.setDeltasToProcesses(objectTreeDeltas); instruction.setObjectRef(modelContext, result); // TODO - or should we take shadow as an object? - instruction.setTargetRef(ObjectTypeUtil.createObjectRef(target), result); + instruction.setTargetRef(ObjectTypeUtil.createObjectRef(target, prismContext), result); // set the names of midPoint task and activiti process instance String andExecuting = instruction.isExecuteApprovedChangeImmediately() ? "and execution " : ""; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java index 3515576513e..5d2a0f096ff 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/ApprovalSchemaBuilder.java @@ -246,7 +246,7 @@ private void processFragmentGroup(List fragments, ApprovalSchemaType r if (firstFragment.policyRule != null) { List rules = new ArrayList<>(); firstFragment.policyRule.addToEvaluatedPolicyRuleTypes(rules, new PolicyRuleExternalizationOptions(FULL, - false, true), null); + false, true), null, ctx.prismContext); for (EvaluatedPolicyRuleType rule : rules) { SchemaAttachedPolicyRuleType attachedRule = new SchemaAttachedPolicyRuleType(); attachedRule.setStageMin(from); diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java index 2bdfbb3acd7..286fd76dab9 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/AssignmentPolicyAspectPart.java @@ -304,7 +304,7 @@ private PcpChildWfTaskCreationInstruction prepareAs instruction.setDeltasToProcess(deltaToApprove); instruction.setObjectRef(modelContext, result); - instruction.setTargetRef(createObjectRef(target), result); + instruction.setTargetRef(createObjectRef(target, prismContext), result); String taskNameInDefaultLocale = localizationService.translate( new LocalizableMessageBuilder() diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/PolicyRuleBasedAspect.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/PolicyRuleBasedAspect.java index 2cf684ddb9b..e67fd9e6673 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/PolicyRuleBasedAspect.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/processors/primary/policy/PolicyRuleBasedAspect.java @@ -180,7 +180,7 @@ private LocalizableMessage processNameFromTriggers(ApprovalSchemaBuilder.Result if (actionWithRule.getRight() != null) { for (EvaluatedPolicyRuleTrigger trigger : actionWithRule.getRight().getAllTriggers()) { // we don't care about options; these converted triggers will be thrown away - triggers.add(trigger.toEvaluatedPolicyRuleTriggerType(new PolicyRuleExternalizationOptions())); + triggers.add(trigger.toEvaluatedPolicyRuleTriggerType(new PolicyRuleExternalizationOptions(), prismContext)); } } } diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java index 32dc17df135..2da506f467b 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/tasks/WfTaskCreationInstruction.java @@ -276,10 +276,10 @@ public void setObjectRef(ModelContext modelContext, OperationResult result) { ObjectType focus = MiscDataUtil.getFocusObjectNewOrOld(modelContext); ObjectDelta primaryDelta = modelContext.getFocusContext().getPrimaryDelta(); if (primaryDelta != null && primaryDelta.isAdd()) { - ObjectReferenceType ref = ObjectTypeUtil.createObjectRefWithFullObject(focus); + ObjectReferenceType ref = ObjectTypeUtil.createObjectRefWithFullObject(focus, getPrismContext()); wfContext.setObjectRef(ref); } else { - setObjectRef(ObjectTypeUtil.createObjectRef(focus), result); + setObjectRef(ObjectTypeUtil.createObjectRef(focus, getPrismContext()), result); } } @@ -289,7 +289,7 @@ public void setTargetRef(ObjectReferenceType ref, OperationResult result) { } public void setRequesterRef(PrismObject requester) { - wfContext.setRequesterRef(createObjectRef(requester)); + wfContext.setRequesterRef(createObjectRef(requester, getPrismContext())); } public void setProcessInterfaceBean(ProcessMidPointInterface processInterfaceBean) { @@ -373,7 +373,7 @@ public Task createTask(WfTaskController taskController, Task parentTask, WfConfi if (taskObject != null) { //noinspection unchecked - task.setObjectRef(ObjectTypeUtil.createObjectRef(taskObject)); + task.setObjectRef(ObjectTypeUtil.createObjectRef(taskObject, getPrismContext())); } else if (parentTask != null && parentTask.getObjectRef() != null) { task.setObjectRef(parentTask.getObjectRef().clone()); } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java index 69316ccad8b..6b50cfe056a 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java @@ -1029,7 +1029,7 @@ protected void checkVisibleWorkItem(ExpectedWorkItem expectedWorkItem, int count throws SchemaException, ObjectNotFoundException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException, CommunicationException { S_AtomicFilterExit q = QueryUtils .filterForAssignees(QueryBuilder.queryFor(WorkItemType.class, prismContext), SecurityUtil.getPrincipal(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS); + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, prismContext); // TODO MID-3581 List currentWorkItems = modelService.searchContainers(WorkItemType.class, q.build(), null, task, result); long found = currentWorkItems.stream().filter(wi -> expectedWorkItem == null || expectedWorkItem.matches(wi)).count(); assertEquals("Wrong # of matching work items", count, found); diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java index 0c24979b0a5..68545ecbf04 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/assignments/AbstractTestAssignmentApproval.java @@ -367,7 +367,7 @@ protected Boolean decideOnApproval(String executionId, org.activiti.engine.task. protected List getPotentialAssignees(PrismObject user) { List rv = new ArrayList<>(); - rv.add(ObjectTypeUtil.createObjectRef(user).asReferenceValue()); + rv.add(ObjectTypeUtil.createObjectRef(user, prismContext).asReferenceValue()); rv.addAll(DeputyUtils.getDelegatorReferences(user.asObjectable(), relationRegistry)); return rv; } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/other/TestMiscellaneous.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/other/TestMiscellaneous.java index 8aeb0ca66d0..ac45d2230bc 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/other/TestMiscellaneous.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/other/TestMiscellaneous.java @@ -116,7 +116,7 @@ public void test100RequesterComment() throws Exception { display("assignment after creation", assignment); MetadataType metadata = assignment.getMetadata(); assertNotNull("Null request timestamp in metadata", metadata.getRequestTimestamp()); - assertRefEquals("Wrong requestorRef in metadata", ObjectTypeUtil.createObjectRef(userAdministrator), metadata.getRequestorRef()); + assertRefEquals("Wrong requestorRef in metadata", ObjectTypeUtil.createObjectRef(userAdministrator, prismContext), metadata.getRequestorRef()); assertEquals("Wrong requestorComment in metadata", REQUESTER_COMMENT, metadata.getRequestorComment()); } @@ -183,7 +183,7 @@ public void test105RequesterCommentImmediate() throws Exception { display("assignment after creation", assignment); MetadataType metadata = assignment.getMetadata(); assertNotNull("Null request timestamp in metadata", metadata.getRequestTimestamp()); - assertRefEquals("Wrong requestorRef in metadata", ObjectTypeUtil.createObjectRef(userAdministrator), metadata.getRequestorRef()); + assertRefEquals("Wrong requestorRef in metadata", ObjectTypeUtil.createObjectRef(userAdministrator, prismContext), metadata.getRequestorRef()); assertEquals("Wrong requestorComment in metadata", REQUESTER_COMMENT, metadata.getRequestorComment()); } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java index 95e08cbc109..190f66f937f 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowCache.java @@ -24,8 +24,6 @@ import com.evolveum.midpoint.prism.crypto.EncryptionException; import com.evolveum.midpoint.prism.crypto.Protector; import com.evolveum.midpoint.prism.delta.*; -import com.evolveum.midpoint.prism.delta.builder.DeltaBuilder; -import com.evolveum.midpoint.prism.delta.builder.S_ItemEntry; import com.evolveum.midpoint.prism.match.MatchingRuleRegistry; import com.evolveum.midpoint.prism.path.IdItemPathSegment; import com.evolveum.midpoint.prism.path.ItemPath; @@ -2716,7 +2714,7 @@ private PrismObject completeShadow(ProvisioningContext ctx, resultShadowType.setObjectClass(resourceAttributesContainer.getDefinition().getTypeName()); } if (resultShadowType.getResource() == null) { - resultShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(ctx.getResource())); + resultShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(ctx.getResource(), prismContext)); } // Attributes @@ -2847,7 +2845,7 @@ private PrismObject completeShadow(ProvisioningContext ctx, entitlementRepoShadow = lookupOrCreateLiveShadowInRepository(ctxEntitlement, entitlementShadow, false, isDoDiscovery, parentResult); } - ObjectReferenceType shadowRefType = ObjectTypeUtil.createObjectRef(entitlementRepoShadow); + ObjectReferenceType shadowRefType = ObjectTypeUtil.createObjectRef(entitlementRepoShadow, prismContext); shadowAssociationType.setShadowRef(shadowRefType); } } diff --git a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java index 1d039ca0710..95fc8f772f1 100644 --- a/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java +++ b/provisioning/provisioning-impl/src/main/java/com/evolveum/midpoint/provisioning/impl/ShadowManager.java @@ -20,12 +20,10 @@ import java.util.Arrays; import java.util.Collection; import java.util.List; -import java.util.function.Supplier; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; -import com.evolveum.midpoint.util.QNameUtil; import org.apache.commons.lang.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -68,7 +66,6 @@ import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterEntry; import com.evolveum.midpoint.prism.query.builder.S_FilterEntry; import com.evolveum.midpoint.provisioning.api.ProvisioningOperationOptions; -import com.evolveum.midpoint.provisioning.api.ResourceOperationDescription; import com.evolveum.midpoint.provisioning.ucf.api.Change; import com.evolveum.midpoint.provisioning.util.ProvisioningUtil; import com.evolveum.midpoint.repo.api.ModificationPrecondition; @@ -125,7 +122,6 @@ 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.UserType; -import com.evolveum.prism.xml.ns._public.types_3.ChangeTypeType; import com.evolveum.prism.xml.ns._public.types_3.ObjectDeltaType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import com.evolveum.prism.xml.ns._public.types_3.ProtectedStringType; @@ -1496,13 +1492,13 @@ private PrismObject createRepositoryShadow(ProvisioningContext ctx, // convert to the resource reference. if (repoShadowType.getResource() != null) { repoShadowType.setResource(null); - repoShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(ctx.getResource())); + repoShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(ctx.getResource(), prismContext)); } // if shadow does not contain resource or resource reference, create it // now if (repoShadowType.getResourceRef() == null) { - repoShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(ctx.getResource())); + repoShadowType.setResourceRef(ObjectTypeUtil.createObjectRef(ctx.getResource(), prismContext)); } if (repoShadowType.getName() == null) { diff --git a/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java b/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java index 52c1fdc5f79..5e3a569eac0 100644 --- a/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java +++ b/repo/audit-api/src/main/java/com/evolveum/midpoint/audit/api/AuditEventRecord.java @@ -258,9 +258,9 @@ public void setTarget(PrismReferenceValue target) { } // Compatibility and convenience - public void setTarget(PrismObject targetObject) { + public void setTarget(PrismObject targetObject, PrismContext prismContext) { if (targetObject != null) { - this.target = ObjectTypeUtil.createObjectRef((ObjectType) targetObject.asObjectable()).asReferenceValue(); + this.target = ObjectTypeUtil.createObjectRef((ObjectType) targetObject.asObjectable(), prismContext).asReferenceValue(); } else { this.target = null; } diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java index a98b7fb9468..a21c06c032a 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlAuditServiceImpl.java @@ -234,7 +234,8 @@ private void listRecordsIterativeAttempt(String query, Map param // TODO what if original name (in audit log) differs from the current one (in repo) ? audit.setInitiator(resolve(session, raudit.getInitiatorOid(), raudit.getInitiatorName(), defaultIfNull(raudit.getInitiatorType(), RObjectType.USER))); audit.setAttorney(resolve(session, raudit.getAttorneyOid(), raudit.getAttorneyName(), RObjectType.USER)); - audit.setTarget(resolve(session, raudit.getTargetOid(), raudit.getTargetName(), raudit.getTargetType())); + audit.setTarget(resolve(session, raudit.getTargetOid(), raudit.getTargetName(), raudit.getTargetType()), + getPrismContext()); audit.setTargetOwner(resolve(session, raudit.getTargetOwnerOid(), raudit.getTargetOwnerName(), raudit.getTargetOwnerType())); count++; if (!handler.handle(audit)) { diff --git a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java index 61bdfc03ba5..652bb162218 100644 --- a/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java +++ b/testing/story/src/test/java/com/evolveum/midpoint/testing/story/TestConsistencyMechanism.java @@ -2023,7 +2023,7 @@ public void test511AssignAccountMorgan() throws Exception { ConstructionType construction = new ConstructionType(); construction.getAttribute().add(attrDefType); - construction.setResourceRef(ObjectTypeUtil.createObjectRef(resourceTypeOpenDjrepo)); + construction.setResourceRef(ObjectTypeUtil.createObjectRef(resourceTypeOpenDjrepo, prismContext)); AssignmentType assignment = new AssignmentType(); assignment.setConstruction(construction); From a91a0676d84f47a03f3b019bbb6e0509a3b04cec Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Mon, 10 Sep 2018 19:36:56 +0200 Subject: [PATCH 03/12] Add more relation-related fixes (MID-3581) --- .../midpoint/gui/api/page/PageBase.java | 2 +- .../data/BaseSortableDataProvider.java | 6 +++ .../page/admin/cases/PageCaseWorkItems.java | 2 +- .../admin/roles/MemberOperationsHelper.java | 7 ++-- .../workflow/dto/WorkItemDtoProvider.java | 6 +-- .../web/page/self/PageSelfDashboard.java | 2 +- .../midpoint/schema/util/ObjectQueryUtil.java | 23 +++++++++-- .../impl/AccCertQueryHelper.java | 4 +- .../impl/AccCertReviewersHelper.java | 13 +++++-- .../impl/sync/ReconciliationTaskHandler.java | 2 +- .../evolveum/midpoint/wf/util/QueryUtils.java | 38 ++++++++++--------- .../wf/impl/policy/AbstractWfTestPolicy.java | 2 +- 12 files changed, 69 insertions(+), 38 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 5734febd965..fcb08ae61a0 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 @@ -356,7 +356,7 @@ protected Integer load() { Task task = createSimpleTask(OPERATION_LOAD_WORK_ITEM_COUNT); S_FilterEntryOrEmpty q = QueryBuilder.queryFor(WorkItemType.class, getPrismContext()); ObjectQuery query = QueryUtils.filterForAssignees(q, getPrincipal(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()).build(); // TODO MID-3581 + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()).build(); return getModelService().countContainers(WorkItemType.class, query, null, task, task.getResult()); } catch (SchemaException | SecurityViolationException | ExpressionEvaluationException | ObjectNotFoundException | CommunicationException | ConfigurationException e) { LoggingUtils.logExceptionAsWarning(LOGGER, "Couldn't load work item count", e); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java index 8962aefa2e2..08a772e7372 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/data/BaseSortableDataProvider.java @@ -27,6 +27,7 @@ import com.evolveum.midpoint.prism.query.OrderDirection; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SchemaConstantsGenerated; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.result.OperationResult; @@ -116,6 +117,11 @@ protected PrismContext getPrismContext() { return application.getPrismContext(); } + protected RelationRegistry getRelationRegistry() { + MidPointApplication application = MidPointApplication.get(); + return application.getRelationRegistry(); + } + protected TaskService getTaskService() { MidPointApplication application = MidPointApplication.get(); return application.getTaskService(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java index c4d5f613c01..4648b729b2a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/cases/PageCaseWorkItems.java @@ -142,7 +142,7 @@ private ObjectQuery createQuery() throws SchemaException, ObjectNotFoundExceptio } else { // not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being) query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()) // TODO MID-3581 + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()) .and().item(CaseWorkItemType.F_CLOSE_TIMESTAMP).isNull().build(); } IsolatedCheckBoxPanel includeClosedCases = (IsolatedCheckBoxPanel) getCaseWorkItemsSearchField(ID_SEARCH_FILTER_INCLUDE_CLOSED_CASES); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java index 6755b01e1a9..6e3c09fb37a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/roles/MemberOperationsHelper.java @@ -158,7 +158,7 @@ public static void initObject public static ObjectQuery createDirectMemberQuery(R targetObject, QName objectType, Collection relations, ObjectViewDto tenant, ObjectViewDto project, PrismContext prismContext) { ObjectQuery query; - // TODO MID-3581 fix the query from the point of relations! + // We assume tenantRef.relation and orgRef.relation are always default ones (see also MID-3581) S_AtomicFilterExit q = QueryBuilder.queryFor(FocusType.class, prismContext) .item(FocusType.F_ASSIGNMENT, AssignmentType.F_TARGET_REF) .ref(createReferenceValuesList(targetObject, relations)); @@ -167,7 +167,7 @@ public static ObjectQuery createDirectMemberQuery(R prismContext).asReferenceValue()); } - if (project != null && project.getObjectType() !=null) { + if (project != null && project.getObjectType() != null) { q = q.and().item(FocusType.F_ASSIGNMENT, AssignmentType.F_ORG_REF).ref(ObjectTypeUtil.createObjectRef(project.getObjectType(), prismContext).asReferenceValue()); } @@ -186,9 +186,8 @@ public static ObjectQuery createDirectMemberQuery(R public static List createReferenceValuesList(R targetObject, Collection relations) { List referenceValuesList = new ArrayList<>(); - relations.stream().forEach(relation -> referenceValuesList.add(createReference(targetObject, relation).asReferenceValue())); + relations.forEach(relation -> referenceValuesList.add(createReference(targetObject, relation).asReferenceValue())); return referenceValuesList; - } public static ObjectQuery createSelectedObjectsQuery(List selectedObjects) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java index bd6c65ed161..ae798ca4427 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/workflow/dto/WorkItemDtoProvider.java @@ -181,11 +181,11 @@ private ObjectQuery createQuery(OperationResult result) throws SchemaException { if (WorkItemsPageType.ALL.equals(workItemsPageType) && authorizedToSeeAll) { return q.build(); } else if (WorkItemsPageType.CLAIMABLE.equals(workItemsPageType)) { - return QueryUtils.filterForGroups(q, currentUserOid(), getRepositoryService(), result).build(); + return QueryUtils.filterForGroups(q, currentUserOid(), getRepositoryService(), getRelationRegistry(), result).build(); } else { // not authorized to see all => sees only allocated to him (not quite what is expected, but sufficient for the time being) - return QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), // TODO MID-3581 - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()).build(); + return QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()).build(); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java index 4ab6f89ca37..e4e3451a81f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/self/PageSelfDashboard.java @@ -288,7 +288,7 @@ private CallableResult> loadWorkItems() { // (Note that the current code is consistent with the other places where work items are displayed.) S_FilterEntryOrEmpty q = QueryBuilder.queryFor(WorkItemType.class, getPrismContext()); ObjectQuery query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getPrismContext()) // TODO MID-3581 + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()) .desc(F_CREATE_TIMESTAMP) .build(); Collection> options = diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java index 34c405bb98d..c04b69ee70b 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/util/ObjectQueryUtil.java @@ -27,6 +27,8 @@ import com.evolveum.midpoint.prism.query.Visitor; import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang.Validate; import org.apache.commons.lang.mutable.MutableBoolean; @@ -38,13 +40,11 @@ import com.evolveum.midpoint.schema.ResourceShadowDiscriminator; import com.evolveum.midpoint.util.DOMUtil; import com.evolveum.midpoint.util.exception.SchemaException; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; -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.prism.xml.ns._public.query_3.QueryType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; import org.jetbrains.annotations.NotNull; +import static java.util.Collections.singleton; import static java.util.Collections.singletonList; import static org.apache.commons.collections4.CollectionUtils.isEmpty; @@ -544,6 +544,23 @@ public static FilterComponents factorOutOrFilter(ObjectFilter filter, ItemPath.. return components; } + // Creates references for querying + public static List createReferences(String oid, RelationKindType kind, + RelationRegistry relationRegistry) { + return createReferences(singleton(oid), kind, relationRegistry); + } + + public static List createReferences(Collection oids, RelationKindType kind, + RelationRegistry relationRegistry) { + List rv = new ArrayList<>(); + for (QName relation : relationRegistry.getAllRelationsFor(kind)) { + for (String oid : oids) { + rv.add(new ObjectReferenceType().oid(oid).relation(relation).asReferenceValue()); + } + } + return rv; + } + /** * Describes how to treat a filter when factoring out a query/filter. */ diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java index 7ff40838c23..084b7c5deea 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertQueryHelper.java @@ -24,6 +24,7 @@ import com.evolveum.midpoint.prism.query.builder.QueryBuilder; import com.evolveum.midpoint.repo.api.RepositoryService; import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.RelationRegistry; import com.evolveum.midpoint.schema.SelectorOptions; import com.evolveum.midpoint.schema.constants.SchemaConstants; import com.evolveum.midpoint.schema.result.OperationResult; @@ -54,6 +55,7 @@ public class AccCertQueryHelper { private static final transient Trace LOGGER = TraceManager.getTrace(AccCertQueryHelper.class); @Autowired private PrismContext prismContext; + @Autowired private RelationRegistry relationRegistry; @Autowired protected AccCertGeneralHelper helper; @Autowired @Qualifier("cacheRepositoryService") private RepositoryService repositoryService; @@ -139,7 +141,7 @@ private ObjectFilter getReviewerAndEnabledFilterForWI(MidPointPrincipal principa QueryBuilder.queryFor(AccessCertificationWorkItemType.class, prismContext), principal, OtherPrivilegesLimitationType.F_CERTIFICATION_WORK_ITEMS, - prismContext) // TODO MID-3581 + relationRegistry) .and().item(F_CLOSE_TIMESTAMP).isNull() .buildFilter(); } else { diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java index d1c3f3bb8f1..009bd8e332e 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java @@ -30,6 +30,7 @@ import com.evolveum.midpoint.schema.constants.ExpressionConstants; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.CertCampaignTypeUtil; +import com.evolveum.midpoint.schema.util.ObjectQueryUtil; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.schema.util.ResourceTypeUtil; import com.evolveum.midpoint.task.api.Task; @@ -131,11 +132,15 @@ private void resolveRoleReviewers(List reviewers, Operation private List getMembers(ObjectReferenceType abstractRoleRef, OperationResult result) throws SchemaException { - ObjectQuery query = QueryBuilder.queryFor(UserType.class, prismContext) - .item(UserType.F_ROLE_MEMBERSHIP_REF).ref(abstractRoleRef.getOid()) - .build(); + Collection references = ObjectQueryUtil + .createReferences(abstractRoleRef.getOid(), RelationKindType.MEMBERSHIP, relationRegistry); + ObjectQuery query = references.isEmpty() + ? QueryBuilder.queryFor(UserType.class, prismContext).none().build() + : QueryBuilder.queryFor(UserType.class, prismContext) + .item(UserType.F_ROLE_MEMBERSHIP_REF).ref(references) + .build(); return repositoryService.searchObjects(UserType.class, query, null, result).stream() - .map(obj -> ObjectTypeUtil.createObjectRef(obj, prismContext)) // TODO MID-3581 + .map(obj -> ObjectTypeUtil.createObjectRef(obj, prismContext)) .collect(Collectors.toList()); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java index 3daa840b655..1c51086a69c 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/sync/ReconciliationTaskHandler.java @@ -553,7 +553,7 @@ private boolean performShadowReconciliation(final PrismObject reso .item(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP).le(XmlTypeConverter.createXMLGregorianCalendar(startTimestamp)) .or().item(ShadowType.F_FULL_SYNCHRONIZATION_TIMESTAMP).isNull() .endBlock() - .and().item(ShadowType.F_RESOURCE_REF).ref(ObjectTypeUtil.createObjectRef(resource, prismContext).asReferenceValue()) // TODO MID-3581 + .and().item(ShadowType.F_RESOURCE_REF).ref(ObjectTypeUtil.createObjectRef(resource, prismContext).asReferenceValue()) .and().item(ShadowType.F_OBJECT_CLASS).eq(objectclassDef.getTypeName()) .build(); diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java index 811f5d6ecc3..3a4c4ed04ce 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java @@ -17,12 +17,13 @@ package com.evolveum.midpoint.wf.util; import com.evolveum.midpoint.model.api.util.DeputyUtils; -import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismReferenceValue; import com.evolveum.midpoint.prism.query.builder.S_AtomicFilterExit; import com.evolveum.midpoint.prism.query.builder.S_FilterEntryOrEmpty; import com.evolveum.midpoint.prism.query.builder.S_FilterExit; import com.evolveum.midpoint.repo.api.RepositoryService; +import com.evolveum.midpoint.schema.RelationRegistry; +import com.evolveum.midpoint.schema.constants.ObjectTypes; import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.schema.util.ObjectTypeUtil; import com.evolveum.midpoint.security.api.DelegatorWithOtherPrivilegesLimitations; @@ -50,35 +51,37 @@ public class QueryUtils { * * Note that work item limitations are supported only in the current (crude) form: all or none. */ - // TODO consider other default relations here!!! MID-3851 public static S_AtomicFilterExit filterForAssignees(S_FilterEntryOrEmpty q, MidPointPrincipal principal, - QName limitationItemName, PrismContext prismContext) { + QName limitationItemName, RelationRegistry relationRegistry) { if (principal == null) { return q.none(); } else { - return q.item(WorkItemType.F_ASSIGNEE_REF).ref(getPotentialAssigneesForUser(principal, limitationItemName, prismContext)); + return q.item(WorkItemType.F_ASSIGNEE_REF).ref(getPotentialAssigneesForUser(principal, limitationItemName, relationRegistry)); } } - public static S_FilterExit filterForGroups(S_FilterEntryOrEmpty q, String userOid, RepositoryService repositoryService, OperationResult result) + public static S_FilterExit filterForGroups(S_FilterEntryOrEmpty q, String userOid, RepositoryService repositoryService, + RelationRegistry relationRegistry, OperationResult result) throws SchemaException { - return q.item(WorkItemType.F_CANDIDATE_REF).ref(getGroupsForUser(userOid, repositoryService, result)); + return q.item(WorkItemType.F_CANDIDATE_REF).ref(getGroupsForUser(userOid, repositoryService, relationRegistry, result)); } private static List getPotentialAssigneesForUser(MidPointPrincipal principal, - QName limitationItemName, PrismContext prismContext) { + QName limitationItemName, RelationRegistry relationRegistry) { + // As for relations, WorkItem.assigneeRef should contain only the default ones. + QName defaultRelation = relationRegistry.getDefaultRelation(); List rv = new ArrayList<>(); - rv.add(new PrismReferenceValue(principal.getOid(), UserType.COMPLEX_TYPE)); + rv.add(ObjectTypeUtil.createObjectRef(principal.getOid(), ObjectTypes.USER).relation(defaultRelation).asReferenceValue()); for (DelegatorWithOtherPrivilegesLimitations delegator : principal.getDelegatorWithOtherPrivilegesLimitationsCollection()) { if (DeputyUtils.limitationsAllow(delegator.getLimitations(), limitationItemName)) { - rv.add(ObjectTypeUtil.createObjectRef(delegator.getDelegator(), prismContext).asReferenceValue()); + rv.add(ObjectTypeUtil.createObjectRef(delegator.getDelegator(), defaultRelation).asReferenceValue()); } } return rv; } private static List getGroupsForUser(String userOid, RepositoryService repositoryService, - OperationResult result) throws SchemaException { + RelationRegistry relationRegistry, OperationResult result) throws SchemaException { List rv = new ArrayList<>(); UserType userType; try { @@ -86,14 +89,13 @@ private static List getGroupsForUser(String userOid, Reposi } catch (ObjectNotFoundException e) { return rv; } - userType.getRoleMembershipRef().forEach(ref -> rv.add(ref.clone().asReferenceValue())); - userType.getDelegatedRef().forEach(ref -> - { - if (!QNameUtil.match(ref.getType(), UserType.COMPLEX_TYPE)) { - rv.add(ref.clone().asReferenceValue()); - } - } - ); + userType.getRoleMembershipRef().stream() + .filter(ref -> relationRegistry.isMembership(ref.getRelation())) + .forEach(ref -> rv.add(ref.clone().asReferenceValue())); + userType.getDelegatedRef().stream() + .filter(ref -> relationRegistry.isMembership(ref.getRelation())) + .filter(ref -> !QNameUtil.match(ref.getType(), UserType.COMPLEX_TYPE)) // we are not interested in deputies (but this should be treated above) + .forEach(ref -> rv.add(ref.clone().asReferenceValue())); return rv; } diff --git a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java index 6b50cfe056a..2c8d59208f0 100644 --- a/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java +++ b/model/workflow-impl/src/test/java/com/evolveum/midpoint/wf/impl/policy/AbstractWfTestPolicy.java @@ -1029,7 +1029,7 @@ protected void checkVisibleWorkItem(ExpectedWorkItem expectedWorkItem, int count throws SchemaException, ObjectNotFoundException, ConfigurationException, SecurityViolationException, ExpressionEvaluationException, CommunicationException { S_AtomicFilterExit q = QueryUtils .filterForAssignees(QueryBuilder.queryFor(WorkItemType.class, prismContext), SecurityUtil.getPrincipal(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, prismContext); // TODO MID-3581 + OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, relationRegistry); List currentWorkItems = modelService.searchContainers(WorkItemType.class, q.build(), null, task, result); long found = currentWorkItems.stream().filter(wi -> expectedWorkItem == null || expectedWorkItem.matches(wi)).count(); assertEquals("Wrong # of matching work items", count, found); From 6f052571d1d406beb89e80b02838f0415ed2d749 Mon Sep 17 00:00:00 2001 From: Katarina Valalikova Date: Mon, 10 Sep 2018 20:24:12 +0200 Subject: [PATCH 04/12] fix for "dist" init --- .../midpoint/web/boot/MidPointSpringApplication.java | 9 ++++++++- .../evolveum/midpoint/web/boot/WebSecurityConfig.java | 5 ----- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java index bc83a2da1ad..450502f56d5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java @@ -47,6 +47,7 @@ import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; import org.springframework.boot.web.server.ErrorPage; +import org.springframework.boot.web.server.ErrorPageRegistrar; import org.springframework.boot.web.server.WebServerFactoryCustomizer; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; @@ -186,7 +187,7 @@ public ServletListenerRegistrationBean requestContextLis public FilterRegistrationBean midPointProfilingServletFilter() { FilterRegistrationBean registration = new FilterRegistrationBean<>(); registration.setFilter(new MidPointProfilingServletFilter()); - registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); +// registration.setDispatcherTypes(EnumSet.allOf(DispatcherType.class)); registration.addUrlPatterns("/*"); return registration; } @@ -251,6 +252,12 @@ public ServletRegistrationBean staticWebServlet() { return registration; } + @Bean + public ErrorPageRegistrar errorPageRegistrar() { + return new MidPointErrorPageRegistrar(); + } + + @Component public class ServerCustomization implements WebServerFactoryCustomizer { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java index fc12e26c461..c121f7d93c2 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java @@ -162,11 +162,6 @@ protected void configure(HttpSecurity http) throws Exception { } } - @Bean - public ErrorPageRegistrar errorPageRegistrar() { - return new MidPointErrorPageRegistrar(); - } - @Bean @Override protected AuthenticationManager authenticationManager() throws Exception { From 9bbec816faffb401b1a9c2de657cf14cb2eed27a Mon Sep 17 00:00:00 2001 From: Viliam Repan Date: Mon, 10 Sep 2018 21:46:38 +0200 Subject: [PATCH 05/12] MID-4559 MID-4826 client abort exceptions, logging improved --- .../web/util/MidPointProfilingServletFilter.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java index c81e994e350..66e4653a720 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/util/MidPointProfilingServletFilter.java @@ -20,6 +20,7 @@ import com.evolveum.midpoint.util.aspect.ProfilingDataManager; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import org.apache.catalina.connector.ClientAbortException; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; @@ -68,7 +69,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha try { chain.doFilter(request, response); } catch (IOException | ServletException | RuntimeException | Error e) { - LOGGER.debug("Encountered exception: {}: {}", e.getClass().getName(), e.getMessage(), e); + logException(e); throw e; } @@ -85,7 +86,7 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha try { chain.doFilter(request, response); } catch (IOException | ServletException | RuntimeException | Error e) { - LOGGER.debug("Encountered exception: {}: {}", e.getClass().getName(), e.getMessage(), e); + logException(e); throw e; } } @@ -99,5 +100,15 @@ private void prepareRequestProfilingEvent(ServletRequest request, long elapsed, ProfilingDataManager.getInstance().prepareRequestProfilingEvent(event); } + private void logException(Throwable t) throws IOException, ServletException { + if (t instanceof ClientAbortException) { + if (LOGGER.isDebugEnabled()) { + // client abort exceptions are quite OK as they are not an application/server problem + LOGGER.debug("Encountered exception: {}: {}", t.getClass().getName(), t.getMessage(), t); + } + return; + } + LOGGER.error("Encountered exception: {}: {}", t.getClass().getName(), t.getMessage(), t); + } } From dbf9df79f2acaec54c29096ac8bb27fa0ec0028c Mon Sep 17 00:00:00 2001 From: skublik Date: Tue, 11 Sep 2018 07:53:12 +0200 Subject: [PATCH 06/12] creating of health endpoint --- gui/admin-gui/pom.xml | 5 ++++ .../web/boot/MidPointSpringApplication.java | 27 +++++++++++++++++-- .../midpoint/web/boot/WebSecurityConfig.java | 3 +++ .../component/prism/ContainerValuePanel.java | 2 +- .../component/prism/PrismContainerPanel.java | 4 +++ .../src/main/resources/application.yml | 12 ++++++++- 6 files changed, 49 insertions(+), 4 deletions(-) diff --git a/gui/admin-gui/pom.xml b/gui/admin-gui/pom.xml index 973bf361966..33d8992f796 100644 --- a/gui/admin-gui/pom.xml +++ b/gui/admin-gui/pom.xml @@ -145,6 +145,11 @@ org.apache.cxf cxf-rt-transports-http + + + org.springframework.boot + spring-boot-starter-actuator + org.webjars diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java index fddb1940419..1487119ba27 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java @@ -35,6 +35,17 @@ import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.web.mappings.MappingsEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration; +import org.springframework.boot.actuate.endpoint.EndpointFilter; +import org.springframework.boot.actuate.endpoint.ExposableEndpoint; +import org.springframework.boot.actuate.endpoint.web.EndpointServlet; +import org.springframework.boot.actuate.endpoint.web.annotation.ServletEndpointDiscoverer; +import org.springframework.boot.actuate.health.HealthEndpoint; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; import org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration; @@ -62,6 +73,7 @@ import ro.isdc.wro.http.WroFilter; import javax.servlet.DispatcherType; +import javax.servlet.Servlet; import java.io.File; import java.lang.management.ManagementFactory; @@ -103,7 +115,10 @@ PropertyPlaceholderAutoConfiguration.class, SecurityFilterAutoConfiguration.class, MultipartAutoConfiguration.class, - HttpEncodingAutoConfiguration.class + HttpEncodingAutoConfiguration.class, + WebEndpointAutoConfiguration.class, + ServletManagementContextAutoConfiguration.class, + HealthEndpointAutoConfiguration.class }) @SpringBootConfiguration public class MidPointSpringApplication extends SpringBootServletInitializer { @@ -206,7 +221,7 @@ public FilterRegistrationBean springSecurityFilterChain() { registration.addUrlPatterns("/*"); return registration; } - + @Bean public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) { FilterRegistrationBean registration = new FilterRegistrationBean(); @@ -214,6 +229,14 @@ public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilter) { registration.addUrlPatterns("/wro/*"); return registration; } + +// @Bean +// public ServletRegistrationBean actuatorServlet(Servlet endpointServlet ) { +// ServletRegistrationBean registration = new ServletRegistrationBean(); +// registration.setServlet(endpointServlet); +// registration.addUrlMappings("/actuator/*"); +// return registration; +// } @Bean public ServletRegistrationBean cxfServlet() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java index d2e12f5a3f5..fba6fbbf773 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java @@ -107,6 +107,9 @@ public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/less/**"); web.ignoring().antMatchers("/wicket/resource/**"); + + web.ignoring().antMatchers("/health"); + web.ignoring().antMatchers("/actuator/**"); } @Override diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java index c7ef4d59459..561686d4ed9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/ContainerValuePanel.java @@ -135,7 +135,7 @@ public boolean isVisible() { } - private boolean hasAnyProperty() { + public boolean hasAnyProperty() { for(ItemWrapper item : getModelObject().getItems()) { if(item instanceof PropertyOrReferenceWrapper) { return true; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java index b560f9da880..6a8df89c777 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/prism/PrismContainerPanel.java @@ -250,6 +250,10 @@ public String getObject() { if(((ContainerValueWrapper)item.getModelObject()).getContainer() !=null && ((ContainerValueWrapper)item.getModelObject()).getContainer().isShowOnTopLevel()) { item.add(AttributeModifier.append("class", "top-level-prism-container")); } + + if(!containerPanel.hasAnyProperty()) { + item.add(AttributeModifier.append("style", " border-top: none; padding-top: 0px; ")); + } } diff --git a/gui/admin-gui/src/main/resources/application.yml b/gui/admin-gui/src/main/resources/application.yml index 03cf6fdb5c5..710f8cf5bed 100644 --- a/gui/admin-gui/src/main/resources/application.yml +++ b/gui/admin-gui/src/main/resources/application.yml @@ -46,4 +46,14 @@ auth: # enable-csrf: false # default for midpoint is true # more properties with default values can be found here: -# https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html \ No newline at end of file +# https://docs.spring.io/spring-boot/docs/current/reference/html/common-application-properties.html + +management: + endpoint: + health: + enabled: true + + +logging: + level: + org.springframework: TRACE \ No newline at end of file From 61be67421faa33c20409f581c798d113a5ec8d58 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Sep 2018 10:32:03 +0200 Subject: [PATCH 07/12] Add some relation-related documentation (MID-3581) ...and minor code changes. --- .../refinery/RelationRegistryDummyImpl.java | 27 +----- .../midpoint/schema/RelationRegistry.java | 96 ++++++++++++++++--- .../schema/relation/RelationRegistryImpl.java | 25 ----- .../xml/ns/public/common/common-core-3.xsd | 4 - 4 files changed, 82 insertions(+), 70 deletions(-) diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java index 375fd18c739..cf13c829e5b 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java @@ -53,31 +53,6 @@ public boolean isOfKind(QName relation, RelationKindType kind) { return kind == RelationKindType.MEMBERSHIP && (relation == null || QNameUtil.match(relation, ORG_DEFAULT)); } - @Override - public boolean isManager(QName relation) { - return false; - } - - @Override - public boolean isDelegation(QName relation) { - return false; - } - - @Override - public boolean isMembership(QName relation) { - return isOfKind(relation, RelationKindType.MEMBERSHIP); - } - - @Override - public boolean isOwner(QName relation) { - return false; - } - - @Override - public boolean isApprover(QName relation) { - return false; - } - @Override public boolean processRelationOnLogin(QName relation) { return false; @@ -116,7 +91,7 @@ public QName normalizeRelation(QName relation) { } @Override - public void applyRelationConfiguration(SystemConfigurationType relationsDefinition) { + public void applyRelationConfiguration(SystemConfigurationType systemConfiguration) { } @Override diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java index 8179135b910..450039dc2b9 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java @@ -20,64 +20,130 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.RelationKindType; import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import javax.xml.namespace.QName; import java.util.Collection; import java.util.List; /** - * TODO think about precise place of this interface + * A component that holds current definition of object relations. * * @author mederly */ public interface RelationRegistry { + /** + * Returns all relation definitions: explicitly specified as well as built-in ones. + * Invalid or duplicate definitions are filtered out and not mentioned here. + * + * Each relation is listed only once even if it can be referenced using various QNames (e.g. null, default, org:default). + */ List getRelationDefinitions(); - RelationDefinitionType getRelationDefinition(QName relation); - - // SchemaException is thrown as SystemException as it really should not occur + /** + * Returns a relation definition for a specified relation name. + * The relation name need not be normalized, i.e. all names for a relation might be used here + * (e.g. null, default, org:default); resulting in the same definition. + * + * Returns null if the definition cannot be found. + */ + @Nullable RelationDefinitionType getRelationDefinition(QName relation); + /** + * Returns true if the relation is of specified kind. The relation name need not be normalized. + */ boolean isOfKind(QName relation, RelationKindType kind); - boolean isManager(QName relation); + default boolean isMembership(QName relation) { + return isOfKind(relation, RelationKindType.MEMBERSHIP); + } - boolean isDelegation(QName relation); + default boolean isManager(QName relation) { + return isOfKind(relation, RelationKindType.MANAGER); + } - boolean isMembership(QName relation); + default boolean isDelegation(QName relation) { + return isOfKind(relation, RelationKindType.DELEGATION); + } - boolean isOwner(QName relation); + @SuppressWarnings("unused") + default boolean isApprover(QName relation) { + return isOfKind(relation, RelationKindType.APPROVER); + } - boolean isApprover(QName relation); + @SuppressWarnings("unused") + default boolean isOwner(QName relation) { + return isOfKind(relation, RelationKindType.OWNER); + } + /** + * Whether this kind of relations is processed on login. Currently only relations of MEMBERSHIP and DELEGATION kinds are. + * This is to be configured in the future (MID-3581). + */ boolean processRelationOnLogin(QName relation); + /** + * Whether this kind of relations is processed on recompute. Currently only relations of MEMBERSHIP, MANAGER and DELEGATION kinds are. + * This is to be configured in the future (MID-3581). + */ boolean processRelationOnRecompute(QName relation); + /** + * Whether this kind of relations is included in parentOrgRef. Currently only relations of MEMBERSHIP but *not* META kinds are. + * This is to be configured in the future (MID-3581). + */ boolean includeIntoParentOrgRef(QName relation); + /** + * Returns the default relation i.e. the one that is equivalent to the null relation name. + * Please do NOT use this information for queries nor determining the behavior of the relation! Use relation kinds instead. + */ QName getDefaultRelation(); + /** + * Checks whether the relation is equivalent to the default one. + * Please do NOT use this information for determining the behavior of the relation! Use relation kinds instead. + */ + boolean isDefault(QName relation); + + /** + * Returns all relations of a given kind. Note that the result might be an empty set; although it is a bad practice to + * configure midPoint in that way. Unused relations are better hidden using categories. + */ @NotNull Collection getAllRelationsFor(RelationKindType kind); - QName getDefaultRelationFor(RelationKindType kind); + /** + * Returns the default relation for a given kind. The result might be a null value; although it is a bad practice to + * configure midPoint in that way. Unused relations are better hidden using categories. + */ + @Nullable QName getDefaultRelationFor(RelationKindType kind); + /** + * Returns a normalized relation name, i.e. the one that is used in the "ref" item on the definition. It should be qualified + * (so please DO NOT use unqualified relation names in the definitions!) + * + * If the relation is unknown, the relation name is returned unchanged. + */ @NotNull QName normalizeRelation(QName relation); - void applyRelationConfiguration(SystemConfigurationType relationsDefinition); - - boolean isDefault(QName relation); + /** + * This method should be called whenever midPoint determines that the relations definition in system configuration might + * have been changed. + */ + void applyRelationConfiguration(SystemConfigurationType systemConfiguration); /** * Returns aliases of a relation. Currently these are: - * - unnormalized version of the relation QNme + * - unqualified version of the relation QName * - null if the relation is the default one * + * -- * In the future we might return some other values (e.g. explicitly configured aliases) as well. * But we would need to adapt prismContext.relationsEquivalent method and other comparison methods as well. - * It is perhaps not worth the effort. + * So it is perhaps not worth the effort. */ @NotNull Collection getAliases(QName relation); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java index f1455e777dc..fc0ba3dd888 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java @@ -124,31 +124,6 @@ public boolean isOfKind(QName relation, RelationKindType kind) { return indexedRelationDefinitions.isOfKind(relation, kind); } - @Override - public boolean isMembership(QName relation) { - return isOfKind(relation, RelationKindType.MEMBERSHIP); - } - - @Override - public boolean isManager(QName relation) { - return isOfKind(relation, RelationKindType.MANAGER); - } - - @Override - public boolean isDelegation(QName relation) { - return isOfKind(relation, RelationKindType.DELEGATION); - } - - @Override - public boolean isOwner(QName relation) { - return isOfKind(relation, RelationKindType.OWNER); - } - - @Override - public boolean isApprover(QName relation) { - return isOfKind(relation, RelationKindType.APPROVER); - } - @Override public boolean processRelationOnLogin(QName relation) { return indexedRelationDefinitions.processRelationOnLogin(relation); diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 49f58266f8f..004b6b57f82 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -16319,7 +16319,6 @@ Membership relation, usually meaning "has" or "is member of". - Used as a relation value in object references. Specifies that the subject is a member of organization, or that the subject has been assigned a role in a way that he gets authorizations and other content provided by that role. @@ -16378,9 +16377,6 @@ a rule conflict during assignment (e.g. SoD conflict) or if there is any similar situation. - This is a generic approver used for all the situation. The system may be customized - with more specific approver roles, e.g. technicalApprover, securityApprover, etc. - This approver is responsible for the use of the role, which mostly means that he decides about role assignment. It is NOT meant to approve role changes. Role owner is meant for that purpose. From ebe7d47da4515decf4c14c15c9008b6ab5495f19 Mon Sep 17 00:00:00 2001 From: skublik Date: Tue, 11 Sep 2018 10:43:52 +0200 Subject: [PATCH 08/12] MID-4849 --- gui/admin-gui/pom.xml | 4 ++++ .../web/boot/MidPointSpringApplication.java | 19 ++++++++++--------- .../midpoint/web/boot/WebSecurityConfig.java | 1 - .../src/main/resources/application.yml | 6 +++--- 4 files changed, 17 insertions(+), 13 deletions(-) diff --git a/gui/admin-gui/pom.xml b/gui/admin-gui/pom.xml index 33d8992f796..5a9b6c58e7d 100644 --- a/gui/admin-gui/pom.xml +++ b/gui/admin-gui/pom.xml @@ -150,6 +150,10 @@ org.springframework.boot spring-boot-starter-actuator + + org.springframework.boot + spring-boot-actuator-autoconfigure + org.webjars diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java index ffd9a69d0ce..054dbe32b33 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/MidPointSpringApplication.java @@ -19,6 +19,7 @@ import java.io.File; import java.lang.management.ManagementFactory; import java.time.Duration; +import java.util.Arrays; import javax.servlet.DispatcherType; @@ -30,11 +31,15 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.Banner; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.ExitCodeGenerator; import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringBootConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.EndpointAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.endpoint.web.WebEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet.WebMvcEndpointManagementContextConfiguration; import org.springframework.boot.actuate.autoconfigure.health.HealthEndpointAutoConfiguration; +import org.springframework.boot.actuate.autoconfigure.health.HealthIndicatorAutoConfiguration; import org.springframework.boot.actuate.autoconfigure.web.servlet.ServletManagementContextAutoConfiguration; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration; @@ -57,6 +62,7 @@ import org.springframework.boot.web.servlet.server.ConfigurableServletWebServerFactory; import org.springframework.boot.web.servlet.server.Session; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ImportResource; @@ -112,9 +118,12 @@ SecurityFilterAutoConfiguration.class, MultipartAutoConfiguration.class, HttpEncodingAutoConfiguration.class, + EndpointAutoConfiguration.class, WebEndpointAutoConfiguration.class, + WebMvcEndpointManagementContextConfiguration.class, ServletManagementContextAutoConfiguration.class, - HealthEndpointAutoConfiguration.class + HealthEndpointAutoConfiguration.class, + HealthIndicatorAutoConfiguration.class }) @SpringBootConfiguration public class MidPointSpringApplication extends SpringBootServletInitializer { @@ -227,14 +236,6 @@ public FilterRegistrationBean webResourceOptimizer(WroFilter wroFilte return registration; } -// @Bean -// public ServletRegistrationBean actuatorServlet(Servlet endpointServlet ) { -// ServletRegistrationBean registration = new ServletRegistrationBean(); -// registration.setServlet(endpointServlet); -// registration.addUrlMappings("/actuator/*"); -// return registration; -// } - @Bean public ServletRegistrationBean cxfServlet() { ServletRegistrationBean registration = new ServletRegistrationBean<>(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java index a5a1217f7da..cee464a712c 100755 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/boot/WebSecurityConfig.java @@ -109,7 +109,6 @@ public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/wicket/resource/**"); - web.ignoring().antMatchers("/health"); web.ignoring().antMatchers("/actuator/**"); } diff --git a/gui/admin-gui/src/main/resources/application.yml b/gui/admin-gui/src/main/resources/application.yml index 710f8cf5bed..a26e0492aaf 100644 --- a/gui/admin-gui/src/main/resources/application.yml +++ b/gui/admin-gui/src/main/resources/application.yml @@ -54,6 +54,6 @@ management: enabled: true -logging: - level: - org.springframework: TRACE \ No newline at end of file +#logging: +# level: +# org.springframework: TRACE \ No newline at end of file From 52621e173d334c783e98e09e377192a4532286ef Mon Sep 17 00:00:00 2001 From: kate Date: Tue, 11 Sep 2018 11:31:11 +0200 Subject: [PATCH 09/12] MID-4851 checkbox selecting in the popup fix --- .../gui/api/component/AssignmentPopup.java | 13 ++--- .../gui/api/component/ChooseMemberPopup.java | 57 +++++++++++++++++-- .../FocusTypeAssignmentPopupTabPanel.java | 2 +- .../midpoint/web/component/TabbedPanel.java | 20 ++++++- 4 files changed, 74 insertions(+), 18 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java index 74413e5f017..eba525a2e2a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/AssignmentPopup.java @@ -22,6 +22,7 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.component.dialog.Popupable; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; import com.evolveum.midpoint.web.component.util.VisibleBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; @@ -107,14 +108,7 @@ public void onClick(AjaxRequestTarget target) { } }; addButton.add(AttributeAppender.append("title", getAddButtonTitleModel())); - addButton.add(new VisibleEnableBehaviour(){ - private static final long serialVersionUID = 1L; - - @Override - public boolean isEnabled(){ - return isAssignButtonEnabled(); - } - }); + addButton.add(new EnableBehaviour(() -> isAssignButtonEnabled())); addButton.setOutputMarkupId(true); form.add(addButton); } @@ -289,7 +283,8 @@ private int getTabPanelSelectedCount(WebMarkupContainer panel){ } private void tabLabelPanelUpdate(AjaxRequestTarget target){ - target.add(AssignmentPopup.this); + getTabbedPanel().reloadCountLabels(target); + target.add(get(ID_FORM).get(ID_ASSIGN_BUTTON)); } private TabbedPanel getTabbedPanel(){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java index 13be8bd381e..d45f9800cb8 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/ChooseMemberPopup.java @@ -16,6 +16,7 @@ package com.evolveum.midpoint.gui.api.component; import com.evolveum.midpoint.gui.api.component.tabs.CountablePanelTab; +import com.evolveum.midpoint.gui.api.model.LoadableModel; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.delta.ObjectDelta; import com.evolveum.midpoint.prism.query.InOidFilter; @@ -32,13 +33,16 @@ import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.TabbedPanel; import com.evolveum.midpoint.web.component.dialog.Popupable; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.form.Form; +import org.apache.wicket.model.IModel; import org.apache.wicket.model.StringResourceModel; import javax.xml.namespace.QName; @@ -100,19 +104,34 @@ public void onClick(AjaxRequestTarget target) { @Override public void onClick(AjaxRequestTarget target) { - tabs.forEach(panelTab -> { + boolean orgPanelProcessed = false; + for (ITab panelTab : tabs){ WebMarkupContainer tabPanel = ((CountablePanelTab)panelTab).getPanel(); if (tabPanel == null){ - return; + continue; } - MemberPopupTabPanel memberPanel = (MemberPopupTabPanel) tabPanel; - executeMemberOperation(memberPanel.getObjectType().getTypeQName(), createInOidQuery(memberPanel.getSelectedObjectsList()), + if (memberPanel.getObjectType().equals(ObjectTypes.ORG) && orgPanelProcessed){ + continue; + } + List selectedObjects = memberPanel.getObjectType().equals(ObjectTypes.ORG) ? memberPanel.getPreselectedObjects() : + memberPanel.getSelectedObjectsList(); + + if (selectedObjects == null || selectedObjects.size() == 0){ + continue; + } + executeMemberOperation(memberPanel.getObjectType().getTypeQName(), + createInOidQuery(selectedObjects), memberPanel.prepareDelta(), target); - }); + if (memberPanel.getObjectType().equals(ObjectTypes.ORG)){ + orgPanelProcessed = true; + } + } ChooseMemberPopup.this.getPageBase().hideMainPopup(target); } }; + addButton.add(AttributeAppender.append("title", getAddButtonTitleModel())); + addButton.add(new EnableBehaviour(() -> isAddButtonEnabled())); addButton.setOutputMarkupId(true); form.add(addButton); } @@ -304,7 +323,9 @@ protected int getTabPanelSelectedCount(WebMarkupContainer panel){ } protected void tabLabelPanelUpdate(AjaxRequestTarget target){ - target.add(getTabbedPanel()); + getTabbedPanel().reloadCountLabels(target); + target.add(get(ID_FORM).get(ID_ADD_BUTTON)); + } private TabbedPanel getTabbedPanel(){ @@ -320,6 +341,30 @@ protected ObjectQuery createInOidQuery(List selectedObjectsList){ return ObjectQuery.createObjectQuery(InOidFilter.createInOid(oids)); } + private IModel getAddButtonTitleModel(){ + return new LoadableModel(true) { + @Override + protected String load() { + return !isAddButtonEnabled() ? createStringResource("AssignmentPopup.addButtonTitle").getString() : ""; + } + }; + } + + private boolean isAddButtonEnabled(){ + TabbedPanel tabbedPanel = getTabbedPanel(); + List tabs = (List) tabbedPanel.getTabs().getObject(); + for (ITab tab : tabs){ + WebMarkupContainer memberPanel = ((CountablePanelTab)tab).getPanel(); + if (memberPanel == null){ + continue; + } + if (((MemberPopupTabPanel) memberPanel).getSelectedObjectsList().size() > 0) { + return true; + } + } + return false; + } + protected void executeMemberOperation(QName type, ObjectQuery memberQuery, ObjectDelta delta, AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java index bbd01f16526..bfb8a6736db 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/FocusTypeAssignmentPopupTabPanel.java @@ -74,7 +74,7 @@ private List getSupportedRelations() { protected Map getSelectedAssignmentsMap(){ Map assignmentsMap = new HashedMap(); - List selectedObjects = getSelectedObjectsList(); + List selectedObjects = getObjectType().equals(ObjectTypes.ORG) ? getPreselectedObjects() : getSelectedObjectsList(); QName relation = getRelationValue(); selectedObjects.forEach(selectedObject -> { assignmentsMap.put(selectedObject.getOid(), ObjectTypeUtil.createAssignmentTo(selectedObject, relation)); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java index 9e336e81182..19f0050460a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/TabbedPanel.java @@ -19,6 +19,7 @@ import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.WicketRuntimeException; +import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.extensions.markup.html.tabs.ITab; import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; @@ -37,6 +38,7 @@ import com.evolveum.midpoint.gui.api.model.CountModelProvider; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; /** @@ -49,6 +51,8 @@ public class TabbedPanel extends Panel { * id used for child panels */ public static final String TAB_PANEL_ID = "panel"; + public static final String ID_TABS_CONTAINER = "tabs-container"; + public static final String ID_TABS = "tabs"; public static final String RIGHT_SIDE_TAB_ITEM_ID = "rightSideTabItem"; public static final String RIGHT_SIDE_TAB_ID = "rightSideTab"; @@ -106,11 +110,11 @@ public Integer getObject() { } }; - WebMarkupContainer tabsContainer = newTabsContainer("tabs-container"); + WebMarkupContainer tabsContainer = newTabsContainer(ID_TABS_CONTAINER); add(tabsContainer); // add the loop used to generate tab names - tabsContainer.add(new Loop("tabs", tabCount) { + tabsContainer.add(new Loop(ID_TABS, tabCount) { private static final long serialVersionUID = 1L; @Override @@ -131,6 +135,7 @@ protected void populateItem(final LoopItem item) { } Label countLabel = new Label(ID_COUNT, countModel); countLabel.setVisible(countModel != null); + countLabel.setOutputMarkupId(true); countLabel.add(AttributeModifier.append("class", new AbstractReadOnlyModel() { private static final long serialVersionUID = 1L; @@ -492,4 +497,15 @@ protected void onTabChange(int index) {} public interface RightSideItemProvider extends Serializable { Component createRightSideItem(String id); } + + public void reloadCountLabels(AjaxRequestTarget target){ + Loop tabbedPanel = ((Loop)get(ID_TABS_CONTAINER).get(ID_TABS)); + int tabsCount = tabbedPanel.getIterations(); + for (int i = 0; i < tabsCount; i++){ + Component countLabel = tabbedPanel.get(Integer.toString(i)).get(ID_LINK).get(ID_COUNT); + if (countLabel != null) { + target.add(countLabel); + } + } + } } From 8d76d127d4b4d3050c3f904e0f49ae73f6b61f83 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Sep 2018 15:53:17 +0200 Subject: [PATCH 10/12] Polish dynamic relations (MID-3581) 1. Kind of 'membership' changed to 'member'. 2. 'org:meta' is no longer a 'member'. --- .../refinery/RelationRegistryDummyImpl.java | 6 +++--- .../midpoint/schema/RelationRegistry.java | 14 +++++++++----- .../schema/constants/RelationTypes.java | 6 +++--- .../schema/constants/SchemaConstants.java | 2 +- .../relation/IndexedRelationDefinitions.java | 18 ++++++++++-------- .../schema/relation/RelationRegistryImpl.java | 4 ++-- .../xml/ns/public/common/common-core-3.xsd | 11 ++++------- .../impl/AccCertReviewersHelper.java | 2 +- .../model/impl/lens/EvaluationOrderImpl.java | 4 ++-- .../model/impl/misc/TestRelationRegistry.java | 14 +++++++------- .../evolveum/midpoint/wf/util/QueryUtils.java | 4 ++-- .../midpoint/wf/impl/util/MiscDataUtil.java | 2 +- 12 files changed, 45 insertions(+), 42 deletions(-) diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java index cf13c829e5b..f8ce9000e72 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java @@ -50,7 +50,7 @@ public RelationDefinitionType getRelationDefinition(QName relation) { @Override public boolean isOfKind(QName relation, RelationKindType kind) { - return kind == RelationKindType.MEMBERSHIP && (relation == null || QNameUtil.match(relation, ORG_DEFAULT)); + return kind == RelationKindType.MEMBER && (relation == null || QNameUtil.match(relation, ORG_DEFAULT)); } @Override @@ -76,12 +76,12 @@ public QName getDefaultRelation() { @NotNull @Override public Collection getAllRelationsFor(RelationKindType kind) { - return kind == RelationKindType.MEMBERSHIP ? singletonList(ORG_DEFAULT) : emptyList(); + return kind == RelationKindType.MEMBER ? singletonList(ORG_DEFAULT) : emptyList(); } @Override public QName getDefaultRelationFor(RelationKindType kind) { - return kind == RelationKindType.MEMBERSHIP ? ORG_DEFAULT : null; + return kind == RelationKindType.MEMBER ? ORG_DEFAULT : null; } @NotNull diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java index 450039dc2b9..867a48a57b1 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java @@ -55,14 +55,18 @@ public interface RelationRegistry { */ boolean isOfKind(QName relation, RelationKindType kind); - default boolean isMembership(QName relation) { - return isOfKind(relation, RelationKindType.MEMBERSHIP); + default boolean isMember(QName relation) { + return isOfKind(relation, RelationKindType.MEMBER); } default boolean isManager(QName relation) { return isOfKind(relation, RelationKindType.MANAGER); } + default boolean isMeta(QName relation) { + return isOfKind(relation, RelationKindType.META); + } + default boolean isDelegation(QName relation) { return isOfKind(relation, RelationKindType.DELEGATION); } @@ -78,19 +82,19 @@ default boolean isOwner(QName relation) { } /** - * Whether this kind of relations is processed on login. Currently only relations of MEMBERSHIP and DELEGATION kinds are. + * Whether this kind of relations is processed on login. Currently only relations of MEMBER and DELEGATION kinds are. * This is to be configured in the future (MID-3581). */ boolean processRelationOnLogin(QName relation); /** - * Whether this kind of relations is processed on recompute. Currently only relations of MEMBERSHIP, MANAGER and DELEGATION kinds are. + * Whether this kind of relations is processed on recompute. Currently only relations of MEMBER, MANAGER and DELEGATION kinds are. * This is to be configured in the future (MID-3581). */ boolean processRelationOnRecompute(QName relation); /** - * Whether this kind of relations is included in parentOrgRef. Currently only relations of MEMBERSHIP but *not* META kinds are. + * Whether this kind of relations is included in parentOrgRef. Currently only relations of MEMBER but *not* META kinds are. * This is to be configured in the future (MID-3581). */ boolean includeIntoParentOrgRef(QName relation); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java index a70c494dfd6..12a7c7d6382 100755 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/constants/RelationTypes.java @@ -34,9 +34,9 @@ */ public enum RelationTypes { - MEMBER(SchemaConstants.ORG_DEFAULT, "", RelationKindType.MEMBERSHIP, null, ADMINISTRATION, ORGANIZATION, SELF_SERVICE), - MANAGER(SchemaConstants.ORG_MANAGER, "Manager", RelationKindType.MANAGER, singletonList(RelationKindType.MEMBERSHIP), ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), - META(SchemaConstants.ORG_META, "Meta", RelationKindType.META, singletonList(RelationKindType.MEMBERSHIP), POLICY), + MEMBER(SchemaConstants.ORG_DEFAULT, "", RelationKindType.MEMBER, null, ADMINISTRATION, ORGANIZATION, SELF_SERVICE), + MANAGER(SchemaConstants.ORG_MANAGER, "Manager", RelationKindType.MANAGER, singletonList(RelationKindType.MEMBER), ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), + META(SchemaConstants.ORG_META, "Meta", RelationKindType.META, null, POLICY), DEPUTY(SchemaConstants.ORG_DEPUTY, "Deputy", RelationKindType.DELEGATION, null /* no values */), APPROVER(SchemaConstants.ORG_APPROVER, "Approver", RelationKindType.APPROVER, null, ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), OWNER(SchemaConstants.ORG_OWNER, "Owner", RelationKindType.OWNER, null, ADMINISTRATION, GOVERNANCE, ORGANIZATION, SELF_SERVICE), 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 5abdc08bf1e..c8a58a94d5f 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 @@ -150,7 +150,7 @@ public abstract class SchemaConstants { /** * Default membership relation. Used as a relation value in object references. - * See RelationKind.MEMBERSHIP for more details. + * See RelationKind.MEMBER for more details. */ public static final QName ORG_DEFAULT = new QName(NS_ORG, "default"); diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java index fc4e1b52504..3487ca482a6 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java @@ -108,7 +108,7 @@ class IndexedRelationDefinitions { } private void addDefaultRelationToMaps() { - QName defaultRelation = defaultRelationByKind.get(RelationKindType.MEMBERSHIP); + QName defaultRelation = defaultRelationByKind.get(RelationKindType.MEMBER); if (defaultRelation != null) { relationDefinitionsByRelationName.put(null, relationDefinitionsByRelationName.get(defaultRelation)); kindsByRelationName.putAll(null, kindsByRelationName.get(defaultRelation)); @@ -129,7 +129,7 @@ private void logState() { private List validateDefinitions(@NotNull List definitions) { List validatedDefinitions = new ArrayList<>(definitions.size()); - boolean membershipRelationExists = false; + boolean memberRelationExists = false; for (RelationDefinitionType definition : definitions) { if (definition.getRef() == null) { LOGGER.error("Relation definition with null ref; ignoring: {}", definition); @@ -138,12 +138,12 @@ private List validateDefinitions(@NotNull List computeDefaultRelationByKind() { // We want to make this configurable in the future MID-3581 private Set computeRelationsToProcessOnLogin() { HashSet rv = new HashSet<>(); - rv.addAll(getAllRelationNamesFor(RelationKindType.MEMBERSHIP)); + rv.addAll(getAllRelationNamesFor(RelationKindType.MEMBER)); + rv.addAll(getAllRelationNamesFor(RelationKindType.META)); rv.addAll(getAllRelationNamesFor(RelationKindType.DELEGATION)); return rv; } @@ -273,7 +274,8 @@ private Set computeRelationsToProcessOnLogin() { // We want to make this configurable in the future MID-3581 private Set computeRelationsToProcessOnRecompute() { HashSet rv = new HashSet<>(); - rv.addAll(getAllRelationsFor(RelationKindType.MEMBERSHIP)); + rv.addAll(getAllRelationsFor(RelationKindType.MEMBER)); + rv.addAll(getAllRelationsFor(RelationKindType.META)); rv.addAll(getAllRelationsFor(RelationKindType.MANAGER)); rv.addAll(getAllRelationsFor(RelationKindType.DELEGATION)); return rv; @@ -314,7 +316,7 @@ boolean processRelationOnRecompute(QName relation) { // We want to make this configurable in the future MID-3581 public boolean includeIntoParentOrgRef(QName relation) { - return isOfKind(relation, RelationKindType.MEMBERSHIP) && !isOfKind(relation, RelationKindType.META); + return isOfKind(relation, RelationKindType.MEMBER); } QName getDefaultRelationFor(RelationKindType kind) { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java index fc0ba3dd888..8b4d6463dfc 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java @@ -56,7 +56,7 @@ public void applyRelationConfiguration(SystemConfigurationType systemConfigurati RelationsDefinitionType relationsDef = roleManagement != null ? roleManagement.getRelations() : null; LOGGER.info("Applying relation configuration ({} entries)", relationsDef != null ? relationsDef.getRelation().size() : 0); indexedRelationDefinitions = createAndIndexRelationDefinitions(relationsDef); - prismContext.setDefaultRelation(indexedRelationDefinitions.getDefaultRelationFor(RelationKindType.MEMBERSHIP)); + prismContext.setDefaultRelation(indexedRelationDefinitions.getDefaultRelationFor(RelationKindType.MEMBER)); } public List getRelationDefinitions() { @@ -152,7 +152,7 @@ public Collection getAllRelationsFor(RelationKindType kind) { @Override public QName getDefaultRelation() { - return getDefaultRelationFor(RelationKindType.MEMBERSHIP); + return getDefaultRelationFor(RelationKindType.MEMBER); } @NotNull diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 004b6b57f82..9d1c8171d29 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -16315,7 +16315,7 @@ - + Membership relation, usually meaning "has" or "is member of". @@ -16327,7 +16327,7 @@ ref.relation is null). - + @@ -16348,9 +16348,6 @@ Relations used for metarole assignments. Sometimes it is important to distinguish metarole and member assignments. This kind of relation is used for that purpose. - - Relations of this kind should be also of MEMBERSHIP kind. - (Otherwise they would not provide metarole assignment functionality!) @@ -16360,7 +16357,7 @@ - Relation of "is deputy of" kind. Specifies that the subject is a deputy of another user. + Relation "is deputy of" kind. Specifies that the subject is a deputy of another user. @@ -16389,7 +16386,7 @@ - Relation of "is owner of" kind. + Relation "is owner of" kind. Specifies that the subject is a (business) owner of specified (abstract) role. The owner will be asked for decision if the role is modified, when the associated diff --git a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java index 009bd8e332e..43506466218 100644 --- a/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java +++ b/model/certification-impl/src/main/java/com/evolveum/midpoint/certification/impl/AccCertReviewersHelper.java @@ -133,7 +133,7 @@ private void resolveRoleReviewers(List reviewers, Operation private List getMembers(ObjectReferenceType abstractRoleRef, OperationResult result) throws SchemaException { Collection references = ObjectQueryUtil - .createReferences(abstractRoleRef.getOid(), RelationKindType.MEMBERSHIP, relationRegistry); + .createReferences(abstractRoleRef.getOid(), RelationKindType.MEMBER, relationRegistry); ObjectQuery query = references.isEmpty() ? QueryBuilder.queryFor(UserType.class, prismContext).none().build() : QueryBuilder.queryFor(UserType.class, prismContext) diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java index 1ab5497bb66..cca90c2ac08 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java @@ -23,7 +23,6 @@ import com.evolveum.midpoint.model.api.context.EvaluationOrder; import com.evolveum.midpoint.schema.RelationRegistry; -import com.evolveum.midpoint.schema.result.OperationResult; import com.evolveum.midpoint.util.DebugUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections4.MultiSet; @@ -221,7 +220,8 @@ public void shortDump(StringBuilder sb) { @Override public Collection getExtraRelations() { return orderMap.entrySet().stream() - .filter(e -> !relationRegistry.isMembership(e.getKey()) && + .filter(e -> !relationRegistry.isMember(e.getKey()) && + !relationRegistry.isMeta(e.getKey()) && !relationRegistry.isDelegation(e.getKey()) && e.getValue() > 0) .map(e -> e.getKey()) .collect(Collectors.toSet()); diff --git a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java index fc9c7539ea9..cb8cd9d1729 100644 --- a/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java +++ b/model/model-impl/src/test/java/com/evolveum/midpoint/model/impl/misc/TestRelationRegistry.java @@ -71,13 +71,13 @@ public void test100DefaultRelations() throws SchemaException { assertFalse(relationRegistry.isManager(unqualify(SchemaConstants.ORG_DEFAULT))); assertFalse(relationRegistry.isManager(null)); - assertTrue(relationRegistry.isMembership(SchemaConstants.ORG_DEFAULT)); - assertTrue(relationRegistry.isMembership(unqualify(SchemaConstants.ORG_DEFAULT))); - assertTrue(relationRegistry.isMembership(null)); - assertTrue(relationRegistry.isMembership(SchemaConstants.ORG_MANAGER)); - assertTrue(relationRegistry.isMembership(unqualify(SchemaConstants.ORG_MANAGER))); - assertFalse(relationRegistry.isMembership(SchemaConstants.ORG_APPROVER)); - assertFalse(relationRegistry.isMembership(unqualify(SchemaConstants.ORG_APPROVER))); + assertTrue(relationRegistry.isMember(SchemaConstants.ORG_DEFAULT)); + assertTrue(relationRegistry.isMember(unqualify(SchemaConstants.ORG_DEFAULT))); + assertTrue(relationRegistry.isMember(null)); + assertTrue(relationRegistry.isMember(SchemaConstants.ORG_MANAGER)); + assertTrue(relationRegistry.isMember(unqualify(SchemaConstants.ORG_MANAGER))); + assertFalse(relationRegistry.isMember(SchemaConstants.ORG_APPROVER)); + assertFalse(relationRegistry.isMember(unqualify(SchemaConstants.ORG_APPROVER))); // TODO } diff --git a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java index 3a4c4ed04ce..36d087ee919 100644 --- a/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java +++ b/model/workflow-api/src/main/java/com/evolveum/midpoint/wf/util/QueryUtils.java @@ -90,10 +90,10 @@ private static List getGroupsForUser(String userOid, Reposi return rv; } userType.getRoleMembershipRef().stream() - .filter(ref -> relationRegistry.isMembership(ref.getRelation())) + .filter(ref -> relationRegistry.isMember(ref.getRelation())) .forEach(ref -> rv.add(ref.clone().asReferenceValue())); userType.getDelegatedRef().stream() - .filter(ref -> relationRegistry.isMembership(ref.getRelation())) + .filter(ref -> relationRegistry.isMember(ref.getRelation())) .filter(ref -> !QNameUtil.match(ref.getType(), UserType.COMPLEX_TYPE)) // we are not interested in deputies (but this should be treated above) .forEach(ref -> rv.add(ref.clone().asReferenceValue())); return rv; diff --git a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java index 79a8b0b8ff9..6d7a848887e 100644 --- a/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java +++ b/model/workflow-impl/src/main/java/com/evolveum/midpoint/wf/impl/util/MiscDataUtil.java @@ -406,7 +406,7 @@ public boolean isMemberOfActivitiGroup(UserType userType, String activitiGroupId } public boolean matches(ObjectReferenceType groupRef, ObjectReferenceType targetRef) { - return (relationRegistry.isMembership(targetRef.getRelation())) // TODO reconsider if we allow managers here + return relationRegistry.isMember(targetRef.getRelation()) && targetRef.getOid().equals(groupRef.getOid()); } From 13ac5068a196c70d0616e7b730a150a2d56bc3d3 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Sep 2018 16:31:11 +0200 Subject: [PATCH 11/12] Configure relations behavior (MID-3581) Added 'processedOnLogin', 'processedOnRecompute', 'storedIntoParentOrgRef', 'automaticallyMatched' relation properties. --- .../refinery/RelationRegistryDummyImpl.java | 11 +- .../midpoint/schema/RelationRegistry.java | 21 ++-- .../relation/IndexedRelationDefinitions.java | 115 ++++++++++++++---- .../schema/relation/RelationRegistryImpl.java | 17 ++- .../xml/ns/public/common/common-core-3.xsd | 56 ++++++++- .../model/impl/lens/AssignmentEvaluator.java | 6 +- .../model/impl/lens/EvaluationOrderImpl.java | 4 +- 7 files changed, 177 insertions(+), 53 deletions(-) diff --git a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java index f8ce9000e72..0e5e5e42043 100644 --- a/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java +++ b/infra/common/src/test/java/com/evolveum/midpoint/common/refinery/RelationRegistryDummyImpl.java @@ -54,17 +54,22 @@ public boolean isOfKind(QName relation, RelationKindType kind) { } @Override - public boolean processRelationOnLogin(QName relation) { + public boolean isProcessedOnLogin(QName relation) { return false; } @Override - public boolean processRelationOnRecompute(QName relation) { + public boolean isProcessedOnRecompute(QName relation) { return false; } @Override - public boolean includeIntoParentOrgRef(QName relation) { + public boolean isStoredIntoParentOrgRef(QName relation) { + return false; + } + + @Override + public boolean isAutomaticallyMatched(QName relation) { return false; } diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java index 867a48a57b1..91cbe271b21 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/RelationRegistry.java @@ -82,22 +82,25 @@ default boolean isOwner(QName relation) { } /** - * Whether this kind of relations is processed on login. Currently only relations of MEMBER and DELEGATION kinds are. - * This is to be configured in the future (MID-3581). + * Whether this kind of relations is processed on login. By default, only relations of MEMBER and DELEGATION kinds are. */ - boolean processRelationOnLogin(QName relation); + boolean isProcessedOnLogin(QName relation); /** - * Whether this kind of relations is processed on recompute. Currently only relations of MEMBER, MANAGER and DELEGATION kinds are. - * This is to be configured in the future (MID-3581). + * Whether this kind of relations is processed on recompute. By default, only relations of MEMBER, MANAGER and DELEGATION kinds are. */ - boolean processRelationOnRecompute(QName relation); + boolean isProcessedOnRecompute(QName relation); /** - * Whether this kind of relations is included in parentOrgRef. Currently only relations of MEMBER but *not* META kinds are. - * This is to be configured in the future (MID-3581). + * Whether this kind of relations is stored in parentOrgRef. By default, only relations of MEMBER are. */ - boolean includeIntoParentOrgRef(QName relation); + boolean isStoredIntoParentOrgRef(QName relation); + + /** + * Whether this kind of relations is automatically matched by order constraints. By default, only relations of MEMBER, + * META and DELEGATION kinds are. + */ + boolean isAutomaticallyMatched(QName relation); /** * Returns the default relation i.e. the one that is equivalent to the null relation name. diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java index 3487ca482a6..2d9e2e4e64a 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/IndexedRelationDefinitions.java @@ -78,11 +78,19 @@ class IndexedRelationDefinitions { /** * Relations to be processed on login. Each relation is listed here under all its names. */ - @NotNull private final Set relationsToProcessOnLogin; + @NotNull private final Set relationsProcessedOnLogin; /** * Relations to be processed on recompute. Each relation is listed here under all its names. */ - @NotNull private final Set relationsToProcessOnRecompute; + @NotNull private final Set relationsProcessedOnRecompute; + /** + * Relations to be stored into parentOrgRef item. Each relation is listed here under all its names. + */ + @NotNull private final Set relationsStoredIntoParentOrgRef; + /** + * Relations to be automatically matched by order constraints. Each relation is listed here under all its names. + */ + @NotNull private final Set relationsAutomaticallyMatched; /** * Aliases for each normalized relation QName. */ @@ -99,11 +107,12 @@ class IndexedRelationDefinitions { defaultRelationByKind = computeDefaultRelationByKind(); addDefaultRelationToMaps(); - - relationsToProcessOnLogin = computeRelationsToProcessOnLogin(); - relationsToProcessOnRecompute = computeRelationsToProcessOnRecompute(); - aliases = computeAliases(); + + relationsProcessedOnLogin = computeRelationsProcessedOnLogin(); + relationsProcessedOnRecompute = computeRelationsProcessedOnRecompute(); + relationsStoredIntoParentOrgRef = computeRelationsStoredIntoParentOrgRef(); + relationsAutomaticallyMatched = computeRelationsAutomaticallyMatched(); logState(); } @@ -121,9 +130,11 @@ private void logState() { LOGGER.trace("relationDefinitionsByRelationName = {}", relationDefinitionsByRelationName); LOGGER.trace("relationsByKind = {}", relationsByKind); LOGGER.trace("defaultRelationByKind = {}", defaultRelationByKind); - LOGGER.trace("relationsToProcessOnLogin = {}", relationsToProcessOnLogin); - LOGGER.trace("relationsToProcessOnRecompute = {}", relationsToProcessOnRecompute); LOGGER.trace("aliases = {}", aliases); + LOGGER.trace("relationsProcessedOnLogin = {}", relationsProcessedOnLogin); + LOGGER.trace("relationsProcessedOnRecompute = {}", relationsProcessedOnRecompute); + LOGGER.trace("relationsStoredIntoParentOrgRef = {}", relationsStoredIntoParentOrgRef); + LOGGER.trace("relationsAutomaticallyMatched = {}", relationsAutomaticallyMatched); } } @@ -219,6 +230,7 @@ private SetValuedMap computeRelationsByKind() { } // not optimized for speed + @SuppressWarnings("unused") @NotNull private Collection getAllRelationNamesFor(RelationKindType kind) { Set rv = new HashSet<>(); @@ -262,25 +274,73 @@ private Map computeDefaultRelationByKind() { return rv; } - // We want to make this configurable in the future MID-3581 - private Set computeRelationsToProcessOnLogin() { + private Set computeRelationsProcessedOnLogin() { HashSet rv = new HashSet<>(); - rv.addAll(getAllRelationNamesFor(RelationKindType.MEMBER)); - rv.addAll(getAllRelationNamesFor(RelationKindType.META)); - rv.addAll(getAllRelationNamesFor(RelationKindType.DELEGATION)); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + Boolean configured = entry.getValue().isProcessedOnLogin(); + if (Boolean.TRUE.equals(configured) || configured == null && isProcessedOnLoginByDefault(entry.getValue().getRef())) { + rv.addAll(getAliases(entry.getKey())); + } + } return rv; } - // We want to make this configurable in the future MID-3581 - private Set computeRelationsToProcessOnRecompute() { + private boolean isProcessedOnLoginByDefault(QName relation) { + return isOfKind(relation, RelationKindType.MEMBER) + || isOfKind(relation, RelationKindType.META) + || isOfKind(relation, RelationKindType.DELEGATION); + } + + private Set computeRelationsProcessedOnRecompute() { HashSet rv = new HashSet<>(); - rv.addAll(getAllRelationsFor(RelationKindType.MEMBER)); - rv.addAll(getAllRelationsFor(RelationKindType.META)); - rv.addAll(getAllRelationsFor(RelationKindType.MANAGER)); - rv.addAll(getAllRelationsFor(RelationKindType.DELEGATION)); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + Boolean configured = entry.getValue().isProcessedOnRecompute(); + if (Boolean.TRUE.equals(configured) || configured == null && isProcessedOnRecomputeByDefault(entry.getValue().getRef())) { + rv.addAll(getAliases(entry.getKey())); + } + } return rv; } + private boolean isProcessedOnRecomputeByDefault(QName relation) { + return isOfKind(relation, RelationKindType.MEMBER) + || isOfKind(relation, RelationKindType.META) + || isOfKind(relation, RelationKindType.MANAGER) // ok? + || isOfKind(relation, RelationKindType.DELEGATION); + } + + private Set computeRelationsStoredIntoParentOrgRef() { + HashSet rv = new HashSet<>(); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + Boolean configured = entry.getValue().isStoredIntoParentOrgRef(); + if (Boolean.TRUE.equals(configured) || configured == null && isStoredIntoParentOrgRefByDefault(entry.getValue().getRef())) { + rv.addAll(getAliases(entry.getKey())); + } + } + return rv; + } + + private boolean isStoredIntoParentOrgRefByDefault(QName relation) { + return isOfKind(relation, RelationKindType.MEMBER); + } + + private Set computeRelationsAutomaticallyMatched() { + HashSet rv = new HashSet<>(); + for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { + Boolean configured = entry.getValue().isAutomaticallyMatched(); + if (Boolean.TRUE.equals(configured) || configured == null && isAutomaticallyMatchedByDefault(entry.getValue().getRef())) { + rv.addAll(getAliases(entry.getKey())); + } + } + return rv; + } + + private boolean isAutomaticallyMatchedByDefault(QName relation) { + return isOfKind(relation, RelationKindType.MEMBER) + || isOfKind(relation, RelationKindType.META) + || isOfKind(relation, RelationKindType.DELEGATION); + } + private SetValuedMap computeAliases() { SetValuedMap rv = new HashSetValuedHashMap<>(); for (Map.Entry entry : relationDefinitionsByRelationName.entrySet()) { @@ -306,17 +366,20 @@ boolean isOfKind(QName relation, RelationKindType kind) { return relationKinds != null && relationKinds.contains(kind); } - boolean processRelationOnLogin(QName relation) { - return relationsToProcessOnLogin.contains(relation); + boolean isProcessedOnLogin(QName relation) { + return relationsProcessedOnLogin.contains(relation); } - boolean processRelationOnRecompute(QName relation) { - return relationsToProcessOnRecompute.contains(relation); + boolean isProcessedOnRecompute(QName relation) { + return relationsProcessedOnRecompute.contains(relation); } - // We want to make this configurable in the future MID-3581 - public boolean includeIntoParentOrgRef(QName relation) { - return isOfKind(relation, RelationKindType.MEMBER); + boolean isStoredIntoParentOrgRef(QName relation) { + return relationsStoredIntoParentOrgRef.contains(relation); + } + + boolean isAutomaticallyMatched(QName relation) { + return relationsAutomaticallyMatched.contains(relation); } QName getDefaultRelationFor(RelationKindType kind) { diff --git a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java index 8b4d6463dfc..ef7e03025ce 100644 --- a/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java +++ b/infra/schema/src/main/java/com/evolveum/midpoint/schema/relation/RelationRegistryImpl.java @@ -125,18 +125,23 @@ public boolean isOfKind(QName relation, RelationKindType kind) { } @Override - public boolean processRelationOnLogin(QName relation) { - return indexedRelationDefinitions.processRelationOnLogin(relation); + public boolean isProcessedOnLogin(QName relation) { + return indexedRelationDefinitions.isProcessedOnLogin(relation); } @Override - public boolean processRelationOnRecompute(QName relation) { - return indexedRelationDefinitions.processRelationOnRecompute(relation); + public boolean isProcessedOnRecompute(QName relation) { + return indexedRelationDefinitions.isProcessedOnRecompute(relation); } @Override - public boolean includeIntoParentOrgRef(QName relation) { - return indexedRelationDefinitions.includeIntoParentOrgRef(relation); + public boolean isStoredIntoParentOrgRef(QName relation) { + return indexedRelationDefinitions.isStoredIntoParentOrgRef(relation); + } + + @Override + public boolean isAutomaticallyMatched(QName relation) { + return indexedRelationDefinitions.isAutomaticallyMatched(relation); } @Override diff --git a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd index 9d1c8171d29..4e6cf82f96e 100755 --- a/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd +++ b/infra/schema/src/main/resources/xml/ns/public/common/common-core-3.xsd @@ -16287,9 +16287,59 @@ - - - + + + + Whether this relation is processed during login. The default value is true for member, meta and delegation + kinds, false otherwise. EXPERIMENTAL. + + + 3.9 + RelationDefinitionType.processedOnLogin + true + + + + + + + Whether this relation is (by default) processed during recomputation. The default value is true + for member, meta, manager and delegation kinds, false otherwise. EXPERIMENTAL. + + + 3.9 + RelationDefinitionType.processedOnRecompute + true + + + + + + + Whether this relation is stored into parentOrgRef item. The default value is true + for member kind, false otherwise. EXPERIMENTAL. + + + 3.9 + RelationDefinitionType.storedIntoParentOrgRef + true + + + + + + + Whether this relation is automatically matched by order constraints (without the need to explicitly + list them). The default value is true for member, meta and delegation kinds, false otherwise. + EXPERIMENTAL. + + + 3.9 + RelationDefinitionType.automaticallyMatched + true + + + 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 e28cb97fdf6..5a97c93f9cb 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 @@ -435,12 +435,12 @@ private boolean evaluateSegmentContent(AssignmentPathSegm } if (assignmentType.getTarget() != null || assignmentType.getTargetRef() != null) { QName relation = getRelation(assignmentType); - if (loginMode && !relationRegistry.processRelationOnLogin(relation)) { + if (loginMode && !relationRegistry.isProcessedOnLogin(relation)) { 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) && - !relationRegistry.processRelationOnRecompute(relation) && !shouldEvaluateAllAssignmentRelationsOnRecompute()) { + !relationRegistry.isProcessedOnRecompute(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 @@ -1117,7 +1117,7 @@ private void collectMembershipRefVal(PrismReferenceValue membershipRefVal, Class "membershipRef", targetDesc); } } - if (OrgType.class.isAssignableFrom(targetClass) && relationRegistry.includeIntoParentOrgRef(relation)) { + if (OrgType.class.isAssignableFrom(targetClass) && relationRegistry.isStoredIntoParentOrgRef(relation)) { addIfNotThere(ctx.evalAssignment.getOrgRefVals(), ctx.evalAssignment::addOrgRefVal, membershipRefVal, "orgRef", targetDesc); } diff --git a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java index cca90c2ac08..0b2d5c60311 100644 --- a/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java +++ b/model/model-impl/src/main/java/com/evolveum/midpoint/model/impl/lens/EvaluationOrderImpl.java @@ -220,9 +220,7 @@ public void shortDump(StringBuilder sb) { @Override public Collection getExtraRelations() { return orderMap.entrySet().stream() - .filter(e -> !relationRegistry.isMember(e.getKey()) && - !relationRegistry.isMeta(e.getKey()) && - !relationRegistry.isDelegation(e.getKey()) && e.getValue() > 0) + .filter(e -> !relationRegistry.isAutomaticallyMatched(e.getKey()) && e.getValue() > 0) .map(e -> e.getKey()) .collect(Collectors.toSet()); } From 9e6c439821b732c4ef8cfc136a555c3adcd028c9 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 11 Sep 2018 16:46:46 +0200 Subject: [PATCH 12/12] Allow unparseable enums in COMPAT mode This issue made midPoint unavailable if such an enum was present in system configuration object. --- .../midpoint/prism/marshaller/BeanUnmarshaller.java | 3 ++- .../midpoint/prism/marshaller/PrismUnmarshaller.java | 7 +++++-- .../midpoint/repo/sql/SqlRepositoryServiceImpl.java | 2 +- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java index 2250cc92281..18106a50b76 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/BeanUnmarshaller.java @@ -1233,7 +1233,8 @@ private T unmarshalEnumFromPrimitive(PrimitiveXNode prim, Class beanClass } } if (javaEnumString == null) { - throw new SchemaException("Cannot find enum value for string '"+primValue+"' in "+beanClass); + pc.warnOrThrow(LOGGER, "Cannot find enum value for string '"+primValue+"' in "+beanClass); + return null; } @SuppressWarnings("unchecked") diff --git a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java index 188fc3583f3..60e56aa27a8 100644 --- a/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java +++ b/infra/prism/src/main/java/com/evolveum/midpoint/prism/marshaller/PrismUnmarshaller.java @@ -379,8 +379,11 @@ private PrismPropertyValue parsePropertyValue(@NotNull XNode node, if (expression != null) { PrismPropertyValue ppv = new PrismPropertyValue<>(null, prismContext, null, null, expression); return ppv; - - } + } else { + // There's no point in returning PPV(null) as it would soon fail on internal PP check. + // We are probably recovering from an error in COMPAT mode here, so let's just skip this value. + return null; + } } PrismPropertyValue ppv = new PrismPropertyValue<>(realValue); ppv.setPrismContext(prismContext); diff --git a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java index a9b1515fbcb..6b504d63f54 100644 --- a/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java +++ b/repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/SqlRepositoryServiceImpl.java @@ -1130,7 +1130,7 @@ public FullTextSearchConfigurationType getFullTextSearchConfiguration() { @Override public void postInit(OperationResult result) throws SchemaException { - LOGGER.info("Executing repository postInit method"); + LOGGER.debug("Executing repository postInit method"); SystemConfigurationType systemConfiguration; try {