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 e02ad4690be..1307e0c5a3b 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 @@ -5085,4 +5085,69 @@ public static String countLinkFroNonDeadShadows(Collection } return Integer.toString(count); } + + public static List> getAllowedValues(SearchFilterParameterType parameter, PageBase pageBase) { + List> allowedValues = new ArrayList<>(); + + if (parameter == null || parameter.getAllowedValuesExpression() == null) { + return allowedValues; + } + Task task = pageBase.createSimpleTask("evaluate expression for allowed values"); + ExpressionType expression = parameter.getAllowedValuesExpression(); + Object value = null; + try { + + value = ExpressionUtil.evaluateExpression(new VariablesMap(), null, + expression, MiscSchemaUtil.getExpressionProfile(), + pageBase.getExpressionFactory(), "evaluate expression for allowed values", task, task.getResult()); + } catch (Exception e) { + LOGGER.error("Couldn't execute expression " + expression, e); + pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.evaluateAllowedValuesExpression", expression).getString()); + return allowedValues; + } + if (value instanceof PrismPropertyValue) { + value = ((PrismPropertyValue) value).getRealValue(); + } + + if (!(value instanceof List)) { + LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); + pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); + return allowedValues; + } + + if (!((List) value).isEmpty()) { + if (!(((List) value).get(0) instanceof DisplayableValue)) { + LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); + pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); + return allowedValues; + } + return (List>) value; + } + return allowedValues; + } + + public static DropDownChoicePanel createDropDownChoices(String id, IModel model, IModel>> choices, + boolean allowNull, PageBase pageBase) { + return new DropDownChoicePanel(id, model, choices, new IChoiceRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Object getDisplayValue(DisplayableValue val) { + if (val.getValue() instanceof Enum) { + return pageBase.createStringResource((Enum) val.getValue()).getString(); + } + return pageBase.createStringResource(val.getLabel()).getString(); + } + + @Override + public String getIdValue(DisplayableValue val, int index) { + return Integer.toString(index); + } + + @Override + public DisplayableValue getObject(String id, IModel> choices) { + return StringUtils.isNotBlank(id) ? choices.getObject().get(Integer.parseInt(id)) : null; + } + }, allowNull); + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java index 2f47d5b5cef..b88d355f427 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/PrismPropertyPanelContext.java @@ -8,9 +8,11 @@ import com.evolveum.midpoint.gui.api.model.ReadOnlyModel; import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.StringResourceModel; + +import java.util.Collection; /** * @author katka @@ -27,6 +29,10 @@ public LookupTableType getPredefinedValues() { return unwrapWrapperModel().getPredefinedValues(); } + public Collection> getAllowedValues() { + return unwrapWrapperModel().getAllowedValues(); + } + public boolean hasValueEnumerationRef() { return unwrapWrapperModel().getValueEnumerationRef() != null; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java index eee4d69107d..109bd26ddb2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/TextPanelFactory.java @@ -7,11 +7,24 @@ package com.evolveum.midpoint.gui.impl.factory.panel; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; import java.util.Iterator; import java.util.List; +import java.util.stream.Collectors; import javax.annotation.PostConstruct; import javax.xml.namespace.QName; +import com.evolveum.midpoint.util.DisplayableValue; + +import com.evolveum.midpoint.web.component.search.FilterSearchItem; +import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior; + +import org.apache.commons.collections4.CollectionUtils; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; +import org.apache.wicket.model.PropertyModel; import org.springframework.stereotype.Component; import com.evolveum.midpoint.common.LocalizationService; @@ -43,21 +56,44 @@ public void register() { @Override protected InputPanel getPanel(PrismPropertyPanelContext panelCtx) { LookupTableType lookupTable = panelCtx.getPredefinedValues(); - if (lookupTable == null) { - return new TextPanel<>(panelCtx.getComponentId(), - panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false); + if (lookupTable != null) { + return new AutoCompleteTextPanel(panelCtx.getComponentId(), + panelCtx.getRealValueModel(), panelCtx.getTypeClass(), panelCtx.hasValueEnumerationRef(), lookupTable) { + + private static final long serialVersionUID = 1L; + + @Override + public Iterator getIterator(String input) { + return (Iterator) prepareAutoCompleteList(input, lookupTable, panelCtx.getPageBase().getLocalizationService()).iterator(); + } + }; } - return new AutoCompleteTextPanel(panelCtx.getComponentId(), - panelCtx.getRealValueModel(), panelCtx.getTypeClass(), panelCtx.hasValueEnumerationRef(), lookupTable) { + Collection> allowedValues = panelCtx.getAllowedValues(); + if (CollectionUtils.isNotEmpty(allowedValues)) { + IModel>> choices = Model.ofList(allowedValues.stream().collect(Collectors.toCollection(ArrayList::new))); + IModel convertModel = new IModel>(){ + @Override + public DisplayableValue getObject() { + Object value = panelCtx.getRealValueModel().getObject(); + for (DisplayableValue dispValue : choices.getObject()) { + if (dispValue.getValue().equals(value)) { + return dispValue; + } + } + return null; + } - private static final long serialVersionUID = 1L; + @Override + public void setObject(DisplayableValue object) { + panelCtx.getRealValueModel().setObject(object.getValue()); + } + }; + return WebComponentUtil.createDropDownChoices(panelCtx.getComponentId(), convertModel, choices, true, panelCtx.getPageBase()); + } - @Override - public Iterator getIterator(String input) { - return (Iterator) prepareAutoCompleteList(input, lookupTable, panelCtx.getPageBase().getLocalizationService()).iterator(); - } - }; + return new TextPanel<>(panelCtx.getComponentId(), + panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false); } protected List prepareAutoCompleteList(String input, LookupTableType lookupTable, LocalizationService localizationService) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java index c9068926551..451275ecff2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerPanel.java @@ -78,7 +78,7 @@ protected Component createValuePanel(ListItem> ite PrismContainerValuePanel> panel = new PrismContainerValuePanel>("value", item.getModel(), settings) { @Override - protected void removeValue(PrismContainerValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(PrismContainerValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { PrismContainerPanel.this.removeValue(valueToRemove, target); } }; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java index 79f2226eb27..349187095b3 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismContainerValuePanel.java @@ -283,7 +283,7 @@ public boolean isOn() { } @Override - protected void removeValue(CVW valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(CVW valueToRemove, AjaxRequestTarget target) throws SchemaException { throw new UnsupportedOperationException("Must be implemented in calling panel"); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java index 94b14552588..5929211a7f1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyPanel.java @@ -53,8 +53,8 @@ protected Component createValuePanel(ListItem> item PrismPropertyValuePanel panel = new PrismPropertyValuePanel("value", item.getModel(), getSettings()) { @Override - protected void removeValue(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { - PrismPropertyPanel.this.removeValue(valueToRemove, target); + protected void remove(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { + removeValue(valueToRemove, target); } }; item.add(panel); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java index df83520838f..c90f502710f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismPropertyValuePanel.java @@ -51,7 +51,7 @@ protected PV createNewValue(PrismPropertyWrapper item } @Override - protected void removeValue(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(PrismPropertyValueWrapper valueToRemove, AjaxRequestTarget target) throws SchemaException { throw new UnsupportedOperationException("Must be implemented in calling panel"); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java index 6a6578347f4..18ea1ed1697 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferencePanel.java @@ -47,7 +47,7 @@ protected void refreshPanel(AjaxRequestTarget target) { protected Component createValuePanel(ListItem> item) { PrismReferenceValuePanel valuePanel = new PrismReferenceValuePanel(ID_VALUE, item.getModel(), getSettings()) { @Override - protected void removeValue( + protected void remove( PrismReferenceValueWrapperImpl valueToRemove, AjaxRequestTarget target) throws SchemaException { PrismReferencePanel.this.removeValue(valueToRemove, target); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java index d048965fd10..87588775e4d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismReferenceValuePanel.java @@ -118,7 +118,7 @@ private PrismReferenceWrapper getParentWrapper() { } @Override - protected void removeValue(PrismReferenceValueWrapperImpl valueToRemove, AjaxRequestTarget target) throws SchemaException { + protected void remove(PrismReferenceValueWrapperImpl valueToRemove, AjaxRequestTarget target) throws SchemaException { throw new UnsupportedOperationException("Must be implemented in calling panel"); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java index 76f0ea2a8ea..79d2923a491 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/PrismValuePanel.java @@ -87,7 +87,7 @@ private WebMarkupContainer createHeaderPanel() { @Override public void onClick(AjaxRequestTarget target) { try { - removeValue(PrismValuePanel.this.getModelObject(), target); + PrismValuePanel.this.remove(PrismValuePanel.this.getModelObject(), target); } catch (SchemaException e) { LOGGER.error("Cannot remove value: {}", getModelObject()); getSession().error("Cannot remove value " + getModelObject()); @@ -272,7 +272,7 @@ private O getObject() { protected abstract PV createNewValue(IW itemWrapper); //TODO move to the ItemPanel, exception handling - protected abstract void removeValue(VW valueToRemove, AjaxRequestTarget target) throws SchemaException; + protected abstract void remove(VW valueToRemove, AjaxRequestTarget target) throws SchemaException; private void showMetadataPerformed(VW value, AjaxRequestTarget target) { boolean showMetadata = !value.isShowMetadata(); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java index 0b5abd8f78c..ce0625cfe85 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/prism/panel/ValueMetadataPanel.java @@ -84,7 +84,7 @@ protected PV createNewValue(PrismContainerWrapper ite } @Override - protected void removeValue(CVW valueToRemove, AjaxRequestTarget target) { + protected void remove(CVW valueToRemove, AjaxRequestTarget target) { } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java index 535e1b69a57..cb1cd20b1d6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchItemPanel.java @@ -157,30 +157,6 @@ protected IModel>> createBooleanChoices() { return Model.ofList(list); } - protected DropDownChoicePanel createDropDownChoices(String id, IModel model, IModel>> choices, boolean allowNull) { - return new DropDownChoicePanel(id, model, choices, new IChoiceRenderer() { - private static final long serialVersionUID = 1L; - - @Override - public Object getDisplayValue(DisplayableValue val) { - if (val.getValue() instanceof Enum) { - return getPageBase().createStringResource((Enum) val.getValue()).getString(); - } - return getPageBase().createStringResource(val.getLabel()).getString(); - } - - @Override - public String getIdValue(DisplayableValue val, int index) { - return Integer.toString(index); - } - - @Override - public DisplayableValue getObject(String id, IModel> choices) { - return StringUtils.isNotBlank(id) ? choices.getObject().get(Integer.parseInt(id)) : null; - } - }, allowNull); - } - protected AutoCompleteTextPanel createAutoCompetePanel(String id, IModel model, LookupTableType lookupTable) { AutoCompleteTextPanel autoCompletePanel = new AutoCompleteTextPanel(id, model, String.class, true, lookupTable) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java index 779c097c487..ee9771cf7c2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/FilterSearchItem.java @@ -7,6 +7,7 @@ package com.evolveum.midpoint.web.component.search; import java.io.Serializable; +import java.util.Collections; import java.util.List; import org.apache.commons.collections4.CollectionUtils; @@ -131,43 +132,11 @@ public List> getAllowedValues(PageBase pageBase) { if (allowedValues != null) { return allowedValues; } - - if (predefinedFilter == null || predefinedFilter.getParameter() == null - || predefinedFilter.getParameter().getAllowedValuesExpression() == null) { - return null; - } - Task task = pageBase.createSimpleTask("evaluate expression for allowed values"); - ExpressionType expression = predefinedFilter.getParameter().getAllowedValuesExpression(); - Object value = null; - try { - - value = ExpressionUtil.evaluateExpression(new VariablesMap(), null, - expression, MiscSchemaUtil.getExpressionProfile(), - pageBase.getExpressionFactory(), "evaluate expression for allowed values", task, task.getResult()); - } catch (Exception e) { - LOGGER.error("Couldn't execute expression " + expression, e); - pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.evaluateAllowedValuesExpression", expression).getString()); - return null; - } - if (value instanceof PrismPropertyValue) { - value = ((PrismPropertyValue) value).getRealValue(); - } - - if (!(value instanceof List)) { - LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); - pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); - return null; - } - - if (!((List) value).isEmpty()) { - if (!(((List) value).get(0) instanceof DisplayableValue)) { - LOGGER.error("Exception return unexpected type, expected List, but was " + (value == null ? null : value.getClass())); - pageBase.error(pageBase.createStringResource("FilterSearchItem.message.error.wrongType", expression).getString()); - return null; - } + if (predefinedFilter == null) { + return Collections.EMPTY_LIST; } - this.allowedValues = (List>) value; - return (List>) value; + List> values = WebComponentUtil.getAllowedValues(predefinedFilter.getParameter(), pageBase); + return values; } public LookupTableType getLookupTable(PageBase pageBase) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java index b03ae95109a..5d3afc03a1f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchFilterPanel.java @@ -94,7 +94,8 @@ protected void referenceValueUpdated(ObjectReferenceType ort, AjaxRequestTarget createEnumChoices((Class) inputClass) : Model.ofList(getModelObject().getAllowedValues(getPageBase())); } if (choices != null) { - inputPanel = createDropDownChoices(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), FilterSearchItem.F_INPUT), choices, false); + inputPanel = WebComponentUtil.createDropDownChoices( + ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), FilterSearchItem.F_INPUT), (IModel)choices, false, getPageBase()); ((InputPanel) inputPanel).getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java index 7e2d7551fae..a3dc1a35e13 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertyPanel.java @@ -92,7 +92,8 @@ protected boolean isAllowedNotFoundObjectRef() { if (choices == null) { choices = new ListModel(item.getAllowedValues(getPageBase())); } - searchItemField = createDropDownChoices(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), "value"), choices, true); + searchItemField = WebComponentUtil.createDropDownChoices( + ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), "value"), (IModel)choices, true, getPageBase()); ((InputPanel) searchItemField).getBaseFormComponent().add(new EmptyOnChangeAjaxFormUpdatingBehavior() { @Override protected void onUpdate(AjaxRequestTarget target) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java index 98c137e9e08..27b5d19e5a5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchTypePanel.java @@ -8,6 +8,8 @@ import java.util.List; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; + import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.OnChangeAjaxBehavior; @@ -42,7 +44,8 @@ protected void initSearchItemField(WebMarkupContainer searchItemContainer) { List>> allowedValues = item.getAllowedValues(getPageBase()); if (allowedValues != null && !allowedValues.isEmpty()) { IModel>> choices = new ListModel(item.getAllowedValues(getPageBase())); - searchItemField = createDropDownChoices(ID_SEARCH_ITEM_FIELD, new PropertyModel<>(getModel(), ContainerTypeSearchItem.F_TYPE), choices, false); + searchItemField = WebComponentUtil.createDropDownChoices( + ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), ContainerTypeSearchItem.F_TYPE), (IModel)choices, false, getPageBase()); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java index c9b300976fd..6ae03cfaf61 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/PageReports.java @@ -290,7 +290,7 @@ private void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType protected void runReportPerformed(AjaxRequestTarget target, ReportType report) { - if(report.getJasper() != null) { + if(report.getObjectCollection() == null) { runConfirmPerformed(target, report, null); return; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.html index e47d98122b3..b76fff0b1e0 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.html @@ -22,40 +22,9 @@

- - - - - - - - -
-
- - - - - -
- - -
-
-
-
- - - - -
-
-
-
+
+
+

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java index 8ecfb92d594..780fba46824 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/RunReportPopupPanel.java @@ -6,42 +6,33 @@ */ package com.evolveum.midpoint.web.page.admin.reports.component; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; +import java.util.*; -import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; -import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper; +import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext; +import com.evolveum.midpoint.gui.api.prism.ItemStatus; +import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper; +import com.evolveum.midpoint.gui.impl.prism.panel.ItemPanelSettingsBuilder; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.web.component.form.MidpointForm; import com.evolveum.midpoint.xml.ns._public.common.common_3.*; -import org.apache.commons.lang3.StringUtils; +import org.apache.commons.collections4.CollectionUtils; import org.apache.wicket.Component; -import org.apache.wicket.RestartResponseException; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.markup.html.AjaxLink; import org.apache.wicket.feedback.ComponentFeedbackMessageFilter; import org.apache.wicket.feedback.FeedbackMessage; import org.apache.wicket.markup.html.WebMarkupContainer; -import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.Form; -import org.apache.wicket.markup.html.form.FormComponent; import org.apache.wicket.markup.html.list.ListItem; import org.apache.wicket.markup.html.list.ListView; import org.apache.wicket.model.IModel; -import org.apache.wicket.model.PropertyModel; +import org.apache.wicket.model.Model; import org.apache.wicket.model.StringResourceModel; -import com.evolveum.midpoint.audit.api.AuditEventStage; -import com.evolveum.midpoint.audit.api.AuditEventType; import com.evolveum.midpoint.gui.api.component.BasePanel; -import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; -import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.path.ItemPath; import com.evolveum.midpoint.prism.polystring.PolyString; @@ -63,20 +54,11 @@ import com.evolveum.midpoint.util.logging.TraceManager; import com.evolveum.midpoint.web.component.AjaxSubmitButton; import com.evolveum.midpoint.web.component.dialog.Popupable; -import com.evolveum.midpoint.web.component.input.DatePanel; -import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.message.FeedbackAlerts; -import com.evolveum.midpoint.web.component.prism.InputPanel; -import com.evolveum.midpoint.web.component.util.VisibleBehaviour; -import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; -import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterDto; import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportParameterPropertiesDto; -import com.evolveum.midpoint.web.page.admin.reports.dto.JasperReportValueDto; import com.evolveum.midpoint.web.page.admin.reports.dto.ReportDto; import com.evolveum.midpoint.web.security.util.SecurityUtils; -import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventStageType; -import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventTypeType; import com.evolveum.prism.xml.ns._public.types_3.PolyStringType; public class RunReportPopupPanel extends BasePanel implements Popupable { @@ -95,30 +77,77 @@ public class RunReportPopupPanel extends BasePanel implements Popupab private static final Integer AUTO_COMPLETE_BOX_SIZE = 10; - private static final String ID_VALUE_LIST = "valueList"; - private static final String ID_ADD_BUTTON = "add"; - private static final String ID_REMOVE_BUTTON = "remove"; + private static final String ID_PARAMETERS = "parameters"; + private static final String ID_PARAMETER = "parameter"; - private static final String ID_PARAMETERS = "paramTable"; - - private IModel reportModel; private final ReportType reportType; + private PrismContainer paramContainer; public RunReportPopupPanel(String id, final ReportType reportType) { super(id); this.reportType = reportType; + } - reportModel = new LoadableModel(false) { + @Override + protected void onInitialize() { + super.onInitialize(); + initParameters(); + initLayout(); + } - private static final long serialVersionUID = 1L; + private void initParameters() { + PrismContainerDefinition paramContainerDef = getPrismContext().getSchemaRegistry().findContainerDefinitionByElementName(ReportConstants.REPORT_PARAMS_PROPERTY_NAME); + for (SearchFilterParameterType parameter : reportType.getObjectCollection().getParameter()) { + try { + paramContainer = paramContainerDef.instantiate(); - @Override - protected ReportDto load() { - return new ReportDto(reportType, true); - } - }; + ReportParameterType reportParam = new ReportParameterType(); + PrismContainerValue reportParamValue = reportParam.asPrismContainerValue(); + reportParamValue.revive(getPrismContext()); + paramContainer.add(reportParamValue); - initLayout(); + Class clazz = getPrismContext().getSchemaRegistry().determineClassForType(parameter.getType()); + QName type = getPrismContext().getSchemaRegistry().determineTypeForClass(clazz); + if (Containerable.class.isAssignableFrom(clazz)) { + LOGGER.error("Couldn't create container item for parameter " + parameter); + continue; + } + MutableItemDefinition def; + if (Referencable.class.isAssignableFrom(clazz)) { + def = getPrismContext().definitionFactory().createReferenceDefinition( + new QName(ReportConstants.NS_EXTENSION, parameter.getName()), type); + ((MutablePrismReferenceDefinition)def).setTargetTypeName(parameter.getTargetType()); + } else { + List values = WebComponentUtil.getAllowedValues(parameter, getPageBase()); + if (CollectionUtils.isNotEmpty(values)) { + def = (MutableItemDefinition) getPrismContext().definitionFactory().createPropertyDefinition( + new QName(ReportConstants.NS_EXTENSION, parameter.getName()), type, values, null); + } else { + def = getPrismContext().definitionFactory().createPropertyDefinition( + new QName(ReportConstants.NS_EXTENSION, parameter.getName()), type); + } + } + def.setDynamic(true); + def.setRuntimeSchema(true); + def.setMaxOccurs(1); + def.setMinOccurs(0); + if (parameter.getDisplay() != null) { + String displayName = WebComponentUtil.getTranslatedPolyString(parameter.getDisplay().getLabel()); + def.setDisplayName(displayName); + String help = WebComponentUtil.getTranslatedPolyString(parameter.getDisplay().getHelp()); + def.setHelp(help); + } + if (parameter.getAllowedValuesLookupTable() != null) { + def.setValueEnumerationRef(parameter.getAllowedValuesLookupTable().asReferenceValue()); + } + + Item prop = def.instantiate(); + reportParamValue.add(prop); + + } catch (SchemaException e) { + LOGGER.error("Couldn't create item for parameter " + parameter); + } + } } protected void initLayout() { @@ -126,14 +155,22 @@ protected void initLayout() { Form mainForm = new MidpointForm<>(ID_MAIN_FORM); add(mainForm); - - ListView paramListView = new ListView(ID_PARAMETERS, new PropertyModel<>(reportType, "objectCollection.parameter")) { + IModel> listModel = (IModel) () -> { + List list = new ArrayList<>(); + list.addAll(paramContainer.getValue().getItems()); + return list; + }; + ListView paramListView = new ListView(ID_PARAMETERS, listModel) { private static final long serialVersionUID = 1L; @Override - protected void populateItem(ListItem paramItem) { - paramItem.add(createParameterPanel(paramItem.getModel())); + protected void populateItem(ListItem paramItem) { + try { + paramItem.add(createParameterPanel(paramItem.getModel())); + } catch (SchemaException e) { + LOGGER.error("Couldn't create panel for item " + paramItem.getModelObject()); + } } }; @@ -141,7 +178,7 @@ protected void populateItem(ListItem paramItem) { mainForm.add(paramListView); FeedbackAlerts feedback = new FeedbackAlerts(ID_POPUP_FEEDBACK); - feedback.setFilter(new ComponentFeedbackMessageFilter(paramListView){ + feedback.setFilter(new ComponentFeedbackMessageFilter(paramListView) { private static final long serialVersionUID = 1L; @@ -158,176 +195,26 @@ public boolean accept(FeedbackMessage message) { private static final long serialVersionUID = 1L; @Override - protected void onError(AjaxRequestTarget target) { - FeedbackAlerts feedback = (FeedbackAlerts) getForm().get(ID_POPUP_FEEDBACK); - target.add(feedback); - } - - @Override - protected void onSubmit(AjaxRequestTarget target) { - runConfirmPerformed(target, reportModel); - } - }; - mainForm.add(addButton); - - } - - private WebMarkupContainer createParameterPanel(final IModel parameterModel) { - WebMarkupContainer paramPanel = new WebMarkupContainer("paramPanel"); -// paramPanel.setOutputMarkupId(true); -// String paramValue = new PropertyModel(parameterModel, "name").getObject(); -// StringResourceModel paramDisplay = PageBase.createStringResourceStatic(RunReportPopupPanel.this, "runReportPopupContent.param.name." + paramValue); -// -// paramPanel.add(new Label("name", paramDisplay)); // use display name rather than property name -// -// WebMarkupContainer required = new WebMarkupContainer("required"); -// JasperReportParameterPropertiesDto properties = parameterModel.getObject().getProperties(); -// boolean mandatory = (properties != null && properties.getMandatory()); -// required.add(new VisibleBehaviour(() -> mandatory)); -// paramPanel.add(required); -// -// String paramClass = new PropertyModel(parameterModel, "nestedTypeAsString").getObject(); -// if (StringUtils.isBlank(paramClass)) { -// paramClass = new PropertyModel(parameterModel, "typeAsString").getObject(); -// } -// paramClass = paramClass == null ? "" : paramClass.substring(paramClass.lastIndexOf(".") + 1); -// paramPanel.add(new Label("type", paramClass)); -// -// ListView listView = new ListView(ID_VALUE_LIST, new PropertyModel<>(parameterModel, "value")) { -// -// private static final long serialVersionUID = 1L; -// -// @Override -// protected void populateItem(ListItem item) { -// item.add(createInputMarkup(item.getModel(), parameterModel.getObject(), mandatory, paramDisplay)); -// -// } -// -// }; -// listView.setOutputMarkupId(true); -// -// paramPanel.add(listView); - return paramPanel; - } - - private WebMarkupContainer createInputMarkup(final IModel valueModel, JasperReportParameterDto param, boolean required, IModel name) { - param.setEditing(true); - WebMarkupContainer paramValueMarkup = new WebMarkupContainer("valueMarkup"); - paramValueMarkup.setOutputMarkupId(true); - - InputPanel input = createTypedInputPanel("inputValue", valueModel, "value", param); - input.getBaseFormComponent().setRequired(required); - input.getBaseFormComponent().setLabel(name); - paramValueMarkup.add(input); - - //buttons - AjaxLink addButton = new AjaxLink(ID_ADD_BUTTON) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget target) { - addValue(paramValueMarkup, param, target); + protected void onError(AjaxRequestTarget target) { + FeedbackAlerts feedback = (FeedbackAlerts) getForm().get(ID_POPUP_FEEDBACK); + target.add(feedback); } - }; - addButton.add(new VisibleEnableBehaviour() { - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible() { - return isAddButtonVisible(param); - } - }); - paramValueMarkup.add(addButton); - - AjaxLink removeButton = new AjaxLink(ID_REMOVE_BUTTON) { - private static final long serialVersionUID = 1L; @Override - public void onClick(AjaxRequestTarget target) { - removeValue(paramValueMarkup, param, valueModel.getObject(), target); + protected void onSubmit(AjaxRequestTarget target) { + runConfirmPerformed(target); } }; - removeButton.add(new VisibleEnableBehaviour() { - private static final long serialVersionUID = 1L; - - @Override - public boolean isVisible() { - return isRemoveButtonVisible(); - } - }); - paramValueMarkup.add(removeButton); - return paramValueMarkup; - } - - private InputPanel createTypedInputPanel(String componentId, IModel model, String expression, JasperReportParameterDto param) { - InputPanel panel; - Class type; - try { - if (param.isMultiValue()) { - type = param.getNestedType(); - } else { - type = param.getType(); - } - } catch (ClassNotFoundException e) { - getSession().error("Could not find parameter type definition. Check the configuration."); - throw new RestartResponseException(getPageBase()); - } - - if (type.isEnum()) { - panel = WebComponentUtil.createEnumPanel(type, componentId, new PropertyModel<>(model, expression), this); - } else if (XMLGregorianCalendar.class.isAssignableFrom(type)) { - panel = new DatePanel(componentId, new PropertyModel<>(model, expression)); - } else if (param.getProperties() != null && param.getProperties().getTargetType() != null) { // render autocomplete box - LookupTableType lookup = new LookupTableType(); - //TODO: displayName - panel = new AutoCompleteTextPanel(componentId, new PropertyModel<>(model, expression), String.class, true, lookup) { - - private static final long serialVersionUID = 1L; - - @Override - public Iterator getIterator(String input) { - return prepareAutoCompleteList(input, lookup, param).iterator(); - } - }; - } else { - panel = new TextPanel<>(componentId, new PropertyModel<>(model, expression), type); - } - List components = panel.getFormComponents(); - for (FormComponent component : components) { - component.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); - } - - panel.setOutputMarkupId(true); - return panel; - } - - private void addValue(WebMarkupContainer paramValueMarkup, JasperReportParameterDto valueModel, AjaxRequestTarget target) { - valueModel.addValue(); - //reload just current parameter container panel - target.add(paramValueMarkup.findParent(ListView.class).findParent(WebMarkupContainer.class)); - } - - private ListView getParametersView(){ - return (ListView) get(createComponentPath(ID_MAIN_FORM, ID_PARAMETERS)); - } - - private boolean isAddButtonVisible(JasperReportParameterDto valueDecs) { - try { - return valueDecs.isMultiValue(); - } catch (ClassNotFoundException e) { - return false; - } - } + mainForm.add(addButton); - private void removeValue(WebMarkupContainer paramValueMarkup, JasperReportParameterDto valueModel, - JasperReportValueDto object, AjaxRequestTarget target) { - valueModel.removeValue(object); - //reload just current parameter container panel - target.add(paramValueMarkup.findParent(ListView.class).findParent(WebMarkupContainer.class)); } - private boolean isRemoveButtonVisible() { - return true; + private WebMarkupContainer createParameterPanel(final IModel item) throws SchemaException { + Task task = getPageBase().createSimpleTask("Create child containers"); + WrapperContext ctx = new WrapperContext(task, task.getResult()); + ItemWrapper wrapper = getPageBase().createItemWrapper(item.getObject(), ItemStatus.ADDED, ctx); + return getPageBase().initItemPanel(ID_PARAMETER, item.getObject().getDefinition().getTypeName(), + Model.of(wrapper), new ItemPanelSettingsBuilder().build()); } private List createLookupTableRows(JasperReportParameterDto param, String input) { @@ -368,7 +255,7 @@ private List createLookupTableRows(Ja Collection> objects; ObjectQuery query = getPrismContext().queryFor(targetType) .item(new QName(SchemaConstants.NS_C, pLabel)).startsWith(input) - .matching(new QName(SchemaConstants.NS_MATCHING_RULE, "origIgnoreCase")) + .matching(new QName(SchemaConstants.NS_MATCHING_RULE, "origIgnoreCase")) .maxSize(AUTO_COMPLETE_BOX_SIZE) .build(); try { @@ -435,34 +322,6 @@ private PolyStringType convertObjectToPolyStringType(Object o) { } } - private List prepareAutoCompleteList(String input, LookupTableType lookupTable, JasperReportParameterDto param) { - List values = new ArrayList<>(); - - if (lookupTable == null) { - return values; - } - - List rows = createLookupTableRows(param, input); - - if (rows == null) { - return values; - } - if (lookupTable.getRow() != null) { - lookupTable.getRow().addAll(rows); - } - - for (LookupTableRowType row : rows) { - values.add(WebComponentUtil.getOrigStringFromPoly(row.getLabel())); - - if (values.size() > AUTO_COMPLETE_BOX_SIZE) { - break; - } - } - - return values; - } - - public Task createSimpleTask(String operation, PrismObject owner) { Task task = getPageBase().getTaskManager().createTaskInstance(operation); @@ -486,71 +345,16 @@ public Task createSimpleTask(String operation) { return createSimpleTask(operation, user != null ? user.getFocus().asPrismObject() : null); } - private void runConfirmPerformed(AjaxRequestTarget target, IModel model) { - ReportDto reportDto = model.getObject(); - - PrismContainerDefinition paramContainerDef = getPrismContext().getSchemaRegistry().findContainerDefinitionByElementName(ReportConstants.REPORT_PARAMS_PROPERTY_NAME); - PrismContainer paramContainer; - try { - paramContainer = paramContainerDef.instantiate(); - ReportParameterType reportParam = new ReportParameterType(); - PrismContainerValue reportParamValue = reportParam.asPrismContainerValue(); - reportParamValue.revive(getPrismContext()); - paramContainer.add(reportParamValue); - - List params = getParametersView().getModelObject(); - for (JasperReportParameterDto paramDto : params) { - if (paramDto.getValue() == null) { - continue; - } - List values = paramDto.getValue(); - Class paramClass = paramDto.getType(); - - boolean multivalue = false; - if (List.class.isAssignableFrom(paramClass)) { - paramClass = paramDto.getNestedType(); - if (paramClass == null) { - getSession().error("Nested type for list must be defined!"); - target.add(getPageBase().getFeedbackPanel()); - return; - } - } - - QName typeName = getPrismContext().getSchemaRegistry().determineTypeForClass(paramClass); - MutablePrismPropertyDefinition def = getPrismContext().definitionFactory().createPropertyDefinition( - new QName(ReportConstants.NS_EXTENSION, paramDto.getName()), typeName); - def.setDynamic(true); - def.setRuntimeSchema(true); - def.toMutable().setMaxOccurs(multivalue ? -1 : 1); // TODO multivalue is always 'false' here ... - - PrismProperty prop = def.instantiate(); - for (JasperReportValueDto paramValue : values) { - Object realValue = paramValue.getValue(); - if (realValue == null) { - continue; - } - if (AuditEventType.class.isAssignableFrom(paramClass)) { - paramClass = AuditEventTypeType.class; - realValue = AuditEventType.toSchemaValue((AuditEventType) realValue); - } else if (AuditEventStage.class.isAssignableFrom(paramClass)) { - paramClass = AuditEventStageType.class; - realValue = AuditEventStage.toSchemaValue((AuditEventStage) realValue); - } - - prop.addRealValue(realValue); - } - if (!prop.isEmpty()) { - reportParamValue.add(prop); - } + private void runConfirmPerformed(AjaxRequestTarget target) { + PrismContainer parameterContainer = paramContainer.clone(); + List itemForRemoving = new ArrayList<>(); + parameterContainer.getValue().getItems().forEach((item) -> { + if (item.isEmpty() || item.getRealValue() == null){ + itemForRemoving.add(item); } - } catch (SchemaException | ClassNotFoundException e) { - OperationResult result = new OperationResult("Parameters serialization"); - result.recordFatalError(getString("RunReportPopupPanel.message.runConfirmPerformed.fatalError")); - getPageBase().showResult(result); - return; - } - - runConfirmPerformed(target, reportDto.getObject().asObjectable(), paramContainer); + }); + parameterContainer.getValue().getItems().removeAll(itemForRemoving); + runConfirmPerformed(target, reportType, parameterContainer); } protected void runConfirmPerformed(AjaxRequestTarget target, ReportType reportType2, @@ -568,12 +372,12 @@ public int getHeight() { } @Override - public String getWidthUnit(){ + public String getWidthUnit() { return "px"; } @Override - public String getHeightUnit(){ + public String getHeightUnit() { return "px"; } @@ -586,21 +390,4 @@ public StringResourceModel getTitle() { public Component getComponent() { return this; } - -// static class LookupReportPropertyModel extends LookupPropertyModel { -// -// private static final long serialVersionUID = 1L; -// -// -// public LookupReportPropertyModel(IModel modelObject, String expression, LookupTableType lookupTable, boolean isStrict) { -// super(modelObject, expression, lookupTable, isStrict); -// } -// -// @Override -// public boolean isSupportsDisplayName() { -// return true; -// } -// -// } - } diff --git a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/DefinitionFactory.java b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/DefinitionFactory.java index e90ae9a5f05..95b40f45fed 100644 --- a/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/DefinitionFactory.java +++ b/infra/prism-api/src/main/java/com/evolveum/midpoint/prism/DefinitionFactory.java @@ -28,5 +28,5 @@ public interface DefinitionFactory { @NotNull MutablePrismContainerDefinition createContainerDefinition(QName name, ComplexTypeDefinition ctd); - PrismPropertyDefinition createPropertyDefinition(QName name, QName typeName, Collection> allowedValues, T defaultValue); + MutablePrismPropertyDefinition createPropertyDefinition(QName name, QName typeName, Collection> allowedValues, T defaultValue); } 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 26953677293..ea78952ee2a 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 @@ -27036,6 +27036,18 @@ + + + + Display properties of the parameter. + + + 4.4 + true + SearchFilterParameterType.display + + + diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java index 14086c73657..b28c9c4e011 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/ReportServiceImpl.java @@ -485,11 +485,9 @@ public VariablesMap getParameters(Task task) { for (Item item : items) { PrismProperty pp = (PrismProperty) item; String paramName = pp.getPath().lastName().getLocalPart(); - Object value; - if (item.isSingleValue()) { + Object value = null; + if (!pp.getRealValues().isEmpty()) { value = pp.getRealValues().iterator().next(); - } else { - value = pp.getRealValues(); } variables.put(paramName, new TypedValue(value, ((PrismProperty) item).getValueClass())); } diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/CsvController.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/CsvController.java index 6d326220885..c7a9f180301 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/CsvController.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/CsvController.java @@ -131,7 +131,7 @@ public byte[] processCollection(String nameOfReport, ObjectCollectionReportEngin .getObject(type, ref.getOid(), null, task, result) .asObjectable(); } - + initializationParameters(collectionConfig.getParameter(), task); CompiledObjectCollectionView compiledCollection = createCompiledView(collectionConfig, collection); return createTableBox(collectionRefSpecification, compiledCollection, @@ -234,8 +234,8 @@ private byte[] createTableBox(CollectionRefSpecificationType collection, Compile cleanUpVariables(); return true; }; - getReportService().getModelInteractionService().searchObjectFromCollection(collection, compiledCollection.getContainerType(), handler, - options, null, getReportService().getParameters(task), task, result, true); + searchObjectFromCollection(collection, compiledCollection.getContainerType(), handler, + options, null, task, result, true); CSVFormat csvFormat = createCsvFormat(); if (Boolean.TRUE.equals(isHeader())) { diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/FileFormatController.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/FileFormatController.java index d812d526eb2..21843d4d2b7 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/FileFormatController.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/FileFormatController.java @@ -8,11 +8,16 @@ import java.io.IOException; import java.util.*; +import java.util.function.Predicate; import javax.xml.datatype.XMLGregorianCalendar; import javax.xml.namespace.QName; +import com.evolveum.midpoint.prism.query.ObjectPaging; import com.evolveum.midpoint.report.api.ReportConstants; +import com.evolveum.midpoint.schema.GetOperationOptions; +import com.evolveum.midpoint.schema.SelectorOptions; + import com.google.common.collect.ImmutableSet; import org.apache.commons.lang3.ObjectUtils; import org.jetbrains.annotations.NotNull; @@ -440,6 +445,25 @@ protected void evaluateSubreportParameters(List subrepor } protected void cleanUpVariables() { + variables.clear(); variables = null; } + + protected void initializationParameters(List parametersType, Task task) { + VariablesMap variables = getReportService().getParameters(task); + for (SearchFilterParameterType parameter : parametersType) { + if (!variables.containsKey(parameter.getName())) { + variables.put(parameter.getName(), null, String.class); + } + } + parameters = variables; + } + + protected void searchObjectFromCollection(CollectionRefSpecificationType collectionConfig, QName typeForFilter, Predicate handler, + Collection> defaultOptions, ObjectPaging paging, Task task, OperationResult result, boolean recordProgress) + throws SchemaException, ObjectNotFoundException, SecurityViolationException, CommunicationException, ConfigurationException, ExpressionEvaluationException { + checkVariables(task); + getReportService().getModelInteractionService().searchObjectFromCollection( + collectionConfig, typeForFilter, handler, defaultOptions, paging, variables, task, result, recordProgress); + } } diff --git a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/HtmlController.java b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/HtmlController.java index 2356d1f0ba5..073e6375a70 100644 --- a/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/HtmlController.java +++ b/model/report-impl/src/main/java/com/evolveum/midpoint/report/impl/controller/fileformat/HtmlController.java @@ -19,6 +19,7 @@ import com.evolveum.midpoint.prism.Containerable; import com.evolveum.midpoint.prism.PrismContainer; import com.evolveum.midpoint.prism.PrismContainerDefinition; +import com.evolveum.midpoint.report.api.ReportConstants; import com.evolveum.midpoint.schema.expression.VariablesMap; import com.evolveum.midpoint.task.api.RunningTask; @@ -183,6 +184,8 @@ public byte[] processCollection(String nameOfReport, ObjectCollectionReportEngin .asObjectable(); } + initializationParameters(collectionConfig.getParameter(), task); + ClassLoader classLoader = getClass().getClassLoader(); InputStream in = classLoader.getResourceAsStream(REPORT_CSS_STYLE_FILE_NAME); if (in == null) { @@ -322,8 +325,8 @@ private ContainerTag createTableBox(String tableLabel, CollectionRefSpecificatio cleanUpVariables(); return true; }; - getReportService().getModelInteractionService().searchObjectFromCollection(collection, compiledCollection.getContainerType(), handler, options, - null, getReportService().getParameters(task), task, result, recordProgress); + searchObjectFromCollection(collection, compiledCollection.getContainerType(), handler, options, + null, task, result, recordProgress); if (tBody.getNumChildren() == 0 && !recordProgress) { return null; } diff --git a/model/report-impl/src/test/resources/reports/report-object-collection-with-param.xml b/model/report-impl/src/test/resources/reports/report-object-collection-with-param.xml index 1b1955e3210..49b795914f8 100644 --- a/model/report-impl/src/test/resources/reports/report-object-collection-with-param.xml +++ b/model/report-impl/src/test/resources/reports/report-object-collection-with-param.xml @@ -22,6 +22,10 @@ + + givenName + string + UserType