From 3967a5bc955ec427b380d3b928f663d2f909a681 Mon Sep 17 00:00:00 2001 From: kate Date: Tue, 26 Feb 2019 15:47:58 +0100 Subject: [PATCH] fix for MID-5025 Role inducement association shadow ref error --- .../component/input/ExpressionValuePanel.java | 75 ++++++++++++------- .../component/ChooseTypePanel.java | 12 +++ .../localization/Midpoint.properties | 1 + 3 files changed, 61 insertions(+), 27 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/ExpressionValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/ExpressionValuePanel.java index 5a33b8f6dbc..f0e36de6ac6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/ExpressionValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/input/ExpressionValuePanel.java @@ -48,6 +48,7 @@ import com.evolveum.midpoint.xml.ns._public.common.common_3.*; import com.evolveum.prism.xml.ns._public.types_3.ItemPathType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; +import org.apache.commons.collections.CollectionUtils; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.feedback.FeedbackMessage; @@ -237,41 +238,40 @@ protected void executeCustomRemoveAction(AjaxRequestTarget target) { ExpressionUtil.removeEvaluatorByName(ExpressionValuePanel.this.getModelObject(), SchemaConstantsGenerated.C_VALUE); } + @Override + protected boolean isEnabledToEdit(){ + Collection refinedAssociationDefinitions = getRefinedAssociationDefinitions(); + return CollectionUtils.isNotEmpty(refinedAssociationDefinitions); + } + + @Override + protected IModel getPanelTitle(){ + Collection refinedAssociationDefinitions = getRefinedAssociationDefinitions(); + return CollectionUtils.isNotEmpty(refinedAssociationDefinitions) ? null : createStringResource("ExpressionValuePanel.associationDefenitionsNotDefined"); + } + @Override protected ObjectQuery getChooseQuery() { ObjectQuery query = new ObjectQuery(); ExpressionType expression = ExpressionValuePanel.this.getModelObject(); - if (expression == null || construction == null){ - return new ObjectQuery(); - } PrismObject resource = getResource(); - if (resource == null){ + if (expression == null || construction == null || resource == null){ return new ObjectQuery(); } - - try { - RefinedResourceSchema refinedResourceSchema = RefinedResourceSchema.getRefinedSchema(resource); - RefinedObjectClassDefinition oc = refinedResourceSchema.getRefinedDefinition(construction.getKind(), construction.getIntent()); - if (oc == null){ - return new ObjectQuery(); - } - Collection refinedAssociationDefinitions = oc.getAssociationDefinitions(); - - for (RefinedAssociationDefinition refinedAssociationDefinition : refinedAssociationDefinitions) { - S_FilterEntryOrEmpty atomicFilter = QueryBuilder.queryFor(ShadowType.class, pageBase.getPrismContext()); - List orFilterClauses = new ArrayList<>(); - refinedAssociationDefinition.getIntents() - .forEach(intent -> orFilterClauses.add(atomicFilter.item(ShadowType.F_INTENT).eq(intent).buildFilter())); - OrFilter intentFilter = OrFilter.createOr(orFilterClauses); - - AndFilter filter = (AndFilter) atomicFilter.item(ShadowType.F_KIND).eq(refinedAssociationDefinition.getKind()).and() - .item(ShadowType.F_RESOURCE_REF).ref(resource.getOid(), ResourceType.COMPLEX_TYPE).buildFilter(); - filter.addCondition(intentFilter); - query.setFilter(filter); - } - } catch (SchemaException ex) { - LOGGER.error("Couldn't create query filter for ShadowType popup list: {}" , ex.getErrorTypeMessage()); + Collection refinedAssociationDefinitions = getRefinedAssociationDefinitions(); + + for (RefinedAssociationDefinition refinedAssociationDefinition : refinedAssociationDefinitions) { + S_FilterEntryOrEmpty atomicFilter = QueryBuilder.queryFor(ShadowType.class, pageBase.getPrismContext()); + List orFilterClauses = new ArrayList<>(); + refinedAssociationDefinition.getIntents() + .forEach(intent -> orFilterClauses.add(atomicFilter.item(ShadowType.F_INTENT).eq(intent).buildFilter())); + OrFilter intentFilter = OrFilter.createOr(orFilterClauses); + + AndFilter filter = (AndFilter) atomicFilter.item(ShadowType.F_KIND).eq(refinedAssociationDefinition.getKind()).and() + .item(ShadowType.F_RESOURCE_REF).ref(resource.getOid(), ResourceType.COMPLEX_TYPE).buildFilter(); + filter.addCondition(intentFilter); + query.setFilter(filter); } return query; } @@ -295,6 +295,27 @@ public void onClick(AjaxRequestTarget target) { shadowRefValueContainer.add(removeButton); } + private Collection getRefinedAssociationDefinitions(){ + PrismObject resource = getResource(); + Collection refinedAssociationDefinitions = null; + if (resource == null){ + return refinedAssociationDefinitions; + } + + try { + RefinedResourceSchema refinedResourceSchema = RefinedResourceSchema.getRefinedSchema(resource); + RefinedObjectClassDefinition oc = refinedResourceSchema.getRefinedDefinition(construction.getKind(), construction.getIntent()); + if (oc == null){ + return refinedAssociationDefinitions; + } + refinedAssociationDefinitions = oc.getAssociationDefinitions(); + + } catch (SchemaException ex) { + LOGGER.error("Couldn't create query filter for ShadowType popup list: {}" , ex.getErrorTypeMessage()); + } + return refinedAssociationDefinitions; + } + private void initAssociationTargetSearchExpressionPanel(){ WebMarkupContainer targetSearchContainer = new WebMarkupContainer(ID_ASSOCIATION_TARGET_SEARCH_CONTAINER); targetSearchContainer.setOutputMarkupId(true); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java index 6329c98899a..02616c9eec1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/configuration/component/ChooseTypePanel.java @@ -23,6 +23,7 @@ import com.evolveum.midpoint.prism.query.ObjectQuery; import com.evolveum.midpoint.util.logging.Trace; import com.evolveum.midpoint.util.logging.TraceManager; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; import com.evolveum.midpoint.web.page.admin.dto.ObjectViewDto; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -95,6 +96,7 @@ protected void initLayout() { // return ""; // } // }); + name.add(AttributeAppender.append("title", getPanelTitle())); name.setOutputMarkupId(true); @@ -112,6 +114,8 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) { attributes.setChannel(new AjaxChannel("blocking", AjaxChannel.Type.ACTIVE)); } }; + choose.add(new EnableBehaviour(() -> isEnabledToEdit())); + choose.add(AttributeAppender.append("title", getPanelTitle())); choose.setOutputMarkupId(true); AjaxLink remove = new AjaxLink(ID_LINK_REMOVE) { @@ -163,6 +167,14 @@ protected void executeCustomAction(AjaxRequestTarget target, T object) { } + protected boolean isEnabledToEdit(){ + return true; + } + + protected IModel getPanelTitle(){ + return null; + } + private void changeOptionPerformed(AjaxRequestTarget target){ Class type = getObjectTypeClass(); List supportedTypes = new ArrayList<>(); diff --git a/gui/admin-gui/src/main/resources/localization/Midpoint.properties b/gui/admin-gui/src/main/resources/localization/Midpoint.properties index f0d3e03534c..5b4e1070df9 100755 --- a/gui/admin-gui/src/main/resources/localization/Midpoint.properties +++ b/gui/admin-gui/src/main/resources/localization/Midpoint.properties @@ -4146,6 +4146,7 @@ ExpressionValuePanel.specifyExpression=Specify expression ExpressionValuePanel.addValueButtonDefaultTitle=Add shadow reference value ExpressionValuePanel.addValueButtonTargetSearchTitle=Add association target search ExpressionValuePanel.addLiteralValueButton=Add literal value +ExpressionValuePanel.associationDefenitionsNotDefined=Association definitions are not defined for the current resource with selected kind/intent parameters. ConstructionType.attribute=Attribute ConstructionType.association=Association operation.Recompute.ALL.members=Recompute all members