From 856d9d3a880c1e0546d065f706060508b911e55b Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 11 Jun 2020 17:28:05 +0200 Subject: [PATCH 01/17] reference search field autocomplete --- .../autocomplete/ReferenceConverter.java | 2 +- .../search/ReferenceAutocomplete.java | 3 +- .../component/search/ReferencePopupPanel.java | 39 +++++++++++++------ .../web/component/search/SearchItemPanel.java | 9 ++++- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java index 2af853ffdab..99aae49d14f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/api/component/autocomplete/ReferenceConverter.java @@ -57,7 +57,7 @@ public ObjectReferenceType convertToObject(String value, Locale locale) throws C if (CollectionUtils.isNotEmpty(objectsList)){ return ObjectTypeUtil.createObjectRefWithFullObject(objectsList.get(0), pageBase.getPrismContext()); } - return originConverter.convertToObject(value, locale); + return null; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java index 0a9e60b2233..8debf2132ff 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceAutocomplete.java @@ -20,6 +20,7 @@ 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.commons.collections.iterators.ArrayIterator; import org.apache.commons.lang.StringUtils; import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer; import org.apache.wicket.markup.html.form.FormComponent; @@ -49,7 +50,7 @@ public Iterator getIterator(String input) { FormComponent inputField = getBaseFormComponent(); String realInput = StringUtils.isEmpty(input) ? inputField.getRawInput() : input; if (StringUtils.isEmpty(realInput)){ - return null; + return new ArrayIterator(); } ObjectQuery query = pageBase.getPrismContext().queryFor(AbstractRoleType.class) .item(ObjectType.F_NAME) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java index d9553b9d27d..510077a4313 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java @@ -10,6 +10,7 @@ import java.util.List; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteReferenceRenderer; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -32,7 +33,7 @@ import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -public class ReferencePopupPanel extends SearchPopupPanel { +public class ReferencePopupPanel extends BasePanel> { private static final long serialVersionUID = 1L; @@ -72,7 +73,23 @@ protected void onUpdate(AjaxRequestTarget target) { oidField.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); add(oidField); - ReferenceAutocomplete nameField = new ReferenceAutocomplete(ID_NAME, Model.of(getModelObject().getValue()), + ReferenceAutocomplete nameField = new ReferenceAutocomplete(ID_NAME, new IModel() { + private static final long serialVersionUID = 1L; + + @Override + public ObjectReferenceType getObject() { + return getModelObject().getValue(); + } + + @Override + public void setObject(ObjectReferenceType ref) { + if (ref == null){ + return; + } + getModelObject().getValue().setOid(ref.getOid()); + getModelObject().getValue().setType(ref.getType()); + } + }, new AutoCompleteReferenceRenderer(), getPageBase()){ @@ -89,15 +106,15 @@ protected Class getReferenceTargetObjectType(){ }; -// nameField.add(new AjaxFormComponentUpdatingBehavior("blur") { -// -// private static final long serialVersionUID = 1L; -// -// @Override -// protected void onUpdate(AjaxRequestTarget target) { -// -// } -// }); + nameField.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change") { + + private static final long serialVersionUID = 1L; + + @Override + protected void onUpdate(AjaxRequestTarget target) { + + } + }); nameField.setOutputMarkupId(true); nameField.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); add(nameField); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java index 3fc4e1d13e8..f87a316a26f 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java @@ -181,6 +181,11 @@ public void onSubmit(AjaxRequestTarget target) { AjaxSubmitButton removeButton = new AjaxSubmitButton(ID_REMOVE_BUTTON) { private static final long serialVersionUID = 1L; + @Override + public void onError(AjaxRequestTarget target){ + String e =""; + } + @Override public void onSubmit(AjaxRequestTarget target) { deletePerformed(target); @@ -368,8 +373,8 @@ public DisplayableValue getObject() { } }; if (getModelObject() != null && SearchItem.Type.REFERENCE.equals(getModelObject().getType())) { - SearchPopupPanel value = - (SearchPopupPanel) new ReferencePopupPanel(ID_VALUE, new PropertyModel<>(getModel(), "value")) { + ReferencePopupPanel value = + new ReferencePopupPanel(ID_VALUE, new PropertyModel<>(getModel(), "value")) { private static final long serialVersionUID = 1L; From b840f7fb2074570cd3985dbc1ad77b57aedb9d41 Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 17 Jun 2020 16:31:34 +0200 Subject: [PATCH 02/17] SearchFilterType configure component, not finished --- .../panel/SearchFilterPanelFactory.java | 16 ++ .../AbstractSearchConfigurationPanel.java | 16 +- .../search/BasicSearchFilterModel.java | 68 ++++++++ .../web/component/search/SearchPanel.java | 18 +- .../search/SearchPropertiesConfigPanel.java | 156 +++++++++--------- .../search/filter/BasicSearchFilter.java | 101 ++++++++++++ .../component/search/filter/SearchFilter.java | 58 +++++++ .../search/filter/ValueSearchFilterItem.java | 57 +++++++ .../SearchFilterConfigurationPanel.html | 19 +++ .../SearchFilterConfigurationPanel.java | 71 ++++++++ 10 files changed, 490 insertions(+), 90 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java index 1d543adc758..0cca743bd22 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java @@ -9,6 +9,15 @@ import javax.annotation.PostConstruct; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper; +import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper; + +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.web.page.admin.reports.component.SearchFilterConfigurationPanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectCollectionType; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + import org.apache.wicket.markup.html.panel.Panel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -34,6 +43,13 @@ public boolean match(IW wrapper) { @Override protected Panel getPanel(PrismPropertyPanelContext panelCtx) { + PrismPropertyWrapper searchFilterItemWrapper = panelCtx.unwrapWrapperModel(); + PrismContainerValueWrapper containerWrapper = searchFilterItemWrapper.getParent(); + if (containerWrapper != null && containerWrapper.getRealValue() instanceof ObjectCollectionType){ + ObjectCollectionType collectionObj = (ObjectCollectionType) containerWrapper.getRealValue(); + return new SearchFilterConfigurationPanel(panelCtx.getComponentId(), panelCtx.getRealValueModel(), + (Class)WebComponentUtil.qnameToClass(panelCtx.getPageBase().getPrismContext(), collectionObj.getType())); + } return new AceEditorPanel(panelCtx.getComponentId(), null, new SearchFilterTypeModel(panelCtx.getRealValueModel(), panelCtx.getPageBase()), 10); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java index 315371d54d8..61355ab5571 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java @@ -6,6 +6,10 @@ */ package com.evolveum.midpoint.web.component.search; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.web.component.search.filter.SearchFilter; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.model.IModel; @@ -20,7 +24,7 @@ /** * @author Kateryna Honchar */ -public abstract class AbstractSearchConfigurationPanel extends BasePanel { +public abstract class AbstractSearchConfigurationPanel extends BasePanel { private static final long serialVersionUID = 1L; private static final Trace LOG = TraceManager.getTrace(AbstractSearchConfigurationPanel.class); @@ -31,8 +35,11 @@ public abstract class AbstractSearchConfigurationPanel extends BasePanel private static final String ID_SAVE_FILTER_BUTTON = "saveFilterButton"; private static final String ID_CANCEL_BUTTON = "cancelButton"; - public AbstractSearchConfigurationPanel(String id, IModel searchModel) { + private Class type; + + public AbstractSearchConfigurationPanel(String id, IModel searchModel, Class type) { super(id, searchModel); + this.type = type; } @Override @@ -92,6 +99,7 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { protected abstract void initConfigurationPanel(WebMarkupContainer configPanel); - @NotNull - protected abstract Class getObjectClass(); + public Class getType() { + return type; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java new file mode 100644 index 00000000000..13b631e1d65 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java @@ -0,0 +1,68 @@ +/* + * Copyright (c) 2010-2019 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.search; + +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.gui.impl.factory.panel.SearchFilterTypeModel; +import com.evolveum.midpoint.prism.query.ObjectFilter; +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.search.filter.BasicSearchFilter; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + +import org.apache.commons.lang3.StringUtils; +import org.apache.wicket.model.IModel; + +/** + * @author honchar + */ +public class BasicSearchFilterModel implements IModel> { + + private static final Trace LOGGER = TraceManager.getTrace(SearchFilterTypeModel.class); + + private static final long serialVersionUID = 1L; + + private IModel baseModel; + private PageBase pageBase; + private Class type; + + public BasicSearchFilterModel(IModel valueWrapper, Class type, PageBase pageBase) { + this.baseModel = valueWrapper; + this.pageBase = pageBase; + this.type = type; + } + + @Override + public void detach() { + // TODO Auto-generated method stub + + } + + @Override + public BasicSearchFilter getObject() { + try { + SearchFilterType value = baseModel.getObject(); + if (value == null) { + return null; + } + + ObjectFilter objectFilter = pageBase.getPrismContext().getQueryConverter().createObjectFilter(type, baseModel.getObject()); + return new BasicSearchFilter(pageBase.getPrismContext(), objectFilter, type); + } catch (SchemaException e) { + // TODO handle + LoggingUtils.logUnexpectedException(LOGGER, "Cannot serialize filter", e); + } + return null; + } + + @Override + public void setObject(BasicSearchFilter object) { + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java index 1ccb1e72f90..da75d1b865b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPanel.java @@ -785,14 +785,14 @@ private boolean isFullTextSearchEnabled(){ } private void searchConfigurationPerformed(AjaxRequestTarget target){ - SearchPropertiesConfigPanel configPanel = new SearchPropertiesConfigPanel(getPageBase().getMainPopupBodyId(), getModel()) { - private static final long serialVersionUID = 1L; - - @Override - protected @NotNull Class getObjectClass() { - return SearchPanel.this.getModelObject().getType(); - } - }; - getPageBase().showMainPopup(configPanel, target); +// SearchPropertiesConfigPanel configPanel = new SearchPropertiesConfigPanel(getPageBase().getMainPopupBodyId(), getModel()) { +// private static final long serialVersionUID = 1L; +// +// @Override +// protected @NotNull Class getObjectClass() { +// return SearchPanel.this.getModelObject().getType(); +// } +// }; +// getPageBase().showMainPopup(configPanel, target); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java index 2965f419c92..c292a681fd5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java @@ -7,9 +7,14 @@ package com.evolveum.midpoint.web.component.search; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; +import com.evolveum.midpoint.web.component.input.TextPanel; +import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; + +import com.evolveum.midpoint.web.component.search.filter.ValueSearchFilterItem; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; @@ -27,15 +32,12 @@ import org.apache.wicket.model.StringResourceModel; import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; -import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; -import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.SelectableListDataProvider; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; @@ -43,7 +45,7 @@ /** * @author Kateryna Honchar */ -public abstract class SearchPropertiesConfigPanel extends AbstractSearchConfigurationPanel implements Popupable { +public class SearchPropertiesConfigPanel extends AbstractSearchConfigurationPanel, O> implements Popupable { private static final long serialVersionUID = 1L; private static final String ID_PROPERTY_CONFIG_CONTAINER = "propertyConfigContainer"; @@ -57,8 +59,8 @@ public abstract class SearchPropertiesConfigPanel extends AbstractSearchConfigur IModel propertyChoiceModel = Model.of(); - public SearchPropertiesConfigPanel(String id, IModel searchModel) { - super(id, searchModel); + public SearchPropertiesConfigPanel(String id, IModel> searchModel, Class type) { + super(id, searchModel, type); } @Override @@ -133,11 +135,11 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { } private void initTable(WebMarkupContainer configPanel) { - SelectableListDataProvider, SearchConfigDto> provider = - new SelectableListDataProvider, SearchConfigDto>(getPageBase(), getSearchConfigModel()); - List, String>> columns = getTableColumns(); - BoxedTablePanel> table = - new BoxedTablePanel>(ID_PROPERTIES_TABLE, provider, columns, null, 20) { + SelectableListDataProvider, ValueSearchFilterItem> provider = + new SelectableListDataProvider, ValueSearchFilterItem>(getPageBase(), getSearchFilterItemModel()); + List, String>> columns = getTableColumns(); + BoxedTablePanel> table = + new BoxedTablePanel>(ID_PROPERTIES_TABLE, provider, columns, null, 20) { private static final long serialVersionUID = 1L; @Override @@ -185,24 +187,24 @@ public boolean isAutoRefreshEnabled() { configPanel.addOrReplace(table); } - private List, String>> getTableColumns() { - List, String>> columns = new ArrayList<>(); + private List, String>> getTableColumns() { + List, String>> columns = new ArrayList<>(); - CheckBoxHeaderColumn> checkboxColumn = new CheckBoxHeaderColumn<>(); + CheckBoxHeaderColumn> checkboxColumn = new CheckBoxHeaderColumn<>(); columns.add(checkboxColumn); - IColumn, String> propertyColumn = new PropertyColumn, String>(getPageBase() + IColumn, String> propertyColumn = new PropertyColumn, String>(getPageBase() .createStringResource("SearchPropertiesConfigPanel.table.column.property"), - "value." + SearchConfigDto.F_PROPERTY + "." + Property.F_NAME); + "value.filter.fullPath"); columns.add(propertyColumn); - IColumn, String> valueColumn = new AbstractColumn, String>(getPageBase() + IColumn, String> valueColumn = new AbstractColumn, String>(getPageBase() .createStringResource("SearchPropertiesConfigPanel.table.column.value")) { private static final long serialVersionUID = 1L; @Override - public void populateItem(Item>> item, String id, IModel> rowModel) { - TextPanel valuePanel = new TextPanel(id, new PropertyModel(rowModel, "value." + SearchConfigDto.F_VALUE)); + public void populateItem(Item>> item, String id, IModel> rowModel) { + TextPanel valuePanel = new TextPanel(id, new PropertyModel(rowModel, "value." + ValueSearchFilterItem.F_VALUE)); valuePanel.setOutputMarkupId(true); valuePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); item.add(valuePanel); @@ -210,81 +212,81 @@ public void populateItem(Item>> i } }; columns.add(valueColumn); - - IColumn, String> filterColumn = new AbstractColumn, String>(getPageBase() - .createStringResource("SearchPropertiesConfigPanel.table.column.filter")) { - private static final long serialVersionUID = 1L; - - @Override - public void populateItem(Item>> item, String id, IModel> rowModel) { - DropDownChoicePanel filterPanel = WebComponentUtil.createEnumPanel(id, - Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), - new PropertyModel<>(rowModel, "value." + SearchConfigDto.F_FILTER_TYPE), - SearchPropertiesConfigPanel.this, true, - getPageBase().createStringResource("SearchPropertiesConfigPanel.selectFilter").getString()); - filterPanel.setOutputMarkupId(true); - filterPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); - item.add(filterPanel); - } - }; - columns.add(filterColumn); - - IColumn, String> matchingRuleColumn = new AbstractColumn, String>(getPageBase() - .createStringResource("SearchPropertiesConfigPanel.table.column.matchingRule")) { - private static final long serialVersionUID = 1L; - - @Override - public void populateItem(Item>> item, String id, IModel> rowModel) { - DropDownChoicePanel matchingRulePanel = WebComponentUtil.createEnumPanel(id, - Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), - new PropertyModel<>(rowModel, "value." + SearchConfigDto.F_MATCHING_RULE), - SearchPropertiesConfigPanel.this, true, - getPageBase().createStringResource("SearchPropertiesConfigPanel.selectMatchingRule").getString()); - matchingRulePanel.setOutputMarkupId(true); - matchingRulePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); - item.add(matchingRulePanel); - } - }; - columns.add(matchingRuleColumn); - - CheckBoxColumn> negationColumn = new CheckBoxColumn>(getPageBase() - .createStringResource("SearchPropertiesConfigPanel.table.column.applyNegotiation"), - "value." + SearchConfigDto.F_NEGATION); - columns.add(negationColumn); +// +// IColumn, String> filterColumn = new AbstractColumn, String>(getPageBase() +// .createStringResource("SearchPropertiesConfigPanel.table.column.filter")) { +// private static final long serialVersionUID = 1L; +// +// @Override +// public void populateItem(Item>> item, String id, IModel> rowModel) { +// DropDownChoicePanel filterPanel = WebComponentUtil.createEnumPanel(id, +// Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), +// new PropertyModel<>(rowModel, "value." + SearchConfigDto.F_FILTER_TYPE), +// SearchPropertiesConfigPanel.this, true, +// getPageBase().createStringResource("SearchPropertiesConfigPanel.selectFilter").getString()); +// filterPanel.setOutputMarkupId(true); +// filterPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); +// item.add(filterPanel); +// } +// }; +// columns.add(filterColumn); + +// IColumn, String> matchingRuleColumn = new AbstractColumn, String>(getPageBase() +// .createStringResource("SearchPropertiesConfigPanel.table.column.matchingRule")) { +// private static final long serialVersionUID = 1L; +// +// @Override +// public void populateItem(Item>> item, String id, IModel> rowModel) { +// DropDownChoicePanel matchingRulePanel = WebComponentUtil.createEnumPanel(id, +// Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), +// new PropertyModel<>(rowModel, "value." + SearchConfigDto.F_MATCHING_RULE), +// SearchPropertiesConfigPanel.this, true, +// getPageBase().createStringResource("SearchPropertiesConfigPanel.selectMatchingRule").getString()); +// matchingRulePanel.setOutputMarkupId(true); +// matchingRulePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); +// item.add(matchingRulePanel); +// } +// }; +// columns.add(matchingRuleColumn); +// +// CheckBoxColumn> negationColumn = new CheckBoxColumn>(getPageBase() +// .createStringResource("SearchPropertiesConfigPanel.table.column.applyNegotiation"), +// "value." + SearchConfigDto.F_NEGATION); +// columns.add(negationColumn); return columns; } private List getAvailablePropertiesList() { - PrismObjectDefinition objectDef = SearchFactory.findObjectDefinition(getObjectClass(), null, getPageBase()); + PrismObjectDefinition objectDef = SearchFactory.findObjectDefinition(getType(), null, getPageBase()); List availableDefs = SearchFactory.getAvailableDefinitions(objectDef, true); List propertiesList = new ArrayList<>(); availableDefs.forEach(searchItemDef -> propertiesList.add(new Property(searchItemDef.getDef()))); return propertiesList; } - private LoadableModel> getSearchConfigModel() { - return new LoadableModel>(true) { + private LoadableModel> getSearchFilterItemModel() { + return new LoadableModel>(true) { private static final long serialVersionUID = 1L; @Override - protected List load() { - List searchConfigDtos = new ArrayList<>(); - getModelObject().getItems().forEach(searchItem -> { - searchConfigDtos.add(SearchConfigDto.createSearchConfigDto(searchItem)); - }); - return searchConfigDtos; + protected List load() { + BasicSearchFilter basicSearchFilter = getModelObject(); + if (basicSearchFilter == null){ + return new ArrayList<>(); + } + return basicSearchFilter.getValueSearchFilterItems(); } }; } private void propertyAddedPerformed(AjaxRequestTarget target) { - Property newPropertyValue = propertyChoiceModel.getObject(); - if (newPropertyValue != null) { - getModelObject().addItem(newPropertyValue.getDefinition()); - initTable((WebMarkupContainer) get(ID_CONFIGURATION_PANEL)); //todo don't re-init table! - target.add(get(createComponentPath(ID_CONFIGURATION_PANEL, ID_PROPERTIES_TABLE))); - } - target.add(SearchPropertiesConfigPanel.this); +// Property newPropertyValue = propertyChoiceModel.getObject(); +// if (newPropertyValue != null) { +// getModelObject().addItem(newPropertyValue.getDefinition()); +// initTable((WebMarkupContainer) get(ID_CONFIGURATION_PANEL)); //todo don't re-init table! +// target.add(get(createComponentPath(ID_CONFIGURATION_PANEL, ID_PROPERTIES_TABLE))); +// } +// target.add(SearchPropertiesConfigPanel.this); } private Property getSelectedProperty() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java new file mode 100644 index 00000000000..d2240580809 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java @@ -0,0 +1,101 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.search.filter; + +import java.util.Arrays; +import java.util.List; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.query.*; +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; + +/** + * @author honchar + */ +public class BasicSearchFilter extends SearchFilter { + + private static final long serialVersionUID = 1L; + private static final Trace LOGGER = TraceManager.getTrace(BasicSearchFilter.class); + + private LogicalFilterValue logicalFilterValue = LogicalFilterValue.AND; + + public BasicSearchFilter(PrismContext prismContext, ObjectFilter baseFilter, Class type) { + super(prismContext, baseFilter, type); + } + + @Override + public void addSearchFilterItem(ValueSearchFilterItem valueSearchFilterItem) { + if (!(valueSearchFilterItem instanceof ValueFilter)) { + LOGGER.error("Impossible to add another than ValueFilter to BasicSearchFilter search filter items list"); + } + getValueSearchFilterItems().add(valueSearchFilterItem); + } + +// public ObjectFilter convertToObjectFilter() { +// if (CollectionUtils.isEmpty(getSearchFilterItems())) { +// return null; +// } +// List subFilterList = new ArrayList<>(); +// getSearchFilterItems().forEach(searchFilterItem -> { +// subFilterList.add(((ValueSearchFilterItem) searchFilterItem).buildObjectFilter()); +// }); +// if (logicalFilterItem == null && subFilterList.size() == 1) { +// return subFilterList.get(0); +// } +// if (logicalFilterItem == null) { +// logicalFilterItem = getPrismContext().queryFactory().createAnd(); +// } +// if (logicalFilterItem instanceof OrSearchFilterItem) { +// return getPrismContext().queryFactory().createOr(subFilterList); +// } else { +// return getPrismContext().queryFactory().createAnd(subFilterList); +// } +// } + + protected void initSearchFilterItems(ObjectFilter baseFilter) { + if (baseFilter == null) { + return; + } + if (baseFilter instanceof AndFilter) { + logicalFilterValue = LogicalFilterValue.AND; + + AndFilter andFilter = (AndFilter) baseFilter; + addValueFilters(andFilter.getConditions()); + } else if (baseFilter instanceof OrFilter) { + logicalFilterValue = LogicalFilterValue.OR; + + OrFilter orFilter = (OrFilter) baseFilter; + addValueFilters(orFilter.getConditions()); + } else if (baseFilter instanceof ValueFilter) { + addValueFilters(Arrays.asList(baseFilter)); + } + } + + public void addValueFilters(List objectFilters) { + objectFilters.forEach(filter -> { + boolean applyNegation = false; + if (filter instanceof NotFilter){ + applyNegation = true; + } + ObjectFilter realFilter = applyNegation ? ((NotFilter) filter).getFilter() : filter; + if (realFilter instanceof ValueFilter) { + ValueSearchFilterItem filterItem = new ValueSearchFilterItem((ValueFilter)realFilter, applyNegation); + addSearchFilterItem(filterItem); + } + }); + } + + public LogicalFilterValue getLogicalFilterValue() { + return logicalFilterValue; + } + + public void setLogicalFilterValue(LogicalFilterValue logicalFilterValue) { + this.logicalFilterValue = logicalFilterValue; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java new file mode 100644 index 00000000000..f2ab52ff62e --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.search.filter; + +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; + +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * @author honchar + */ +public abstract class SearchFilter implements Serializable { + + private static final long serialVersionUID = 1L; + private List valueSearchFilterItems = new ArrayList<>(); +// private LogicalSearchFilterItem logicalSearchFilterItem; + private PrismContext prismContext; + private ObjectFilter baseFilter; + Class type; + + public enum LogicalFilterValue{ + AND, + OR; + } + + public SearchFilter(PrismContext prismContext, ObjectFilter baseFilter, Class type){ + this.prismContext = prismContext; + this.baseFilter = baseFilter; + this.type = type; + + initSearchFilterItems(baseFilter); + } + + public List getValueSearchFilterItems() { + return valueSearchFilterItems; //todo return unmodifiable list + } + + public abstract void addSearchFilterItem(ValueSearchFilterItem valueSearchFilterItem); + + protected abstract void initSearchFilterItems(ObjectFilter baseFilter); + + public Class getType(){ + return type; + } + + + public PrismContext getPrismContext() { + return prismContext; + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java new file mode 100644 index 00000000000..bbd0031e9db --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.search.filter; + +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismContext; +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.prism.query.ValueFilter; + +import org.apache.commons.collections.CollectionUtils; + +import java.io.Serializable; + +/** + * @author honchar + */ +public class ValueSearchFilterItem implements Serializable { + + private static final long serialVersionUID = 1L; + public static final String F_VALUE = "value"; + + private boolean applyNegation; + private ValueFilter filter; + + public ValueSearchFilterItem(ValueFilter filter, boolean applyNegation){ + this.filter = filter; + this.applyNegation = applyNegation; + } + + public boolean isApplyNegation() { + return applyNegation; + } + + public void setApplyNegation(boolean applyNegation) { + this.applyNegation = applyNegation; + } + + public ValueFilter getFilter() { + return filter; + } + + public void setFilter(ValueFilter filter) { + this.filter = filter; + } + + public V getValue(){ + if (filter == null || CollectionUtils.isEmpty(filter.getValues())){ + return null; + } + return filter.getValues().get(0); + } +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.html new file mode 100644 index 00000000000..ea492496de9 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.html @@ -0,0 +1,19 @@ + + + + +
+
+
+ + + +
+
+ + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java new file mode 100644 index 00000000000..27a94a35388 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.page.admin.reports.component; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.gui.impl.factory.panel.SearchFilterTypeModel; +import com.evolveum.midpoint.prism.query.ObjectFilter; +import com.evolveum.midpoint.web.component.search.BasicSearchFilterModel; +import com.evolveum.midpoint.web.component.search.SearchPropertiesConfigPanel; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; +import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; + +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.markup.html.AjaxLink; +import org.apache.wicket.model.IModel; +import org.jetbrains.annotations.NotNull; + +import javax.xml.namespace.QName; + +/** + * @author honchar + */ +public class SearchFilterConfigurationPanel extends BasePanel { + private static final long serialVersionUID = 1L; + + private static final String ID_ACE_EDITOR_FIELD = "aceEditorField"; + private static final String ID_CONFIGURE_BUTTON = "configureButton"; + + Class filterType; + + public SearchFilterConfigurationPanel(String id, IModel model, Class filterType){ + super(id, model); + this.filterType = filterType; + } + + @Override + protected void onInitialize(){ + super.onInitialize(); + initLayout(); + } + + private void initLayout(){ + AceEditorPanel aceEditorField = new AceEditorPanel(ID_ACE_EDITOR_FIELD, null, new SearchFilterTypeModel(getModel(), getPageBase()), 10); + aceEditorField.setOutputMarkupId(true); + add(aceEditorField); + + AjaxLink searchConfigurationButton = new AjaxLink(ID_CONFIGURE_BUTTON) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + searchConfigurationPerformed(target); + } + }; +// searchConfigurationButton.add(new VisibleBehaviour(() -> false)); + searchConfigurationButton.setOutputMarkupId(true); + add(searchConfigurationButton); + + } + + private void searchConfigurationPerformed(AjaxRequestTarget target){ + SearchPropertiesConfigPanel configPanel = new SearchPropertiesConfigPanel(getPageBase().getMainPopupBodyId(), + new BasicSearchFilterModel(getModel(), filterType, getPageBase()), filterType); + getPageBase().showMainPopup(configPanel, target); + } +} From faa8b9e4966923d1e566755b3638aa699845a27f Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 18 Jun 2020 11:23:40 +0200 Subject: [PATCH 03/17] style fix for ace editor panel --- .../admin/reports/component/AceEditorPanel.html | 4 +++- .../admin/reports/component/AceEditorPanel.java | 17 ++++++++++------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.html index 281057c5fc7..cdcb7e4dfee 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.html @@ -8,7 +8,9 @@ -

+
+

+

diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.java index 3e77c96b71b..054a91b0ce6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/AceEditorPanel.java @@ -9,8 +9,10 @@ import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.web.component.AceEditor; +import com.evolveum.midpoint.web.component.util.VisibleBehaviour; import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour; +import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.model.IModel; @@ -20,6 +22,7 @@ public class AceEditorPanel extends BasePanel { private static final String ID_TITLE = "title"; + private static final String ID_TITLE_CONTAINER = "titleContainer"; private static final String ID_EDITOR = "editor"; private IModel title; @@ -40,14 +43,14 @@ public AceEditorPanel(String id, IModel title, IModel data, int private void initLayout(int minSize) { + WebMarkupContainer titleContainer = new WebMarkupContainer(ID_TITLE_CONTAINER); + titleContainer.setOutputMarkupId(true); + titleContainer.add(new VisibleBehaviour(() -> title != null)); + add(titleContainer); + Label title = new Label(ID_TITLE, this.title); - title.add(new VisibleEnableBehaviour() { - @Override - public boolean isVisible() { - return title != null; - } - }); - add(title); + title.setOutputMarkupId(true); + titleContainer.add(title); AceEditor editor = new AceEditor(ID_EDITOR, getModel()); editor.setReadonly(false); From 638ba33a4c111b6d314760220fd073d2747f9260 Mon Sep 17 00:00:00 2001 From: kate Date: Fri, 19 Jun 2020 23:38:09 +0200 Subject: [PATCH 04/17] more work for search filter config panel --- .../search/ReferenceValueSearchPanel.html | 27 ++++ .../search/ReferenceValueSearchPanel.java | 138 ++++++++++++++++ ...ml => ReferenceValueSearchPopupPanel.html} | 0 ...va => ReferenceValueSearchPopupPanel.java} | 20 ++- .../web/component/search/SearchItemPanel.java | 19 +-- .../search/SearchPropertiesConfigPanel.java | 150 ++++++++++-------- .../search/filter/ValueSearchFilterItem.java | 85 ++++++++-- 7 files changed, 336 insertions(+), 103 deletions(-) create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.html create mode 100644 gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java rename gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/{ReferencePopupPanel.html => ReferenceValueSearchPopupPanel.html} (100%) rename gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/{ReferencePopupPanel.java => ReferenceValueSearchPopupPanel.java} (87%) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.html new file mode 100644 index 00000000000..634aa62edcd --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.html @@ -0,0 +1,27 @@ + + + + + +
+
+
+ + + +
+
+ +
+
+
+
+
+
+ + diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java new file mode 100644 index 00000000000..394d569bef3 --- /dev/null +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2010-2020 Evolveum and contributors + * + * This work is dual-licensed under the Apache License 2.0 + * and European Union Public License. See LICENSE file for details. + */ +package com.evolveum.midpoint.web.component.search; + +import com.evolveum.midpoint.gui.api.component.BasePanel; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.prism.PrismReferenceDefinition; +import com.evolveum.midpoint.web.component.AjaxButton; +import com.evolveum.midpoint.web.component.input.TextPanel; + +import com.evolveum.midpoint.xml.ns._public.common.common_3.AreaCategoryType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; + +import org.apache.commons.lang.StringUtils; +import org.apache.wicket.Component; +import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; + +import javax.xml.namespace.QName; +import java.util.List; + +/** + * @author honchar + */ +public class ReferenceValueSearchPanel extends BasePanel { + + private static final long serialVersionUID = 1L; + + private static final String ID_REFERENCE_VALUE_TEXT_FIELD = "referenceValueTextField"; + private static final String ID_EDIT_BUTTON = "editButton"; + private static final String ID_REF_POPOVER_PANEL = "refPopoverPanel"; + private static final String ID_REF_POPOVER_BODY = "refPopoverBody"; + private static final String ID_REF_POPOVER = "refPopover"; + private PrismReferenceDefinition referenceDef; + + public ReferenceValueSearchPanel(String id, IModel model, PrismReferenceDefinition referenceDef) { + super(id, model); + this.referenceDef = referenceDef; + } + + @Override + protected void onInitialize(){ + super.onInitialize(); + initLayout(); + } + + private void initLayout(){ + TextPanel referenceTextValueField = new TextPanel(ID_REFERENCE_VALUE_TEXT_FIELD, Model.of(getReferenceTextModel())); + referenceTextValueField.setOutputMarkupId(true); + add(referenceTextValueField); + + AjaxButton editButton = new AjaxButton(ID_EDIT_BUTTON) { + private static final long serialVersionUID = 1L; + + @Override + public void onClick(AjaxRequestTarget target) { + togglePopover(target, ReferenceValueSearchPanel.this.get(ID_REFERENCE_VALUE_TEXT_FIELD), + ReferenceValueSearchPanel.this.get(createComponentPath(ID_REF_POPOVER)), 0); + } + }; + editButton.setOutputMarkupId(true); + add(editButton); + + WebMarkupContainer popover = new WebMarkupContainer(ID_REF_POPOVER); + popover.setOutputMarkupId(true); + add(popover); + + WebMarkupContainer popoverBody = new WebMarkupContainer(ID_REF_POPOVER_BODY); + popoverBody.setOutputMarkupId(true); + popover.add(popoverBody); + + ReferenceValueSearchPopupPanel value = + new ReferenceValueSearchPopupPanel(ID_REF_POPOVER_PANEL, getModel()) { + + private static final long serialVersionUID = 1L; + + @Override + protected List getAllowedRelations() { + return WebComponentUtil.getCategoryRelationChoices(AreaCategoryType.ADMINISTRATION, getPageBase()); + } + + @Override + protected List getSupportedTargetList() { + return WebComponentUtil.createSupportedTargetTypeList((referenceDef).getTargetTypeName()); + } + + @Override + protected void confirmPerformed(AjaxRequestTarget target) { + } + }; + value.setRenderBodyOnly(true); + popoverBody.add(value); + + } + + private String getReferenceTextModel(){ + ObjectReferenceType ref = getModelObject(); + if (ref == null){ + return null; + } + StringBuilder sb = new StringBuilder(); + if (StringUtils.isNotEmpty(ref.getOid())){ + sb.append(createStringResource("ReferencePopupPanel.oid").getString()); + sb.append(ref.getOid()); + } + if (ref.getRelation() != null){ + if (sb.length() > 0){ + sb.append("; "); + } + sb.append(createStringResource("ReferencePopupPanel.relation").getString()); + sb.append(ref.getRelation().getLocalPart()); + } + if (ref.getType() != null){ + if (sb.length() > 0){ + sb.append("; "); + } + sb.append(ref.getType().getLocalPart()); + } + return sb.toString(); + } + + public void togglePopover(AjaxRequestTarget target, Component button, Component popover, int paddingRight) { + StringBuilder script = new StringBuilder(); + script.append("toggleSearchPopover('"); + script.append(button.getMarkupId()).append("','"); + script.append(popover.getMarkupId()).append("',"); + script.append(paddingRight).append(");"); + + target.appendJavaScript(script.toString()); + } + +} diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.html similarity index 100% rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.html rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.html diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java similarity index 87% rename from gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java rename to gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java index d9553b9d27d..caf8bce3dd9 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferencePopupPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPopupPanel.java @@ -10,6 +10,7 @@ import java.util.List; import javax.xml.namespace.QName; +import com.evolveum.midpoint.gui.api.component.BasePanel; import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteReferenceRenderer; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; @@ -32,7 +33,7 @@ import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; -public class ReferencePopupPanel extends SearchPopupPanel { +public class ReferenceValueSearchPopupPanel extends BasePanel { private static final long serialVersionUID = 1L; @@ -42,11 +43,8 @@ public class ReferencePopupPanel extends SearchPopupPanel< private static final String ID_RELATION = "relation"; private static final String ID_CONFIRM_BUTTON = "confirmButton"; -// private List allowedRelations; - - public ReferencePopupPanel(String id, IModel> model) { + public ReferenceValueSearchPopupPanel(String id, IModel model) { super(id, model); -// this.allowedRelations = allowedRelations; } @Override @@ -57,7 +55,7 @@ protected void onInitialize() { private void initLayout() { - TextField oidField = new TextField(ID_OID, new PropertyModel<>(getModel(), SearchValue.F_VALUE + ".oid")); + TextField oidField = new TextField(ID_OID, new PropertyModel<>(getModel(), "oid")); oidField.add(new AjaxFormComponentUpdatingBehavior("blur") { @@ -72,7 +70,7 @@ protected void onUpdate(AjaxRequestTarget target) { oidField.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); add(oidField); - ReferenceAutocomplete nameField = new ReferenceAutocomplete(ID_NAME, Model.of(getModelObject().getValue()), + ReferenceAutocomplete nameField = new ReferenceAutocomplete(ID_NAME, Model.of(getModelObject()), new AutoCompleteReferenceRenderer(), getPageBase()){ @@ -102,7 +100,7 @@ protected Class getReferenceTargetObjectType(){ nameField.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); add(nameField); - DropDownChoice type = new DropDownChoice<>(ID_TYPE, new PropertyModel(getModel(), SearchValue.F_VALUE + ".type"), + DropDownChoice type = new DropDownChoice<>(ID_TYPE, new PropertyModel(getModel(), "type"), getSupportedTargetList(), new QNameObjectTypeChoiceRenderer()); type.setNullValid(true); type.setOutputMarkupId(true); @@ -118,15 +116,15 @@ public boolean isEnabled() { type.add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); add(type); - if (getModelObject() != null && getModelObject().getValue() != null && getModelObject().getValue().getRelation() == null){ - getModelObject().getValue().setRelation(PrismConstants.Q_ANY); + if (getModelObject() != null && getModelObject().getRelation() == null){ + getModelObject().setRelation(PrismConstants.Q_ANY); } List allowedRelations = new ArrayList(); allowedRelations.addAll(getAllowedRelations()); if (!allowedRelations.contains(PrismConstants.Q_ANY)) { allowedRelations.add(0, PrismConstants.Q_ANY); } - DropDownChoice relation = new DropDownChoice<>(ID_RELATION, new PropertyModel(getModel(), SearchValue.F_VALUE + ".relation"), + DropDownChoice relation = new DropDownChoice<>(ID_RELATION, new PropertyModel(getModel(), "relation"), allowedRelations, new QNameObjectTypeChoiceRenderer()); // relation.setNullValid(true); relation.setOutputMarkupId(true); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java index 3fc4e1d13e8..375276f91b5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java @@ -15,17 +15,14 @@ import javax.xml.namespace.QName; import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import org.apache.commons.lang.StringUtils; import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; -import org.apache.wicket.ajax.AjaxEventBehavior; import org.apache.wicket.ajax.AjaxRequestTarget; import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.AttributeAppender; import org.apache.wicket.behavior.Behavior; -import org.apache.wicket.markup.ComponentTag; import org.apache.wicket.markup.html.WebMarkupContainer; import org.apache.wicket.markup.html.basic.Label; import org.apache.wicket.markup.html.form.IChoiceRenderer; @@ -355,21 +352,9 @@ private void initPopover() { popoverBody.setOutputMarkupId(true); popover.add(popoverBody); - - DisplayableValue val = SearchItemPanel.this.getModelObject().getValue(); - IModel> refModel = new IModel>() { - @Override - public DisplayableValue getObject() { - if (val.getValue() instanceof ObjectReferenceType){ - return val; - } else { - return null; - } - } - }; if (getModelObject() != null && SearchItem.Type.REFERENCE.equals(getModelObject().getType())) { - SearchPopupPanel value = - (SearchPopupPanel) new ReferencePopupPanel(ID_VALUE, new PropertyModel<>(getModel(), "value")) { + ReferenceValueSearchPopupPanel value = + new ReferenceValueSearchPopupPanel(ID_VALUE, new PropertyModel<>(getModel(), "value.value")) { private static final long serialVersionUID = 1L; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java index c292a681fd5..07e346aaf0e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java @@ -7,18 +7,37 @@ package com.evolveum.midpoint.web.component.search; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Iterator; import java.util.List; +import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; +import com.evolveum.midpoint.gui.api.page.PageBase; +import com.evolveum.midpoint.gui.api.util.WebComponentUtil; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.match.MatchingRule; +import com.evolveum.midpoint.util.DisplayableValue; +import com.evolveum.midpoint.util.QNameUtil; +import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; import com.evolveum.midpoint.web.component.input.TextPanel; +import com.evolveum.midpoint.web.component.prism.InputPanel; import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; import com.evolveum.midpoint.web.component.search.filter.ValueSearchFilterItem; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; +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.commons.lang.StringUtils; +import org.apache.poi.ss.formula.functions.T; +import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; +import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.AttributeAppender; +import org.apache.wicket.behavior.Behavior; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; @@ -32,7 +51,6 @@ import org.apache.wicket.model.StringResourceModel; import com.evolveum.midpoint.gui.api.model.LoadableModel; -import com.evolveum.midpoint.prism.PrismObjectDefinition; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; @@ -42,6 +60,10 @@ import com.evolveum.midpoint.web.component.util.SelectableListDataProvider; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; +import org.apache.wicket.model.util.ListModel; + +import javax.xml.namespace.QName; + /** * @author Kateryna Honchar */ @@ -100,26 +122,6 @@ protected String getNullValidDisplayValue() { propertyChoicePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); propertyConfigContainer.add(propertyChoicePanel); -// TextPanel valuePanel = new TextPanel(ID_PROPERTY_VALUE, Model.of()); -// valuePanel.setOutputMarkupId(true); -// propertyConfigContainer.add(valuePanel); -// -// DropDownChoicePanel filterChoice = WebComponentUtil.createEnumPanel(ID_FILTER, -// Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), Model.of(), -// SearchPropertiesConfigPanel.this, true, "Select"); //todo allow null? -// filterChoice.setOutputMarkupId(true); -// propertyConfigContainer.add(filterChoice); -// -// DropDownChoicePanel matchingRuleChoice = WebComponentUtil.createEnumPanel(ID_MATCHING_RULE, -// Model.ofList(Arrays.asList(SearchConfigDto.MatchingRule.values())), Model.of(), -// SearchPropertiesConfigPanel.this, true, "Select"); //todo allow null? -// matchingRuleChoice.setOutputMarkupId(true); -// propertyConfigContainer.add(matchingRuleChoice); -// -// CheckBoxPanel negationChoice = new CheckBoxPanel(ID_NEGATION, Model.of()); -// negationChoice.setOutputMarkupId(true); -// propertyConfigContainer.add(negationChoice); - AjaxButton addButton = new AjaxButton(ID_ADD_BUTTON) { private static final long serialVersionUID = 1L; @@ -204,55 +206,52 @@ private List, String>> getTableCol @Override public void populateItem(Item>> item, String id, IModel> rowModel) { - TextPanel valuePanel = new TextPanel(id, new PropertyModel(rowModel, "value." + ValueSearchFilterItem.F_VALUE)); - valuePanel.setOutputMarkupId(true); - valuePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); - item.add(valuePanel); + item.add(getPropertyValueField( id, rowModel)); } }; columns.add(valueColumn); -// -// IColumn, String> filterColumn = new AbstractColumn, String>(getPageBase() -// .createStringResource("SearchPropertiesConfigPanel.table.column.filter")) { -// private static final long serialVersionUID = 1L; -// -// @Override -// public void populateItem(Item>> item, String id, IModel> rowModel) { -// DropDownChoicePanel filterPanel = WebComponentUtil.createEnumPanel(id, -// Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), -// new PropertyModel<>(rowModel, "value." + SearchConfigDto.F_FILTER_TYPE), -// SearchPropertiesConfigPanel.this, true, -// getPageBase().createStringResource("SearchPropertiesConfigPanel.selectFilter").getString()); -// filterPanel.setOutputMarkupId(true); -// filterPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); -// item.add(filterPanel); -// } -// }; -// columns.add(filterColumn); - -// IColumn, String> matchingRuleColumn = new AbstractColumn, String>(getPageBase() -// .createStringResource("SearchPropertiesConfigPanel.table.column.matchingRule")) { -// private static final long serialVersionUID = 1L; -// -// @Override -// public void populateItem(Item>> item, String id, IModel> rowModel) { -// DropDownChoicePanel matchingRulePanel = WebComponentUtil.createEnumPanel(id, -// Model.ofList(Arrays.asList(SearchConfigDto.FilterType.values())), -// new PropertyModel<>(rowModel, "value." + SearchConfigDto.F_MATCHING_RULE), -// SearchPropertiesConfigPanel.this, true, -// getPageBase().createStringResource("SearchPropertiesConfigPanel.selectMatchingRule").getString()); -// matchingRulePanel.setOutputMarkupId(true); -// matchingRulePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); -// item.add(matchingRulePanel); -// } -// }; -// columns.add(matchingRuleColumn); -// -// CheckBoxColumn> negationColumn = new CheckBoxColumn>(getPageBase() -// .createStringResource("SearchPropertiesConfigPanel.table.column.applyNegotiation"), -// "value." + SearchConfigDto.F_NEGATION); -// columns.add(negationColumn); + + IColumn, String> filterColumn = new AbstractColumn, String>(getPageBase() + .createStringResource("SearchPropertiesConfigPanel.table.column.filter")) { + private static final long serialVersionUID = 1L; + + @Override + public void populateItem(Item>> item, String id, IModel> rowModel) { + DropDownChoicePanel filterPanel = WebComponentUtil.createEnumPanel(id, + Model.ofList(Arrays.asList(ValueSearchFilterItem.FilterName.values())), + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_FILTER_NAME), + SearchPropertiesConfigPanel.this, false, + getPageBase().createStringResource("SearchPropertiesConfigPanel.selectFilter").getString()); + filterPanel.setOutputMarkupId(true); + filterPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + item.add(filterPanel); + } + }; + columns.add(filterColumn); + + IColumn, String> matchingRuleColumn = new AbstractColumn, String>(getPageBase() + .createStringResource("SearchPropertiesConfigPanel.table.column.matchingRule")) { + private static final long serialVersionUID = 1L; + + @Override + public void populateItem(Item>> item, String id, IModel> rowModel) { + DropDownChoicePanel matchingRulePanel = WebComponentUtil.createEnumPanel(id, + Model.ofList(Arrays.asList(ValueSearchFilterItem.MatchingRule.values())), + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_MATCHING_RULE), + SearchPropertiesConfigPanel.this, true, + getPageBase().createStringResource("SearchPropertiesConfigPanel.selectMatchingRule").getString()); + matchingRulePanel.setOutputMarkupId(true); + matchingRulePanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + item.add(matchingRulePanel); + } + }; + columns.add(matchingRuleColumn); + + CheckBoxColumn> negationColumn = new CheckBoxColumn>(getPageBase() + .createStringResource("SearchPropertiesConfigPanel.table.column.applyNegotiation"), + "value." + ValueSearchFilterItem.F_APPLY_NEGATION); + columns.add(negationColumn); return columns; } @@ -295,6 +294,25 @@ private Property getSelectedProperty() { return propertyChoicePanel.getModel().getObject(); } + private Component getPropertyValueField(String id, IModel> rowModel) { + Component searchItemField = null; + ValueSearchFilterItem valueSearchFilter = rowModel.getObject().getValue(); + if (valueSearchFilter.getFilter() == null){ + return new WebMarkupContainer(id); + } + ItemDefinition propertyDef = valueSearchFilter.getFilter().getDefinition(); + PrismValue propertyValue = valueSearchFilter.getValue(); + IModel>> choices = null; + + if (propertyDef instanceof PrismReferenceDefinition) { + searchItemField = new ReferenceValueSearchPanel(id, Model.of( + propertyValue != null ? (ObjectReferenceType) propertyValue.getRealValue() : null), + (PrismReferenceDefinition) propertyDef); + } + return searchItemField != null ? searchItemField : new WebMarkupContainer(id); + + } + public int getWidth() { return 80; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java index bbd0031e9db..f44b293f27d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java @@ -6,15 +6,15 @@ */ package com.evolveum.midpoint.web.component.search.filter; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ValueFilter; +import java.io.Serializable; +import javax.xml.namespace.QName; import org.apache.commons.collections.CollectionUtils; -import java.io.Serializable; +import com.evolveum.midpoint.prism.ItemDefinition; +import com.evolveum.midpoint.prism.PrismConstants; +import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.query.ValueFilter; /** * @author honchar @@ -23,11 +23,62 @@ public class ValueSearchFilterItem filter; + private FilterName filterName; + private MatchingRule matchingRule; - public ValueSearchFilterItem(ValueFilter filter, boolean applyNegation){ + public ValueSearchFilterItem(ValueFilter filter, boolean applyNegation) { this.filter = filter; this.applyNegation = applyNegation; } @@ -48,10 +99,26 @@ public void setFilter(ValueFilter filter) { this.filter = filter; } - public V getValue(){ - if (filter == null || CollectionUtils.isEmpty(filter.getValues())){ + public V getValue() { + if (filter == null || CollectionUtils.isEmpty(filter.getValues())) { return null; } return filter.getValues().get(0); } + + public FilterName getFilterName() { + return filterName; + } + + public void setFilterName(FilterName filterName) { + this.filterName = filterName; + } + + public MatchingRule getMatchingRule() { + return matchingRule; + } + + public void setMatchingRule(MatchingRule matchingRule) { + this.matchingRule = matchingRule; + } } From ceb1c62fa279c05993d5e3420227488e12afc0ae Mon Sep 17 00:00:00 2001 From: kate Date: Mon, 22 Jun 2020 15:48:30 +0200 Subject: [PATCH 05/17] filter configuration --- .../gui/api/util/WebComponentUtil.java | 14 ++ .../AbstractSearchConfigurationPanel.html | 5 +- .../AbstractSearchConfigurationPanel.java | 44 ++++-- .../search/BasicSearchFilterModel.java | 8 + .../web/component/search/SearchItemPanel.java | 19 +-- .../search/SearchPropertiesConfigPanel.java | 139 ++++++++++++------ .../search/filter/BasicSearchFilter.java | 14 +- .../component/search/filter/SearchFilter.java | 11 +- .../search/filter/ValueSearchFilterItem.java | 30 +++- .../SearchFilterConfigurationPanel.java | 10 +- 10 files changed, 206 insertions(+), 88 deletions(-) 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 fb5e3c5faf6..95b14014609 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 @@ -4396,6 +4396,20 @@ public static Class resolveSelfPage() { return null; } + public static PrismObject findLookupTable(ItemDefinition definition, PageBase page) { + PrismReferenceValue valueEnumerationRef = definition.getValueEnumerationRef(); + if (valueEnumerationRef == null) { + return null; + } + + String lookupTableUid = valueEnumerationRef.getOid(); + Task task = page.createSimpleTask("loadLookupTable"); + OperationResult result = task.getResult(); + + Collection> options = WebModelServiceUtils.createLookupTableRetrieveOptions(page.getSchemaHelper()); + return WebModelServiceUtils.loadObject(LookupTableType.class, lookupTableUid, options, page, task, result); + } + public static boolean hasAnyArchetypeAssignemnt(AH assignmentHolder) { if (assignmentHolder.getAssignment() == null) { return false; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.html index c58bfdb42f3..2c4e6a63384 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.html @@ -13,8 +13,9 @@
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java index 61355ab5571..be0f2b44ab1 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/AbstractSearchConfigurationPanel.java @@ -31,8 +31,9 @@ public abstract class AbstractSearchConfigurationPanel type; @@ -63,27 +64,38 @@ private void initButtonsPanel() { buttonsPanel.setOutputMarkupId(true); add(buttonsPanel); - AjaxButton applyFilterButton = new AjaxButton(ID_APPLY_FILTER_BUTTON, createStringResource("SearchPropertiesConfigPanel.applyFilterButton")) { + AjaxButton applyFilterButton = new AjaxButton(ID_OK_BUTTON, createStringResource("Button.ok")) { private static final long serialVersionUID = 1L; @Override public void onClick(AjaxRequestTarget ajaxRequestTarget) { - //todo + okButtonClicked(ajaxRequestTarget); } }; applyFilterButton.setOutputMarkupId(true); buttonsPanel.add(applyFilterButton); - AjaxButton saveFilterButton = new AjaxButton(ID_SAVE_FILTER_BUTTON, createStringResource("SearchPropertiesConfigPanel.saveFilterButton")) { - private static final long serialVersionUID = 1L; - - @Override - public void onClick(AjaxRequestTarget ajaxRequestTarget) { - //todo - } - }; - saveFilterButton.setOutputMarkupId(true); - buttonsPanel.add(saveFilterButton); +// AjaxButton applyFilterButton = new AjaxButton(ID_APPLY_FILTER_BUTTON, createStringResource("SearchPropertiesConfigPanel.applyFilterButton")) { +// private static final long serialVersionUID = 1L; +// +// @Override +// public void onClick(AjaxRequestTarget ajaxRequestTarget) { +// //todo +// } +// }; +// applyFilterButton.setOutputMarkupId(true); +// buttonsPanel.add(applyFilterButton); +// +// AjaxButton saveFilterButton = new AjaxButton(ID_SAVE_FILTER_BUTTON, createStringResource("SearchPropertiesConfigPanel.saveFilterButton")) { +// private static final long serialVersionUID = 1L; +// +// @Override +// public void onClick(AjaxRequestTarget ajaxRequestTarget) { +// //todo +// } +// }; +// saveFilterButton.setOutputMarkupId(true); +// buttonsPanel.add(saveFilterButton); AjaxButton cancelButton = new AjaxButton(ID_CANCEL_BUTTON, createStringResource("SearchPropertiesConfigPanel.cancelButton")) { private static final long serialVersionUID = 1L; @@ -99,6 +111,10 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { protected abstract void initConfigurationPanel(WebMarkupContainer configPanel); + protected void okButtonClicked(AjaxRequestTarget target){ + + } + public Class getType() { return type; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java index 13b631e1d65..af3fa7ead0e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java @@ -32,6 +32,7 @@ public class BasicSearchFilterModel implements IModel baseModel; private PageBase pageBase; private Class type; + private BasicSearchFilter basicSearchFilter; public BasicSearchFilterModel(IModel valueWrapper, Class type, PageBase pageBase) { this.baseModel = valueWrapper; @@ -47,6 +48,13 @@ public void detach() { @Override public BasicSearchFilter getObject() { + if (basicSearchFilter == null){ + basicSearchFilter = loadBasicSearchFilter(); + } + return basicSearchFilter; + } + + private BasicSearchFilter loadBasicSearchFilter(){ try { SearchFilterType value = baseModel.getObject(); if (value == null) { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java index 375276f91b5..c317cd3b795 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchItemPanel.java @@ -192,10 +192,9 @@ private void initSearchItemField(WebMarkupContainer searchItemContainer) { Component searchItemField = null; SearchItem item = getModelObject(); IModel>> choices = null; - PrismObject lookupTable = findLookupTable(item.getDefinition()); + PrismObject lookupTable = WebComponentUtil.findLookupTable(item.getDefinition(), getPageBase()); switch (item.getType()) { case REFERENCE: - //TODO change probably to another component searchItemField = new TextPanel(ID_SEARCH_ITEM_FIELD, new PropertyModel(getModel(), "value.value"){ private static final long serialVersionUID = 1L; @@ -388,22 +387,6 @@ protected void confirmPerformed(AjaxRequestTarget target) { } } - private PrismObject findLookupTable(ItemDefinition definition) { - PrismReferenceValue valueEnumerationRef = definition.getValueEnumerationRef(); - if (valueEnumerationRef == null) { - return null; - } - - PageBase page = getPageBase(); - - String lookupTableUid = valueEnumerationRef.getOid(); - Task task = page.createSimpleTask("loadLookupTable"); - OperationResult result = task.getResult(); - - Collection> options = WebModelServiceUtils.createLookupTableRetrieveOptions(getSchemaHelper()); - return WebModelServiceUtils.loadObject(LookupTableType.class, lookupTableUid, options, page, task, result); - } - private IModel>> createBooleanChoices() { List> list = new ArrayList<>(); list.add(new SearchValue<>(Boolean.TRUE, getString("Boolean.TRUE"))); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java index 07e346aaf0e..1803bcd1a6d 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java @@ -11,33 +11,17 @@ import java.util.Iterator; import java.util.List; -import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel; -import com.evolveum.midpoint.gui.api.page.PageBase; -import com.evolveum.midpoint.gui.api.util.WebComponentUtil; -import com.evolveum.midpoint.prism.*; -import com.evolveum.midpoint.prism.match.MatchingRule; -import com.evolveum.midpoint.util.DisplayableValue; -import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; -import com.evolveum.midpoint.web.component.input.TextPanel; -import com.evolveum.midpoint.web.component.prism.InputPanel; -import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; +import com.evolveum.midpoint.prism.query.EqualFilter; -import com.evolveum.midpoint.web.component.search.filter.ValueSearchFilterItem; -import com.evolveum.midpoint.web.component.util.EnableBehaviour; -import com.evolveum.midpoint.xml.ns._public.common.common_3.ExpressionType; -import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; -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.prism.query.ObjectFilter; +import com.evolveum.midpoint.web.component.input.TextPanel; + +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; -import org.apache.poi.ss.formula.functions.T; -import org.apache.wicket.AttributeModifier; import org.apache.wicket.Component; import org.apache.wicket.ajax.AjaxRequestTarget; -import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior; import org.apache.wicket.behavior.AttributeAppender; -import org.apache.wicket.behavior.Behavior; import org.apache.wicket.extensions.markup.html.repeater.data.grid.ICellPopulator; import org.apache.wicket.extensions.markup.html.repeater.data.table.AbstractColumn; import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn; @@ -50,19 +34,27 @@ import org.apache.wicket.model.PropertyModel; import org.apache.wicket.model.StringResourceModel; +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.*; +import com.evolveum.midpoint.prism.query.ValueFilter; +import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; +import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; +import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; +import com.evolveum.midpoint.web.component.search.filter.ValueSearchFilterItem; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.SelectableListDataProvider; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; - -import org.apache.wicket.model.util.ListModel; - -import javax.xml.namespace.QName; +import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; /** * @author Kateryna Honchar @@ -80,6 +72,7 @@ public class SearchPropertiesConfigPanel extends AbstractS private static final String ID_ADD_BUTTON = "addButton"; IModel propertyChoiceModel = Model.of(); + private SelectableListDataProvider, ValueSearchFilterItem> provider; public SearchPropertiesConfigPanel(String id, IModel> searchModel, Class type) { super(id, searchModel, type); @@ -137,7 +130,7 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { } private void initTable(WebMarkupContainer configPanel) { - SelectableListDataProvider, ValueSearchFilterItem> provider = + provider = new SelectableListDataProvider, ValueSearchFilterItem>(getPageBase(), getSearchFilterItemModel()); List, String>> columns = getTableColumns(); BoxedTablePanel> table = @@ -197,7 +190,7 @@ private List, String>> getTableCol IColumn, String> propertyColumn = new PropertyColumn, String>(getPageBase() .createStringResource("SearchPropertiesConfigPanel.table.column.property"), - "value.filter.fullPath"); + "value." + ValueSearchFilterItem.F_PROPERTY_NAME); columns.add(propertyColumn); IColumn, String> valueColumn = new AbstractColumn, String>(getPageBase() @@ -279,13 +272,23 @@ protected List load() { } private void propertyAddedPerformed(AjaxRequestTarget target) { -// Property newPropertyValue = propertyChoiceModel.getObject(); -// if (newPropertyValue != null) { -// getModelObject().addItem(newPropertyValue.getDefinition()); + Property newPropertyValue = propertyChoiceModel.getObject(); + if (newPropertyValue != null) { + getModelObject().addSearchFilterItem(createDefaultValueFilter(newPropertyValue)); // initTable((WebMarkupContainer) get(ID_CONFIGURATION_PANEL)); //todo don't re-init table! -// target.add(get(createComponentPath(ID_CONFIGURATION_PANEL, ID_PROPERTIES_TABLE))); -// } -// target.add(SearchPropertiesConfigPanel.this); + } + target.add(SearchPropertiesConfigPanel.this); + } + + private ValueSearchFilterItem createDefaultValueFilter(Property property) { + if (property == null){ + return null; + } + ObjectFilter newFilter = getPageBase().getPrismContext().queryFor(getType()) + .item(property.getDefinition().getItemName()) + .isNull() + .buildFilter(); + return new ValueSearchFilterItem(newFilter, false); } private Property getSelectedProperty() { @@ -300,17 +303,71 @@ private Component getPropertyValueField(String id, IModel>> choices = null; - - if (propertyDef instanceof PrismReferenceDefinition) { - searchItemField = new ReferenceValueSearchPanel(id, Model.of( - propertyValue != null ? (ObjectReferenceType) propertyValue.getRealValue() : null), - (PrismReferenceDefinition) propertyDef); + ObjectFilter filter = valueSearchFilter.getFilter(); + if (filter instanceof ValueFilter) { + ItemDefinition propertyDef = ((ValueFilter)filter).getDefinition(); + PrismValue propertyValue = valueSearchFilter.getValue(); + PrismObject lookupTable = WebComponentUtil.findLookupTable(propertyDef, getPageBase()); + + if (propertyDef instanceof PrismReferenceDefinition) { + searchItemField = new ReferenceValueSearchPanel(id, Model.of( + propertyValue != null ? (ObjectReferenceType) propertyValue.getRealValue() : null), + (PrismReferenceDefinition) propertyDef); + } else if (propertyDef instanceof PrismPropertyDefinition) { + List allowedValues = new ArrayList<>(); + if (((PrismPropertyDefinition) propertyDef).getAllowedValues() != null) { + allowedValues.addAll(((PrismPropertyDefinition) propertyDef).getAllowedValues()); + } + if (lookupTable != null) { + searchItemField = new AutoCompleteTextPanel(id, + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE + ".realValue"), String.class, + true, lookupTable.asObjectable()) { + + private static final long serialVersionUID = 1L; + + @Override + public Iterator getIterator(String input) { + return WebComponentUtil.prepareAutoCompleteList(lookupTable.asObjectable(), input, + ((PageBase) getPage()).getLocalizationService()).iterator(); + } + }; + } else if (CollectionUtils.isNotEmpty(allowedValues)) { + searchItemField = new DropDownChoicePanel(id, + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE + ".realValue"), + Model.ofList(allowedValues), new IChoiceRenderer() { + private static final long serialVersionUID = 1L; + + @Override + public Object getDisplayValue(DisplayableValue val) { + return val.getLabel(); + } + + @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; + } + }, true); + } else { + searchItemField = new TextPanel(id, new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE + ".realValue")); + + } + } } return searchItemField != null ? searchItemField : new WebMarkupContainer(id); + } + + @Override + protected void okButtonClicked(AjaxRequestTarget target){ + ObjectFilter configuredFilter = getModelObject().buildObjectFilter(); + filterConfiguredPerformed(configuredFilter, target); + } + protected void filterConfiguredPerformed(ObjectFilter configuredFilter, AjaxRequestTarget target){ } public int getWidth() { diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java index d2240580809..7e28ec7ec4e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/BasicSearchFilter.java @@ -18,7 +18,7 @@ /** * @author honchar */ -public class BasicSearchFilter extends SearchFilter { +public class BasicSearchFilter extends SearchFilter { private static final long serialVersionUID = 1L; private static final Trace LOGGER = TraceManager.getTrace(BasicSearchFilter.class); @@ -31,9 +31,6 @@ public BasicSearchFilter(PrismContext prismContext, ObjectFilter baseFilter, Cla @Override public void addSearchFilterItem(ValueSearchFilterItem valueSearchFilterItem) { - if (!(valueSearchFilterItem instanceof ValueFilter)) { - LOGGER.error("Impossible to add another than ValueFilter to BasicSearchFilter search filter items list"); - } getValueSearchFilterItems().add(valueSearchFilterItem); } @@ -77,6 +74,15 @@ protected void initSearchFilterItems(ObjectFilter baseFilter) { } } + @Override + public ObjectFilter buildObjectFilter(){ + if (logicalFilterValue.equals(LogicalFilterValue.OR)){ + return getPrismContext().queryFactory().createAnd(getObjectFilterList()); + } else { + return getPrismContext().queryFactory().createOr(getObjectFilterList()); + } + } + public void addValueFilters(List objectFilters) { objectFilters.forEach(filter -> { boolean applyNegation = false; diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java index f2ab52ff62e..6b1230d937b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java @@ -17,7 +17,7 @@ /** * @author honchar */ -public abstract class SearchFilter implements Serializable { +public abstract class SearchFilter implements Serializable { private static final long serialVersionUID = 1L; private List valueSearchFilterItems = new ArrayList<>(); @@ -43,15 +43,22 @@ public List getValueSearchFilterItems() { return valueSearchFilterItems; //todo return unmodifiable list } + public List getObjectFilterList() { + List objectFilters = new ArrayList<>(); + valueSearchFilterItems.forEach(filterItem -> objectFilters.add(filterItem.getFilter())); + return objectFilters; + } + public abstract void addSearchFilterItem(ValueSearchFilterItem valueSearchFilterItem); protected abstract void initSearchFilterItems(ObjectFilter baseFilter); + public abstract ObjectFilter buildObjectFilter(); + public Class getType(){ return type; } - public PrismContext getPrismContext() { return prismContext; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java index f44b293f27d..381f72e7c91 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java @@ -7,6 +7,7 @@ package com.evolveum.midpoint.web.component.search.filter; import java.io.Serializable; +import java.util.List; import javax.xml.namespace.QName; import org.apache.commons.collections.CollectionUtils; @@ -14,6 +15,7 @@ import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismConstants; import com.evolveum.midpoint.prism.PrismValue; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ValueFilter; /** @@ -27,6 +29,7 @@ public class ValueSearchFilterItem filter; + private ObjectFilter filter; private FilterName filterName; private MatchingRule matchingRule; + private String propertyName; - public ValueSearchFilterItem(ValueFilter filter, boolean applyNegation) { + public ValueSearchFilterItem(ObjectFilter filter, boolean applyNegation) { this.filter = filter; this.applyNegation = applyNegation; } @@ -91,19 +95,26 @@ public void setApplyNegation(boolean applyNegation) { this.applyNegation = applyNegation; } - public ValueFilter getFilter() { + public ObjectFilter getFilter() { return filter; } - public void setFilter(ValueFilter filter) { + public void setFilter(ObjectFilter filter) { this.filter = filter; } + //todo which filter types do we want to support here public V getValue() { - if (filter == null || CollectionUtils.isEmpty(filter.getValues())) { + if (filter == null) { return null; } - return filter.getValues().get(0); + if (filter instanceof ValueFilter) { + List values = ((ValueFilter)filter).getValues(); + if (CollectionUtils.isNotEmpty(values)){ + return values.get(0); + } + } + return null; } public FilterName getFilterName() { @@ -121,4 +132,11 @@ public MatchingRule getMatchingRule() { public void setMatchingRule(MatchingRule matchingRule) { this.matchingRule = matchingRule; } + + public String getPropertyName() { + if (filter instanceof ValueFilter) { + return ((ValueFilter) filter).getElementName().toString(); + } + return ""; + } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java index 27a94a35388..b5186ff7a03 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java @@ -65,7 +65,15 @@ public void onClick(AjaxRequestTarget target) { private void searchConfigurationPerformed(AjaxRequestTarget target){ SearchPropertiesConfigPanel configPanel = new SearchPropertiesConfigPanel(getPageBase().getMainPopupBodyId(), - new BasicSearchFilterModel(getModel(), filterType, getPageBase()), filterType); + new BasicSearchFilterModel(getModel(), filterType, getPageBase()), filterType){ + private static final long serialVersionUID = 1L; + + @Override + protected void filterConfiguredPerformed(ObjectFilter configuredFilter, AjaxRequestTarget target){ + getPageBase().hideMainPopup(target); + //todo set new filter value + } + }; getPageBase().showMainPopup(configPanel, target); } } From ca770f0556cb86b1b75034060c94a4bbac192af3 Mon Sep 17 00:00:00 2001 From: kate Date: Tue, 23 Jun 2020 21:50:37 +0200 Subject: [PATCH 06/17] further work for filter configuration --- .../panel/SearchFilterPanelFactory.java | 3 +- .../search/SearchPropertiesConfigPanel.html | 4 - .../search/SearchPropertiesConfigPanel.java | 116 ++++++++++++------ .../component/search/filter/SearchFilter.java | 2 +- .../search/filter/ValueSearchFilterItem.java | 110 ++++++++++++++--- .../SearchFilterConfigurationPanel.java | 25 +++- 6 files changed, 197 insertions(+), 63 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java index 0cca743bd22..07636e1ac46 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/panel/SearchFilterPanelFactory.java @@ -48,7 +48,8 @@ protected Panel getPanel(PrismPropertyPanelContext panelCtx) { if (containerWrapper != null && containerWrapper.getRealValue() instanceof ObjectCollectionType){ ObjectCollectionType collectionObj = (ObjectCollectionType) containerWrapper.getRealValue(); return new SearchFilterConfigurationPanel(panelCtx.getComponentId(), panelCtx.getRealValueModel(), - (Class)WebComponentUtil.qnameToClass(panelCtx.getPageBase().getPrismContext(), collectionObj.getType())); + (Class)WebComponentUtil.qnameToClass(panelCtx.getPageBase().getPrismContext(), + collectionObj.getType() != null ? collectionObj.getType() : ObjectType.COMPLEX_TYPE)); } return new AceEditorPanel(panelCtx.getComponentId(), null, new SearchFilterTypeModel(panelCtx.getRealValueModel(), panelCtx.getPageBase()), 10); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.html index f1b1160229d..6521ead6309 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.html @@ -11,10 +11,6 @@
- - - -
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java index 1803bcd1a6d..a78defe8a68 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java @@ -11,11 +11,9 @@ import java.util.Iterator; import java.util.List; -import com.evolveum.midpoint.prism.query.EqualFilter; +import com.evolveum.midpoint.util.QNameUtil; -import com.evolveum.midpoint.prism.query.ObjectFilter; - -import com.evolveum.midpoint.web.component.input.TextPanel; +import com.evolveum.midpoint.web.component.prism.InputPanel; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; @@ -39,6 +37,7 @@ import com.evolveum.midpoint.gui.api.page.PageBase; import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ValueFilter; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.web.component.AjaxButton; @@ -47,6 +46,7 @@ import com.evolveum.midpoint.web.component.data.column.CheckBoxHeaderColumn; import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; +import com.evolveum.midpoint.web.component.input.TextPanel; import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; import com.evolveum.midpoint.web.component.search.filter.ValueSearchFilterItem; import com.evolveum.midpoint.web.component.util.SelectableBean; @@ -64,14 +64,9 @@ public class SearchPropertiesConfigPanel extends AbstractS private static final String ID_PROPERTY_CONFIG_CONTAINER = "propertyConfigContainer"; private static final String ID_PROPERTY_CHOICE = "propertyChoice"; - private static final String ID_PROPERTY_VALUE = "propertyValue"; - private static final String ID_FILTER = "filter"; - private static final String ID_MATCHING_RULE = "matchingRule"; - private static final String ID_NEGATION = "negation"; private static final String ID_PROPERTIES_TABLE = "propertiesTable"; private static final String ID_ADD_BUTTON = "addButton"; - IModel propertyChoiceModel = Model.of(); private SelectableListDataProvider, ValueSearchFilterItem> provider; public SearchPropertiesConfigPanel(String id, IModel> searchModel, Class type) { @@ -80,12 +75,15 @@ public SearchPropertiesConfigPanel(String id, IModel> searc @Override protected void initConfigurationPanel(WebMarkupContainer configPanel) { + provider = + new SelectableListDataProvider, ValueSearchFilterItem>(getPageBase(), getSearchFilterItemModel()); + WebMarkupContainer propertyConfigContainer = new WebMarkupContainer(ID_PROPERTY_CONFIG_CONTAINER); propertyConfigContainer.setOutputMarkupId(true); configPanel.add(propertyConfigContainer); DropDownChoicePanel propertyChoicePanel = new DropDownChoicePanel(ID_PROPERTY_CHOICE, - propertyChoiceModel, Model.ofList(getAvailablePropertiesList()), new IChoiceRenderer() { + getDefaultPropertyChoiceModel(), getAvailablePropertiesListModel(), new IChoiceRenderer() { private static final long serialVersionUID = 1L; @@ -129,9 +127,22 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { initTable(configPanel); } + private LoadableModel getDefaultPropertyChoiceModel(){ + return new LoadableModel() { + private static final long serialVersionUID = 1L; + + @Override + protected Property load() { + List availablePropertiesList = getAvailablePropertiesListModel().getObject(); + if (CollectionUtils.isNotEmpty(availablePropertiesList)){ + return availablePropertiesList.get(0); + } + return null; + } + }; + } + private void initTable(WebMarkupContainer configPanel) { - provider = - new SelectableListDataProvider, ValueSearchFilterItem>(getPageBase(), getSearchFilterItemModel()); List, String>> columns = getTableColumns(); BoxedTablePanel> table = new BoxedTablePanel>(ID_PROPERTIES_TABLE, provider, columns, null, 20) { @@ -179,7 +190,7 @@ public boolean isAutoRefreshEnabled() { } }; table.setOutputMarkupId(true); - configPanel.addOrReplace(table); + configPanel.add(table); } private List, String>> getTableColumns() { @@ -248,12 +259,31 @@ public void populateItem(Item getAvailablePropertiesList() { - PrismObjectDefinition objectDef = SearchFactory.findObjectDefinition(getType(), null, getPageBase()); - List availableDefs = SearchFactory.getAvailableDefinitions(objectDef, true); - List propertiesList = new ArrayList<>(); - availableDefs.forEach(searchItemDef -> propertiesList.add(new Property(searchItemDef.getDef()))); - return propertiesList; + private LoadableModel> getAvailablePropertiesListModel() { + return new LoadableModel>() { + @Override + protected List load() { + PrismObjectDefinition objectDef = SearchFactory.findObjectDefinition(getType(), null, getPageBase()); + List availableDefs = SearchFactory.getAvailableDefinitions(objectDef, true); + List propertiesList = new ArrayList<>(); + availableDefs.forEach(searchItemDef -> { + if (!isPropertyAlreadyAdded(searchItemDef.getDef())) { + propertiesList.add(new Property(searchItemDef.getDef())); + } + }); + return propertiesList; + } + }; + } + + private boolean isPropertyAlreadyAdded(ItemDefinition def){ + List> properties = provider.getAvailableData(); + for (SelectableBean prop : properties){ + if (QNameUtil.match(prop.getValue().getElementName(), def.getItemName())){ + return true; + } + } + return false; } private LoadableModel> getSearchFilterItemModel() { @@ -272,23 +302,35 @@ protected List load() { } private void propertyAddedPerformed(AjaxRequestTarget target) { - Property newPropertyValue = propertyChoiceModel.getObject(); + Property newPropertyValue = getPropertyChoicePanel().getBaseFormComponent().getModelObject(); if (newPropertyValue != null) { getModelObject().addSearchFilterItem(createDefaultValueFilter(newPropertyValue)); -// initTable((WebMarkupContainer) get(ID_CONFIGURATION_PANEL)); //todo don't re-init table! } target.add(SearchPropertiesConfigPanel.this); } + private DropDownChoicePanel getPropertyChoicePanel(){ + return (DropDownChoicePanel) get(createComponentPath(ID_CONFIGURATION_PANEL, ID_PROPERTY_CONFIG_CONTAINER, ID_PROPERTY_CHOICE)); + } + private ValueSearchFilterItem createDefaultValueFilter(Property property) { if (property == null){ return null; } - ObjectFilter newFilter = getPageBase().getPrismContext().queryFor(getType()) - .item(property.getDefinition().getItemName()) - .isNull() - .buildFilter(); - return new ValueSearchFilterItem(newFilter, false); +// ObjectFilter newFilter; +// if (property.getDefinition() instanceof PrismReferenceDefinition){ +// PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) property.getDefinition(); +// newFilter = getPageBase().getPrismContext().queryFor(getType()) +// .item(property.getDefinition().getItemName()) +// .ref("", refDefinition.getTargetTypeName() != null ? refDefinition.getTargetTypeName() : ObjectType.COMPLEX_TYPE) +// .buildFilter(); +// } else { +// newFilter = getPageBase().getPrismContext().queryFor(getType()) +// .item(property.getDefinition().getItemName()) +// .isNull() +// .buildFilter(); +// } + return new ValueSearchFilterItem(property, false); } private Property getSelectedProperty() { @@ -300,18 +342,13 @@ private Property getSelectedProperty() { private Component getPropertyValueField(String id, IModel> rowModel) { Component searchItemField = null; ValueSearchFilterItem valueSearchFilter = rowModel.getObject().getValue(); - if (valueSearchFilter.getFilter() == null){ - return new WebMarkupContainer(id); - } - ObjectFilter filter = valueSearchFilter.getFilter(); - if (filter instanceof ValueFilter) { - ItemDefinition propertyDef = ((ValueFilter)filter).getDefinition(); - PrismValue propertyValue = valueSearchFilter.getValue(); + ItemDefinition propertyDef = valueSearchFilter.getPropertyDef(); + if (propertyDef != null) { PrismObject lookupTable = WebComponentUtil.findLookupTable(propertyDef, getPageBase()); if (propertyDef instanceof PrismReferenceDefinition) { - searchItemField = new ReferenceValueSearchPanel(id, Model.of( - propertyValue != null ? (ObjectReferenceType) propertyValue.getRealValue() : null), + ObjectReferenceType propertyValue = (ObjectReferenceType) valueSearchFilter.getValue(); + searchItemField = new ReferenceValueSearchPanel(id, Model.of(propertyValue), (PrismReferenceDefinition) propertyDef); } else if (propertyDef instanceof PrismPropertyDefinition) { List allowedValues = new ArrayList<>(); @@ -320,7 +357,7 @@ private Component getPropertyValueField(String id, IModel(id, - new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE + ".realValue"), String.class, + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE), String.class, true, lookupTable.asObjectable()) { private static final long serialVersionUID = 1L; @@ -333,7 +370,7 @@ public Iterator getIterator(String input) { }; } else if (CollectionUtils.isNotEmpty(allowedValues)) { searchItemField = new DropDownChoicePanel(id, - new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE + ".realValue"), + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE), Model.ofList(allowedValues), new IChoiceRenderer() { private static final long serialVersionUID = 1L; @@ -353,11 +390,14 @@ public DisplayableValue getObject(String id, IModel(id, new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE + ".realValue")); + searchItemField = new TextPanel(id, new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_VALUE)); } } } + if (searchItemField != null && searchItemField instanceof InputPanel){ + ((InputPanel) searchItemField).getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + } return searchItemField != null ? searchItemField : new WebMarkupContainer(id); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java index 6b1230d937b..f221ee9f6bf 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/SearchFilter.java @@ -45,7 +45,7 @@ public List getValueSearchFilterItems() { public List getObjectFilterList() { List objectFilters = new ArrayList<>(); - valueSearchFilterItems.forEach(filterItem -> objectFilters.add(filterItem.getFilter())); + valueSearchFilterItems.forEach(filterItem -> objectFilters.add(filterItem.buildFilter(prismContext, type))); return objectFilters; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java index 381f72e7c91..1924247313b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java @@ -14,14 +14,19 @@ import com.evolveum.midpoint.prism.ItemDefinition; import com.evolveum.midpoint.prism.PrismConstants; +import com.evolveum.midpoint.prism.PrismContext; import com.evolveum.midpoint.prism.PrismValue; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.prism.query.ValueFilter; +import com.evolveum.midpoint.prism.query.builder.S_ConditionEntry; +import com.evolveum.midpoint.web.component.search.Property; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; +import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; /** * @author honchar */ -public class ValueSearchFilterItem implements Serializable { +public class ValueSearchFilterItem implements Serializable { private static final long serialVersionUID = 1L; public static final String F_VALUE = "value"; @@ -30,6 +35,7 @@ public class ValueSearchFilterItem values = ((ValueFilter)filter).getValues(); - if (CollectionUtils.isNotEmpty(values)){ - return values.get(0); - } + public Object getValue() { + if (value instanceof PrismValue) { + return ((PrismValue) value).getRealValue(); } return null; } @@ -131,12 +148,73 @@ public MatchingRule getMatchingRule() { public void setMatchingRule(MatchingRule matchingRule) { this.matchingRule = matchingRule; + if (filter instanceof ValueFilter){ + ((ValueFilter) filter).setMatchingRule(matchingRule.getMatchingRuleName()); + } } public String getPropertyName() { + return propertyName; + } + + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public QName getPropertyPath() { + return propertyPath; + } + + public void setPropertyPath(QName propertyPath) { + this.propertyPath = propertyPath; + } + + public void setValue(Object value) { + this.value = value; + } + + public ItemDefinition getPropertyDef() { + return propertyDef; + } + + public void setPropertyDef(ItemDefinition propertyDef) { + this.propertyDef = propertyDef; + } + + public QName getElementName(){ if (filter instanceof ValueFilter) { - return ((ValueFilter) filter).getElementName().toString(); + return ((ValueFilter) filter).getElementName(); + } + return null; + } + + public ObjectFilter buildFilter(PrismContext prismContext, Class type){ + S_ConditionEntry conditionEntry = prismContext.queryFor(type).item(propertyPath); + ObjectFilter builtFilter = null; + if (FilterName.EQUAL.equals(filterName)) { + builtFilter = conditionEntry.eq(value).buildFilter(); + } else if (FilterName.GREATER.equals(filterName)) { + builtFilter = conditionEntry.gt(value).buildFilter(); + } else if (FilterName.GREATER_OR_EQUAL.equals(filterName)) { + builtFilter = conditionEntry.ge(value).buildFilter(); + } else if (FilterName.LESS.equals(filterName)) { + builtFilter = conditionEntry.lt(value).buildFilter(); + } else if (FilterName.LESS_OR_EQUAL.equals(filterName)) { + builtFilter = conditionEntry.le(value).buildFilter(); + } else if (FilterName.REF.equals(filterName) && value != null) { + ObjectReferenceType refVal = (ObjectReferenceType) value; + //todo do we need to separately create refType and refRelation ? +// if (StringUtils.isNotEmpty(refVal.getOid())){ +// +// } + builtFilter = conditionEntry.ref(refVal.asReferenceValue()).buildFilter(); + } else if (FilterName.SUBSTRING.equals(filterName)) { + builtFilter = conditionEntry.contains(value).buildFilter(); + } else if (FilterName.SUBSTRING_ANCHOR_START.equals(filterName)) { + builtFilter = conditionEntry.startsWith(value).buildFilter(); + } else if (FilterName.SUBSTRING_ANCHOR_END.equals(filterName)) { + builtFilter = conditionEntry.endsWith(value).buildFilter(); } - return ""; + return builtFilter != null ? builtFilter : prismContext.queryFor(type).buildFilter(); } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java index b5186ff7a03..6c7a714d250 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/reports/component/SearchFilterConfigurationPanel.java @@ -10,8 +10,13 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.gui.impl.factory.panel.SearchFilterTypeModel; import com.evolveum.midpoint.prism.query.ObjectFilter; +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.search.BasicSearchFilterModel; import com.evolveum.midpoint.web.component.search.SearchPropertiesConfigPanel; +import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType; import com.evolveum.prism.xml.ns._public.query_3.SearchFilterType; @@ -28,6 +33,8 @@ public class SearchFilterConfigurationPanel extends BasePanel { private static final long serialVersionUID = 1L; + private static final Trace LOGGER = TraceManager.getTrace(SearchFilterConfigurationPanel.class); + private static final String ID_ACE_EDITOR_FIELD = "aceEditorField"; private static final String ID_CONFIGURE_BUTTON = "configureButton"; @@ -57,23 +64,35 @@ public void onClick(AjaxRequestTarget target) { searchConfigurationPerformed(target); } }; -// searchConfigurationButton.add(new VisibleBehaviour(() -> false)); searchConfigurationButton.setOutputMarkupId(true); add(searchConfigurationButton); } private void searchConfigurationPerformed(AjaxRequestTarget target){ - SearchPropertiesConfigPanel configPanel = new SearchPropertiesConfigPanel(getPageBase().getMainPopupBodyId(), + SearchPropertiesConfigPanel configPanel = new SearchPropertiesConfigPanel(getPageBase().getMainPopupBodyId(), new BasicSearchFilterModel(getModel(), filterType, getPageBase()), filterType){ private static final long serialVersionUID = 1L; @Override protected void filterConfiguredPerformed(ObjectFilter configuredFilter, AjaxRequestTarget target){ getPageBase().hideMainPopup(target); - //todo set new filter value + + try { + if (configuredFilter == null) { + return; + } + SearchFilterConfigurationPanel.this.getModel().setObject(getPageBase().getPrismContext().getQueryConverter().createSearchFilterType(configuredFilter)); + target.add(getAceEditorPanel()); + } catch (SchemaException e) { + LoggingUtils.logUnexpectedException(LOGGER, "Cannot serialize filter", e); + } } }; getPageBase().showMainPopup(configPanel, target); } + + private AceEditorPanel getAceEditorPanel(){ + return (AceEditorPanel) get(ID_ACE_EDITOR_FIELD); + } } From e68ab1a297c0431fc5815be164634988106a2c94 Mon Sep 17 00:00:00 2001 From: lskublik Date: Wed, 24 Jun 2020 16:28:24 +0200 Subject: [PATCH 07/17] fix factory for http header authentication module (MID-6349) --- .../module/HttpHeaderModuleFactory.java | 11 ++++------ ...ointRequestHeaderAuthenticationFilter.java | 22 +++++++++---------- .../HttpHeaderModuleWebSecurityConfig.java | 8 ++++--- .../LoginFormModuleWebSecurityConfig.java | 5 +++++ 4 files changed, 25 insertions(+), 21 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/factory/module/HttpHeaderModuleFactory.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/factory/module/HttpHeaderModuleFactory.java index 3417243b263..37c0b099958 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/factory/module/HttpHeaderModuleFactory.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/factory/module/HttpHeaderModuleFactory.java @@ -38,9 +38,6 @@ public class HttpHeaderModuleFactory extends AbstractModuleFactory { private static final Trace LOGGER = TraceManager.getTrace(HttpHeaderModuleFactory.class); -// @Autowired -// private AuthenticationProvider midPointAuthenticationProvider; - @Override public boolean match(AbstractAuthenticationModuleType moduleType) { if (moduleType instanceof HttpHeaderAuthenticationModuleType) { @@ -58,16 +55,16 @@ public AuthModule createModuleFilter(AbstractAuthenticationModuleType moduleType } isSupportedChannel(authenticationChannel); - - HttpHeaderModuleWebSecurityConfiguration configuration = HttpHeaderModuleWebSecurityConfiguration.build(moduleType, prefixOfSequence); - configuration.addAuthenticationProvider(new PasswordProvider()); + HttpHeaderAuthenticationModuleType httpModuleType = (HttpHeaderAuthenticationModuleType) moduleType; + HttpHeaderModuleWebSecurityConfiguration configuration = HttpHeaderModuleWebSecurityConfiguration.build(httpModuleType, prefixOfSequence); + configuration.addAuthenticationProvider(getObjectObjectPostProcessor().postProcess(new PasswordProvider())); ModuleWebSecurityConfig module = getObjectObjectPostProcessor().postProcess(new HttpHeaderModuleWebSecurityConfig(configuration)); module.setObjectPostProcessor(getObjectObjectPostProcessor()); HttpSecurity http = module.getNewHttpSecurity(); setSharedObjects(http, sharedObjects); ModuleAuthentication moduleAuthentication = createEmptyModuleAuthentication(configuration); - moduleAuthentication.setFocusType(moduleType.getFocusType()); + moduleAuthentication.setFocusType(httpModuleType.getFocusType()); SecurityFilterChain filter = http.build(); return AuthModuleImpl.build(filter, configuration, moduleAuthentication); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/filter/MidpointRequestHeaderAuthenticationFilter.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/filter/MidpointRequestHeaderAuthenticationFilter.java index c502c0c7494..04768d5e3ea 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/filter/MidpointRequestHeaderAuthenticationFilter.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/filter/MidpointRequestHeaderAuthenticationFilter.java @@ -110,15 +110,15 @@ public void setAuthenticationManager(AuthenticationManager authenticationManager super.setAuthenticationManager(authenticationManager); } - @Override - protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { - - if (authResult instanceof MidpointAuthentication) { - MidpointAuthentication mpAuthentication = (MidpointAuthentication) authResult; - ModuleAuthentication moduleAuthentication = mpAuthentication.getProcessingModuleAuthentication(); - moduleAuthentication.setState(StateOfModule.SUCCESSFULLY); - } - - super.successfulAuthentication(request, response, authResult); - } +// @Override +// protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) throws IOException, ServletException { +// +// if (authResult instanceof MidpointAuthentication) { +// MidpointAuthentication mpAuthentication = (MidpointAuthentication) authResult; +// ModuleAuthentication moduleAuthentication = mpAuthentication.getProcessingModuleAuthentication(); +// moduleAuthentication.setState(StateOfModule.SUCCESSFULLY); +// } +// +// super.successfulAuthentication(request, response, authResult); +// } } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/HttpHeaderModuleWebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/HttpHeaderModuleWebSecurityConfig.java index 07444e5c1d6..a4cf0c9300e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/HttpHeaderModuleWebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/HttpHeaderModuleWebSecurityConfig.java @@ -6,8 +6,9 @@ */ package com.evolveum.midpoint.web.security.module; +import com.evolveum.midpoint.web.security.MidPointAuthenticationSuccessHandler; import com.evolveum.midpoint.web.security.MidpointAuthenticationFailureHandler; -import com.evolveum.midpoint.web.security.MidpointProviderManager; +import com.evolveum.midpoint.web.security.MidpointAuthenticationManager; import com.evolveum.midpoint.web.security.filter.MidpointRequestHeaderAuthenticationFilter; import com.evolveum.midpoint.web.security.module.configuration.HttpHeaderModuleWebSecurityConfiguration; import org.springframework.beans.factory.annotation.Autowired; @@ -21,8 +22,7 @@ public class HttpHeaderModuleWebSecurityConfig extends LoginFormModuleWebSecurityConfig { - @Autowired - private MidpointProviderManager authenticationManager; + @Autowired private MidpointAuthenticationManager authenticationManager; public HttpHeaderModuleWebSecurityConfig(C configuration) { super(configuration); @@ -42,6 +42,8 @@ private RequestHeaderAuthenticationFilter requestHeaderAuthenticationFilter() { filter.setExceptionIfHeaderMissing(false); filter.setAuthenticationManager(authenticationManager); filter.setAuthenticationFailureHandler(new MidpointAuthenticationFailureHandler()); + filter.setAuthenticationSuccessHandler(getObjectPostProcessor().postProcess( + new MidPointAuthenticationSuccessHandler().setPrefix(getConfiguration().getPrefix()))); return filter; } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/LoginFormModuleWebSecurityConfig.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/LoginFormModuleWebSecurityConfig.java index 988fbbe65a0..5de2be601f5 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/LoginFormModuleWebSecurityConfig.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/module/LoginFormModuleWebSecurityConfig.java @@ -95,4 +95,9 @@ protected void configure(HttpSecurity http) throws Exception { protected MidpointFormLoginConfigurer getMidpointFormLoginConfiguration() { return new MidpointFormLoginConfigurer(new MidpointUsernamePasswordAuthenticationFilter()); } + + @Override + public C getConfiguration() { + return configuration; + } } From a209bd0b81da4d56330e450d410506d6655c16e4 Mon Sep 17 00:00:00 2001 From: lskublik Date: Wed, 24 Jun 2020 17:33:07 +0200 Subject: [PATCH 08/17] adding of support for null value in attribute of ConnId EqualsFilter --- .../midpoint/provisioning/impl/dummy/TestDummy.java | 2 +- .../provisioning/ucf/impl/connid/query/ValueOperation.java | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java index 82468071d3f..f80f71abc43 100644 --- a/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java +++ b/provisioning/provisioning-impl/src/test/java/com/evolveum/midpoint/provisioning/impl/dummy/TestDummy.java @@ -1819,7 +1819,7 @@ public void test171SearchShipSeaMonkey() throws Exception { public void test172SearchShipNull() throws Exception { testSeachIterativeSingleAttrFilter( DummyResourceContoller.DUMMY_ACCOUNT_ATTRIBUTE_SHIP_NAME, null, null, true, - "daemon", "Will"); + "daemon"); } @Test diff --git a/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/query/ValueOperation.java b/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/query/ValueOperation.java index 7b502d4cd92..0aaef6cabfb 100644 --- a/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/query/ValueOperation.java +++ b/provisioning/ucf-impl-connid/src/main/java/com/evolveum/midpoint/provisioning/ucf/impl/connid/query/ValueOperation.java @@ -16,6 +16,9 @@ import com.evolveum.midpoint.prism.PrismPropertyValue; import com.evolveum.midpoint.prism.query.*; +import com.evolveum.midpoint.util.logging.Trace; +import com.evolveum.midpoint.util.logging.TraceManager; + import org.identityconnectors.framework.common.objects.Attribute; import org.identityconnectors.framework.common.objects.AttributeBuilder; import org.identityconnectors.framework.common.objects.OperationalAttributes; @@ -58,8 +61,8 @@ public Filter interpret(ObjectFilter objectFilter, ConnIdNameMapper icfNameM Collection convertedValues = convertValues(propName, eq.getValues()); if (convertedValues == null || convertedValues.isEmpty()) { - // See MID-1460 - throw new UnsupportedOperationException("Equals filter with a null value is NOT supported by ICF"); + Attribute attr = AttributeBuilder.build(icfName); + return FilterBuilder.equalTo(attr); } else { Attribute attr = AttributeBuilder.build(icfName, convertedValues); if (valueFilter.getDefinition().isSingleValue()) { From 51f8178feeb7059a953ba55d64789557a1a68974 Mon Sep 17 00:00:00 2001 From: kate Date: Wed, 24 Jun 2020 23:47:57 +0200 Subject: [PATCH 09/17] some fixes for filter type config --- .../search/ReferenceValueSearchPanel.java | 3 + .../search/SearchPropertiesConfigPanel.java | 24 +-- .../search/filter/ValueSearchFilterItem.java | 174 ++++++++++++------ 3 files changed, 126 insertions(+), 75 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java index 394d569bef3..26fc348d728 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/ReferenceValueSearchPanel.java @@ -51,6 +51,8 @@ protected void onInitialize(){ } private void initLayout(){ + setOutputMarkupId(true); + TextPanel referenceTextValueField = new TextPanel(ID_REFERENCE_VALUE_TEXT_FIELD, Model.of(getReferenceTextModel())); referenceTextValueField.setOutputMarkupId(true); add(referenceTextValueField); @@ -92,6 +94,7 @@ protected List getSupportedTargetList() { @Override protected void confirmPerformed(AjaxRequestTarget target) { + target.add(ReferenceValueSearchPanel.this); } }; value.setRenderBodyOnly(true); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java index a78defe8a68..42c83c0c38a 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java @@ -15,6 +15,8 @@ import com.evolveum.midpoint.web.component.prism.InputPanel; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; + import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; @@ -38,7 +40,6 @@ import com.evolveum.midpoint.gui.api.util.WebComponentUtil; import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ValueFilter; import com.evolveum.midpoint.util.DisplayableValue; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; @@ -222,13 +223,15 @@ public void populateItem(Item>> item, String id, IModel> rowModel) { + List availableFilterNames = rowModel.getObject().getValue().getAvailableFilterNameList(); DropDownChoicePanel filterPanel = WebComponentUtil.createEnumPanel(id, - Model.ofList(Arrays.asList(ValueSearchFilterItem.FilterName.values())), - new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_FILTER_NAME), + Model.ofList(availableFilterNames), + new PropertyModel<>(rowModel, "value." + ValueSearchFilterItem.F_FILTER_TYPE_NAME), SearchPropertiesConfigPanel.this, false, getPageBase().createStringResource("SearchPropertiesConfigPanel.selectFilter").getString()); filterPanel.setOutputMarkupId(true); filterPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour()); + filterPanel.getBaseFormComponent().add(new EnableBehaviour(() -> availableFilterNames.size() > 1)); item.add(filterPanel); } }; @@ -279,7 +282,7 @@ protected List load() { private boolean isPropertyAlreadyAdded(ItemDefinition def){ List> properties = provider.getAvailableData(); for (SelectableBean prop : properties){ - if (QNameUtil.match(prop.getValue().getElementName(), def.getItemName())){ + if (QNameUtil.match(prop.getValue().getPropertyPath(), def.getItemName())){ return true; } } @@ -317,19 +320,6 @@ private ValueSearchFilterItem createDefaultValueFilter(Property property) { if (property == null){ return null; } -// ObjectFilter newFilter; -// if (property.getDefinition() instanceof PrismReferenceDefinition){ -// PrismReferenceDefinition refDefinition = (PrismReferenceDefinition) property.getDefinition(); -// newFilter = getPageBase().getPrismContext().queryFor(getType()) -// .item(property.getDefinition().getItemName()) -// .ref("", refDefinition.getTargetTypeName() != null ? refDefinition.getTargetTypeName() : ObjectType.COMPLEX_TYPE) -// .buildFilter(); -// } else { -// newFilter = getPageBase().getPrismContext().queryFor(getType()) -// .item(property.getDefinition().getItemName()) -// .isNull() -// .buildFilter(); -// } return new ValueSearchFilterItem(property, false); } diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java index 1924247313b..dbb6ccd753e 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/filter/ValueSearchFilterItem.java @@ -7,17 +7,16 @@ package com.evolveum.midpoint.web.component.search.filter; import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import javax.xml.namespace.QName; import org.apache.commons.collections.CollectionUtils; -import com.evolveum.midpoint.prism.ItemDefinition; -import com.evolveum.midpoint.prism.PrismConstants; -import com.evolveum.midpoint.prism.PrismContext; -import com.evolveum.midpoint.prism.PrismValue; -import com.evolveum.midpoint.prism.query.ObjectFilter; -import com.evolveum.midpoint.prism.query.ValueFilter; +import com.evolveum.midpoint.prism.*; +import com.evolveum.midpoint.prism.query.*; import com.evolveum.midpoint.prism.query.builder.S_ConditionEntry; import com.evolveum.midpoint.web.component.search.Property; import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType; @@ -30,7 +29,7 @@ public class ValueSearchFilterItem filterType; - FilterName(String filterName) { - this.filterName = filterName; + FilterName(Class filterType) { + this.filterType = filterType; } - public String getFilterName() { - return filterName; + public Class getFilterType() { + return filterType; + } + + public static FilterName findFilterName(F filter) { + if (filter instanceof LessFilter && ((LessFilter) filter).isEquals()) { + return FilterName.LESS_OR_EQUAL; + } else if (filter instanceof GreaterFilter && ((GreaterFilter) filter).isEquals()) { + return FilterName.GREATER_OR_EQUAL; + } else if (filter instanceof SubstringFilter && ((SubstringFilter) filter).isAnchorStart() && !((SubstringFilter) filter).isAnchorEnd()) { + return FilterName.SUBSTRING_ANCHOR_START; + } else if (filter instanceof SubstringFilter && ((SubstringFilter) filter).isAnchorEnd() && !((SubstringFilter) filter).isAnchorStart()) { + return FilterName.SUBSTRING_ANCHOR_END; + } else{ + return findFilterName(filter.getClass()); + } + } + + public static FilterName findFilterName(Class filterType){ + for (FilterName filterName : values()){ + if (filterName.getFilterType().equals(filterType.getInterfaces()[0])){ + return filterName; + } + } + return null; } } @@ -83,24 +105,22 @@ public QName getMatchingRuleName() { } private boolean applyNegation; - private ObjectFilter filter; - private FilterName filterName = FilterName.EQUAL; + private ValueFilter filter; + private FilterName filterTypeName = FilterName.EQUAL; private MatchingRule matchingRule = null; private String propertyName; private QName propertyPath; private Object value; ItemDefinition propertyDef; - public ValueSearchFilterItem(ObjectFilter filter, boolean applyNegation) { + public ValueSearchFilterItem(ValueFilter filter, boolean applyNegation) { this.filter = filter; this.applyNegation = applyNegation; - if (filter instanceof ValueFilter) { - propertyName = ((ValueFilter) filter).getElementName().toString(); - propertyPath = ((ValueFilter) filter).getElementName(); - propertyDef = ((ValueFilter) filter).getDefinition(); - value = CollectionUtils.isNotEmpty(((ValueFilter) filter).getValues()) ? - ((ValueFilter) filter).getValues().get(0) : null; - } + propertyName = filter.getElementName().toString(); + propertyPath = filter.getElementName(); + propertyDef = filter.getDefinition(); + value = CollectionUtils.isNotEmpty(filter.getValues()) ? filter.getValues().get(0) : null; + parseFilterName(); } public ValueSearchFilterItem(Property property, boolean applyNegation) { @@ -108,6 +128,10 @@ public ValueSearchFilterItem(Property property, boolean applyNegation) { propertyPath = property.getDefinition().getItemName(); propertyDef = property.getDefinition(); this.applyNegation = applyNegation; + if (propertyDef instanceof PrismReferenceDefinition){ + value = new ObjectReferenceType(); + } + parseFilterName(); } public boolean isApplyNegation() { @@ -118,11 +142,11 @@ public void setApplyNegation(boolean applyNegation) { this.applyNegation = applyNegation; } - public ObjectFilter getFilter() { + public ValueFilter getFilter() { return filter; } - public void setFilter(ObjectFilter filter) { + public void setFilter(ValueFilter filter) { this.filter = filter; } @@ -134,12 +158,12 @@ public Object getValue() { return null; } - public FilterName getFilterName() { - return filterName; + public FilterName getFilterTypeName() { + return filterTypeName; } - public void setFilterName(FilterName filterName) { - this.filterName = filterName; + public void setFilterTypeName(FilterName filterTypeName) { + this.filterTypeName = filterTypeName; } public MatchingRule getMatchingRule() { @@ -148,9 +172,6 @@ public MatchingRule getMatchingRule() { public void setMatchingRule(MatchingRule matchingRule) { this.matchingRule = matchingRule; - if (filter instanceof ValueFilter){ - ((ValueFilter) filter).setMatchingRule(matchingRule.getMatchingRuleName()); - } } public String getPropertyName() { @@ -181,40 +202,77 @@ public void setPropertyDef(ItemDefinition propertyDef) { this.propertyDef = propertyDef; } - public QName getElementName(){ - if (filter instanceof ValueFilter) { - return ((ValueFilter) filter).getElementName(); - } - return null; - } - public ObjectFilter buildFilter(PrismContext prismContext, Class type){ S_ConditionEntry conditionEntry = prismContext.queryFor(type).item(propertyPath); ObjectFilter builtFilter = null; - if (FilterName.EQUAL.equals(filterName)) { + if (FilterName.EQUAL.equals(filterTypeName)) { builtFilter = conditionEntry.eq(value).buildFilter(); - } else if (FilterName.GREATER.equals(filterName)) { + } else if (FilterName.GREATER.equals(filterTypeName)) { builtFilter = conditionEntry.gt(value).buildFilter(); - } else if (FilterName.GREATER_OR_EQUAL.equals(filterName)) { + } else if (FilterName.GREATER_OR_EQUAL.equals(filterTypeName)) { builtFilter = conditionEntry.ge(value).buildFilter(); - } else if (FilterName.LESS.equals(filterName)) { + } else if (FilterName.LESS.equals(filterTypeName)) { builtFilter = conditionEntry.lt(value).buildFilter(); - } else if (FilterName.LESS_OR_EQUAL.equals(filterName)) { + } else if (FilterName.LESS_OR_EQUAL.equals(filterTypeName)) { builtFilter = conditionEntry.le(value).buildFilter(); - } else if (FilterName.REF.equals(filterName) && value != null) { - ObjectReferenceType refVal = (ObjectReferenceType) value; + } else if (FilterName.REF.equals(filterTypeName) && value != null) { + PrismReferenceValue refVal = (PrismReferenceValue) value; //todo do we need to separately create refType and refRelation ? // if (StringUtils.isNotEmpty(refVal.getOid())){ // // } - builtFilter = conditionEntry.ref(refVal.asReferenceValue()).buildFilter(); - } else if (FilterName.SUBSTRING.equals(filterName)) { + if (refVal.getParent() instanceof RefFilter){ + builtFilter = (RefFilter) refVal.getParent(); + } else { + builtFilter = conditionEntry.ref(refVal).buildFilter(); + } + } else if (FilterName.SUBSTRING.equals(filterTypeName)) { builtFilter = conditionEntry.contains(value).buildFilter(); - } else if (FilterName.SUBSTRING_ANCHOR_START.equals(filterName)) { + } else if (FilterName.SUBSTRING_ANCHOR_START.equals(filterTypeName)) { builtFilter = conditionEntry.startsWith(value).buildFilter(); - } else if (FilterName.SUBSTRING_ANCHOR_END.equals(filterName)) { + } else if (FilterName.SUBSTRING_ANCHOR_END.equals(filterTypeName)) { builtFilter = conditionEntry.endsWith(value).buildFilter(); } + if (builtFilter instanceof ValueFilter && matchingRule != null){ + ((ValueFilter) builtFilter).setMatchingRule(matchingRule.getMatchingRuleName()); + } + if (isApplyNegation()){ + builtFilter = prismContext.queryFactory().createNot(builtFilter); + } return builtFilter != null ? builtFilter : prismContext.queryFor(type).buildFilter(); } + + private void parseFilterName (){ + if (propertyDef instanceof PrismReferenceDefinition){ + filterTypeName = FilterName.REF; + } else if (filter != null) { + filterTypeName = FilterName.findFilterName(filter); + } + } + + public List getAvailableFilterNameList(){ + if (propertyDef == null){ + return Arrays.asList(FilterName.values()); + } + if (propertyDef instanceof PrismReferenceDefinition){ + return Collections.singletonList(FilterName.REF); + } else { + List filterNames = new ArrayList<>(); + for (FilterName val : FilterName.values()) { + if (!FilterName.REF.equals(val)){ + filterNames.add(val); + } + } + return filterNames; + } + } + + public List getAvailableMatchingRuleList(){ + List matchingRules = Arrays.asList(MatchingRule.values()); + if (propertyDef == null){ + return matchingRules; + } + //todo + return matchingRules; + } } From 3cfd14c0141a2c6575136d17853f9a4116d67991 Mon Sep 17 00:00:00 2001 From: lskublik Date: Thu, 25 Jun 2020 08:33:36 +0200 Subject: [PATCH 10/17] fix for showing of question with enabled by default (MID-6286) --- .../HttpSecurityQuestionsAuthenticationEntryPoint.java | 2 +- .../testing/rest/TestSecurityQuestionChallengeResponse.java | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/HttpSecurityQuestionsAuthenticationEntryPoint.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/HttpSecurityQuestionsAuthenticationEntryPoint.java index e9329376f30..c2442729ae2 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/HttpSecurityQuestionsAuthenticationEntryPoint.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/security/HttpSecurityQuestionsAuthenticationEntryPoint.java @@ -78,7 +78,7 @@ private JSONArray generateAnswer(PrismObject user) { return null; } for (SecurityQuestionDefinitionType question : questions) { - if (Boolean.TRUE.equals(question.isEnabled())) { + if (!Boolean.FALSE.equals(question.isEnabled())) { JSONObject json = new JSONObject(); json.put(SecurityQuestionsAuthenticationFilter.J_QID, question.getIdentifier()); json.put(SecurityQuestionsAuthenticationFilter.J_QTXT, question.getQuestionText()); diff --git a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestSecurityQuestionChallengeResponse.java b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestSecurityQuestionChallengeResponse.java index 80935da3013..f73c72d5762 100644 --- a/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestSecurityQuestionChallengeResponse.java +++ b/testing/rest/src/test/java/com/evolveum/midpoint/testing/rest/TestSecurityQuestionChallengeResponse.java @@ -15,6 +15,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.apache.commons.lang3.StringUtils; import org.apache.cxf.common.util.Base64Exception; import org.apache.cxf.common.util.Base64Utility; import org.apache.cxf.jaxrs.client.ClientConfiguration; @@ -46,13 +47,14 @@ public void testChallengeResponse() { response = getUserAdministrator("SecQ " + Base64Utility.encode(secQusernameChallenge.getBytes())); challengeBase64 = assertAndGetChallenge(response); - String answerChallenge; + String answerChallenge = null; try { answerChallenge = new String(Base64Utility.decode(challengeBase64)); logger.info("Answer challenge: " + answerChallenge); } catch (Base64Exception e) { fail("Failed to decode base64 username challenge"); } + assertEquals("Wrong number of questions", 3, StringUtils.countMatches(answerChallenge, "\"qid\":")); String secQAnswerChallenge = "{" + "\"user\" : \"administrator\"," + "\"answer\" : [" From 1a18532abb50579092b0d88bc7a1c31e430dbb4a Mon Sep 17 00:00:00 2001 From: lskublik Date: Thu, 25 Jun 2020 10:30:09 +0200 Subject: [PATCH 11/17] fix for showing all enabled security questions in GUI (MID-6285) --- .../admin/home/PageMyPasswordQuestions.html | 15 +- .../admin/home/PageMyPasswordQuestions.java | 142 +++--------------- .../component/MyPasswordQuestionsPanel.html | 3 +- 3 files changed, 33 insertions(+), 127 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.html index 5fe18a86e53..d442d28c425 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.html @@ -17,22 +17,23 @@
-
-
+
+
-
+
diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java index ea3fb8b94c7..3772a00b1ae 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/PageMyPasswordQuestions.java @@ -84,19 +84,13 @@ public class PageMyPasswordQuestions extends PageAdminHome { private static final String ID_SAVE = "save"; private LoadableModel> userModel; - private List pqPanels; private IModel model; private List policyQuestionList; - private MyPasswordQuestionsPanel pwPanel; int questionNumber; - public PageMyPasswordQuestions() { - - model = new LoadableModel(false) { - private static final long serialVersionUID = 1L; @Override @@ -125,16 +119,12 @@ protected PrismObjectWrapper load() { initLayout(); } - - private PasswordQuestionsDto loadPageModel() { LOGGER.debug("Loading user for Security Question Page."); PasswordQuestionsDto dto =new PasswordQuestionsDto(); OperationResult result = new OperationResult(OPERATION_LOAD_USER); try{ - - String userOid = SecurityUtils.getPrincipalUser().getOid(); Task task = createSimpleTask(OPERATION_LOAD_USER); OperationResult subResult = result.createSubresult(OPERATION_LOAD_USER); @@ -142,13 +132,10 @@ private PasswordQuestionsDto loadPageModel() { PrismObject user = getModelService().getObject(UserType.class, userOid, null, task, subResult); dto.setSecurityAnswers(createUsersSecurityQuestionsList(user)); - subResult.recordSuccessIfUnknown(); - } catch (Exception ex) { LoggingUtils.logExceptionOnDebugLevel(LOGGER, "Couldn't get user Questions, Probably not set yet", ex); - } finally { result.recomputeStatus(); } @@ -201,71 +188,26 @@ public void initLayout(){ OperationResult result = new OperationResult(OPERATION_LOAD_QUESTION_POLICY); try{ - Task task = getPageBase().createSimpleTask(OPERATION_LOAD_QUESTION_POLICY); OperationResult subResult = result.createSubresult(OPERATION_LOAD_QUESTION_POLICY); try{ - //PrismObject config = getPageBase().getModelService().getObject( - // SystemConfigurationType.class, SystemObjectsType.SYSTEM_CONFIGURATION.value(), null, - //task, result); CredentialsPolicyType credPolicy=getModelInteractionService().getCredentialsPolicy(null, null, result); - // PrismObject securityPolicy = getModelService().getObject(SecurityPolicyType.class,config.asObjectable().getGlobalSecurityPolicyRef().getOid(), null, task, subResult); //Global Policy set question numbers if (credPolicy != null && credPolicy.getSecurityQuestions() != null) { - questionNumber = credPolicy.getSecurityQuestions().getQuestionNumber(); // Actual Policy Question List - policyQuestionList = credPolicy.getSecurityQuestions().getQuestion(); + policyQuestionList = getEnabledSecurityQuestions(credPolicy); + + questionNumber = policyQuestionList.size(); } else { questionNumber = 0; policyQuestionList = new ArrayList<>(); } }catch(Exception ex){ - ex.printStackTrace(); - - /* List userQuestionList= model.getObject().getSecurityAnswers(); - int panelNumber=0; - PrismObject user = null; - - - - Collection options = SelectorOptions.createCollection(UserType.F_CREDENTIALS, - GetOperationOptions.createRetrieve(RetrieveOption.INCLUDE)); - Task taskTwo = createSimpleTask("LOAD USER WRAPPER"); - user = getModelService().getObject(UserType.class, SecurityUtils.getPrincipalUser().getOid(), options, taskTwo, result); - - OperationResult parentResult = new OperationResult(OPERATION_LOAD_QUESTION_POLICY); - questionNumber = getModelInteractionService().getCredentialsPolicy(user, parentResult).getSecurityQuestions().getQuestionNumber(); - - policyQuestionList=getModelInteractionService().getCredentialsPolicy(user, parentResult).getSecurityQuestions().getQuestion(); - if(userQuestionList==null){ - - executeAddingQuestions(questionNumber, 0, policyQuestionList); - - LOGGER.info(getModelInteractionService().getCredentialsPolicy(user, parentResult).getSecurityQuestions().getQuestionNumber().toString()); - - }else{ - for(int userQuestint=0;userQuestintuserQuestionList.size())){ - if(userQuestionList==null){ + if ((userQuestionList==null) || (questionNumber>userQuestionList.size())){ + if (userQuestionList==null){ executeAddingQuestions(questionNumber, 0, policyQuestionList); //TODO same questions check should be implemented - }else{ + } else{ executePasswordQuestionsAndAnswers(userQuestionList, policyQuestionList, userQuestionList.size()); //QUESTION NUMBER BIGGER THAN QUESTION LIST //rest of the questions - int difference=questionNumber-userQuestionList.size(); + int difference = questionNumber - userQuestionList.size(); executeAddingQuestions(difference, userQuestionList.size(), policyQuestionList); } - }else if(questionNumber==userQuestionList.size()){ + } else if (questionNumber == userQuestionList.size()){ //QUESTION NUMBER EQUALS TO QUESTION LIST executePasswordQuestionsAndAnswers(userQuestionList, policyQuestionList, 0); - //TODO PART2: Case that policy have smaller than users's number of numbers - }else if(questionNumber < userQuestionList.size()){ - + } else if (questionNumber < userQuestionList.size()){ //QUESTION NUMBER SMALLER THAN QUESTION LIST executePasswordQuestionsAndAnswers(userQuestionList, policyQuestionList, 0); - - - //this part will be using at remove operation in the future - /* int diff = userQuestionList.size()-questionNumber; - for(Iterator iterator = userQuestionList.iterator(); iterator.hasNext();){ - - SecurityQuestionAnswerDTO element = (SecurityQuestionAnswerDTO)iterator.next(); - for(int i=0; i getEnabledSecurityQuestions(CredentialsPolicyType credPolicy) { + List actualQuestions = credPolicy.getSecurityQuestions().getQuestion(); + List enabledQuestions = new ArrayList<>(); + + for (SecurityQuestionDefinitionType actualQuestion : actualQuestions) { + if (!Boolean.FALSE.equals(actualQuestion.isEnabled())) { + enabledQuestions.add(actualQuestion); + } + } + return enabledQuestions; + } + /** * method for adding questions to user credentials * @author oguzhan @@ -571,9 +504,6 @@ private void updateQuestions(String useroid, AjaxRequestTarget target){ } - //if(answerTypeList.length !=) - - // fill in answerType data here ItemPath path = ItemPath.create(UserType.F_CREDENTIALS, CredentialsType.F_SECURITY_QUESTIONS, SecurityQuestionsCredentialsType.F_QUESTION_ANSWER); ObjectDelta objectDelta = getPrismContext().deltaFactory().object() @@ -583,32 +513,6 @@ private void updateQuestions(String useroid, AjaxRequestTarget target){ Collection> deltas = MiscSchemaUtil.createCollection(objectDelta); getModelService().executeChanges(deltas, null, task, result); - /* - System.out.println("getModel"); - Collection> deltas = new ArrayList>(); - PasswordQuestionsDto dto = new PasswordQuestionsDto(); - PrismObjectDefinition objDef =registry.findObjectDefinitionByCompileTimeClass(UserType.class); - Class type = UserType.class; - - final ItemPath valuePath = ItemPath.create(SchemaConstantsGenerated.C_CREDENTIALS, - CredentialsType.F_SECURITY_QUESTIONS, SecurityQuestionsCredentialsType.F_QUESTION_ANSWER); - SecurityQuestionAnswerType secQuesAnsType= new SecurityQuestionAnswerType(); - ProtectedStringType protStrType= new ProtectedStringType(); - protStrType.setClearValue("deneme"); - secQuesAnsType.setQuestionAnswer(protStrType); - dto.setSecurityAnswers(new ArrayList()); - dto.getSecurityAnswers().add(secQuesAnsType); - - PropertyDelta delta = PropertyDelta.createModificationReplaceProperty(valuePath, objDef, dto.getSecurityAnswers().get(0).getQuestionAnswer()); - // PropertyDelta delta= PropertyDelta.createModifica - - System.out.println("Update Questions3"); - deltas.add(ObjectDelta.createModifyDelta(useroid, delta, type, getPrismContext())); - System.out.println("Update Questions4"); - getModelService().executeChanges(deltas, null, createSimpleTask(OPERATION_SAVE_QUESTIONS), result); - System.out.println("Update Questions5"); - - */ success(getString("message.success")); target.add(getFeedbackPanel()); } catch(Exception ex){ diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/MyPasswordQuestionsPanel.html b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/MyPasswordQuestionsPanel.html index 239cb6244ab..a915ea36dc6 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/MyPasswordQuestionsPanel.html +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/page/admin/home/component/MyPasswordQuestionsPanel.html @@ -2,7 +2,8 @@ - + From 1b9d2c1b7a4dbe5feff84859b86a9120fc25aa9c Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 25 Jun 2020 11:10:23 +0200 Subject: [PATCH 12/17] property selection fix --- .../search/BasicSearchFilterModel.java | 8 ++--- .../search/SearchPropertiesConfigPanel.java | 36 ++++++------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java index af3fa7ead0e..487b3aaf34b 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/BasicSearchFilterModel.java @@ -56,10 +56,10 @@ public BasicSearchFilter getObject() { private BasicSearchFilter loadBasicSearchFilter(){ try { - SearchFilterType value = baseModel.getObject(); - if (value == null) { - return null; - } +// SearchFilterType value = baseModel.getObject(); +// if (value == null) { +// return new BasicSearchFilter(pageBase.getPrismContext(), null, type); +// } ObjectFilter objectFilter = pageBase.getPrismContext().getQueryConverter().createObjectFilter(type, baseModel.getObject()); return new BasicSearchFilter(pageBase.getPrismContext(), objectFilter, type); diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java index 42c83c0c38a..81537fe87b7 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/web/component/search/SearchPropertiesConfigPanel.java @@ -11,12 +11,6 @@ import java.util.Iterator; import java.util.List; -import com.evolveum.midpoint.util.QNameUtil; - -import com.evolveum.midpoint.web.component.prism.InputPanel; - -import com.evolveum.midpoint.web.component.util.EnableBehaviour; - import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.apache.wicket.Component; @@ -41,6 +35,7 @@ import com.evolveum.midpoint.prism.*; import com.evolveum.midpoint.prism.query.ObjectFilter; import com.evolveum.midpoint.util.DisplayableValue; +import com.evolveum.midpoint.util.QNameUtil; import com.evolveum.midpoint.web.component.AjaxButton; import com.evolveum.midpoint.web.component.data.BoxedTablePanel; import com.evolveum.midpoint.web.component.data.column.CheckBoxColumn; @@ -48,8 +43,10 @@ import com.evolveum.midpoint.web.component.dialog.Popupable; import com.evolveum.midpoint.web.component.input.DropDownChoicePanel; import com.evolveum.midpoint.web.component.input.TextPanel; +import com.evolveum.midpoint.web.component.prism.InputPanel; import com.evolveum.midpoint.web.component.search.filter.BasicSearchFilter; import com.evolveum.midpoint.web.component.search.filter.ValueSearchFilterItem; +import com.evolveum.midpoint.web.component.util.EnableBehaviour; import com.evolveum.midpoint.web.component.util.SelectableBean; import com.evolveum.midpoint.web.component.util.SelectableListDataProvider; import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour; @@ -84,7 +81,7 @@ protected void initConfigurationPanel(WebMarkupContainer configPanel) { configPanel.add(propertyConfigContainer); DropDownChoicePanel propertyChoicePanel = new DropDownChoicePanel(ID_PROPERTY_CHOICE, - getDefaultPropertyChoiceModel(), getAvailablePropertiesListModel(), new IChoiceRenderer() { + Model.of(getDefaultPropertyChoice()), getAvailablePropertiesListModel(), new IChoiceRenderer() { private static final long serialVersionUID = 1L; @@ -128,19 +125,12 @@ public void onClick(AjaxRequestTarget ajaxRequestTarget) { initTable(configPanel); } - private LoadableModel getDefaultPropertyChoiceModel(){ - return new LoadableModel() { - private static final long serialVersionUID = 1L; - - @Override - protected Property load() { - List availablePropertiesList = getAvailablePropertiesListModel().getObject(); - if (CollectionUtils.isNotEmpty(availablePropertiesList)){ - return availablePropertiesList.get(0); - } - return null; - } - }; + private Property getDefaultPropertyChoice() { + List availablePropertiesList = getAvailablePropertiesListModel().getObject(); + if (CollectionUtils.isNotEmpty(availablePropertiesList)) { + return availablePropertiesList.get(0); + } + return null; } private void initTable(WebMarkupContainer configPanel) { @@ -323,12 +313,6 @@ private ValueSearchFilterItem createDefaultValueFilter(Property property) { return new ValueSearchFilterItem(property, false); } - private Property getSelectedProperty() { - DropDownChoicePanel propertyChoicePanel = (DropDownChoicePanel) get(getPageBase() - .createComponentPath(ID_CONFIGURATION_PANEL, ID_PROPERTY_CONFIG_CONTAINER, ID_PROPERTY_CHOICE)); - return propertyChoicePanel.getModel().getObject(); - } - private Component getPropertyValueField(String id, IModel> rowModel) { Component searchItemField = null; ValueSearchFilterItem valueSearchFilter = rowModel.getObject().getValue(); From 5f0c9e5c586059b1e1faa5afe5a5aaf77e401581 Mon Sep 17 00:00:00 2001 From: Hiroyuki Wada Date: Thu, 25 Jun 2020 18:37:33 +0900 Subject: [PATCH 13/17] MID-6348 fix missing nfkd (#123) --- .../_public/types_3/PolyStringNormalizerConfigurationType.java | 1 + 1 file changed, 1 insertion(+) diff --git a/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/PolyStringNormalizerConfigurationType.java b/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/PolyStringNormalizerConfigurationType.java index b3f4c2a7efe..52952200e47 100644 --- a/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/PolyStringNormalizerConfigurationType.java +++ b/infra/prism-api/src/main/java/com/evolveum/prism/xml/ns/_public/types_3/PolyStringNormalizerConfigurationType.java @@ -95,6 +95,7 @@ public PolyStringNormalizerConfigurationType clone() { PolyStringNormalizerConfigurationType clone = new PolyStringNormalizerConfigurationType(); clone.setClassName(getClassName()); clone.setTrim(isTrim()); + clone.setNfkd(isNfkd()); clone.setTrimWhitespace(isTrimWhitespace()); clone.setLowercase(isLowercase()); return clone; From 7a198771c7f19bf6abefc377b225a7d222f77218 Mon Sep 17 00:00:00 2001 From: lskublik Date: Thu, 25 Jun 2020 12:01:11 +0200 Subject: [PATCH 14/17] fix for sql script because of changed column name in table m_acc_cert_campaign --- config/sql/h2-4.2-all.sql | 30 ++++++++++---------- config/sql/h2-upgrade-4.0-4.2.sql | 4 +++ config/sql/mysql-4.2-all-utf8mb4.sql | 30 ++++++++++---------- config/sql/mysql-4.2-all.sql | 30 ++++++++++---------- config/sql/mysql-upgrade-4.0-4.2-utf8mb4.sql | 4 +++ config/sql/mysql-upgrade-4.0-4.2.sql | 4 +++ config/sql/oracle-4.2-all.sql | 30 ++++++++++---------- config/sql/oracle-upgrade-4.0-4.2.sql | 4 +++ config/sql/postgresql-4.2-all.sql | 30 ++++++++++---------- config/sql/postgresql-upgrade-4.0-4.2.sql | 4 +++ config/sql/sqlserver-4.2-all.sql | 30 ++++++++++---------- config/sql/sqlserver-upgrade-4.0-4.2.sql | 4 +++ 12 files changed, 114 insertions(+), 90 deletions(-) diff --git a/config/sql/h2-4.2-all.sql b/config/sql/h2-4.2-all.sql index c3516fedf76..c5af9a50a9a 100644 --- a/config/sql/h2-4.2-all.sql +++ b/config/sql/h2-4.2-all.sql @@ -3,21 +3,21 @@ -- If you want to add Quartz-related tables, please use files from quartz directory. CREATE TABLE m_acc_cert_campaign ( - definitionRef_relation VARCHAR(157), - definitionRef_targetOid VARCHAR(36), - definitionRef_type INTEGER, - endTimestamp TIMESTAMP, - handlerUri VARCHAR(255), - iteration INTEGER NOT NULL, - name_norm VARCHAR(255), - name_orig VARCHAR(255), - ownerRef_relation VARCHAR(157), - ownerRef_targetOid VARCHAR(36), - ownerRef_type INTEGER, - stageNumber INTEGER, - startTimestamp TIMESTAMP, - state INTEGER, - oid VARCHAR(36) NOT NULL, + definitionRef_relation VARCHAR(157), + definitionRef_targetOid VARCHAR(36), + definitionRef_targetType INTEGER, + endTimestamp TIMESTAMP, + handlerUri VARCHAR(255), + iteration INTEGER NOT NULL, + name_norm VARCHAR(255), + name_orig VARCHAR(255), + ownerRef_relation VARCHAR(157), + ownerRef_targetOid VARCHAR(36), + ownerRef_type INTEGER, + stageNumber INTEGER, + startTimestamp TIMESTAMP, + state INTEGER, + oid VARCHAR(36) NOT NULL, PRIMARY KEY (oid) ); CREATE TABLE m_acc_cert_case ( diff --git a/config/sql/h2-upgrade-4.0-4.2.sql b/config/sql/h2-upgrade-4.0-4.2.sql index fef3edf4ea8..edb745d9b19 100644 --- a/config/sql/h2-upgrade-4.0-4.2.sql +++ b/config/sql/h2-upgrade-4.0-4.2.sql @@ -5,4 +5,8 @@ CREATE INDEX iOpExecTimestampValue UPDATE m_global_metadata SET value = '4.2' WHERE name = 'databaseSchemaVersion'; +-- 2020-06-25 11:35 + +ALTER TABLE m_acc_cert_campaign ALTER COLUMN definitionRef_type RENAME TO definitionRef_targetType; + COMMIT; diff --git a/config/sql/mysql-4.2-all-utf8mb4.sql b/config/sql/mysql-4.2-all-utf8mb4.sql index 6d906774e5f..70c7d7c1b1a 100644 --- a/config/sql/mysql-4.2-all-utf8mb4.sql +++ b/config/sql/mysql-4.2-all-utf8mb4.sql @@ -1,21 +1,21 @@ -- remove iAncestor and iDescendant index, they are the same as FK for that fields CREATE TABLE m_acc_cert_campaign ( - definitionRef_relation VARCHAR(157), - definitionRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin, - definitionRef_type INTEGER, - endTimestamp DATETIME(6), - handlerUri VARCHAR(255), - iteration INTEGER NOT NULL, - name_norm VARCHAR(191), - name_orig VARCHAR(191), - ownerRef_relation VARCHAR(157), - ownerRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin , - ownerRef_type INTEGER, - stageNumber INTEGER, - startTimestamp DATETIME(6), - state INTEGER, - oid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin NOT NULL, + definitionRef_relation VARCHAR(157), + definitionRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin, + definitionRef_targetType INTEGER, + endTimestamp DATETIME(6), + handlerUri VARCHAR(255), + iteration INTEGER NOT NULL, + name_norm VARCHAR(191), + name_orig VARCHAR(191), + ownerRef_relation VARCHAR(157), + ownerRef_targetOid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin , + ownerRef_type INTEGER, + stageNumber INTEGER, + startTimestamp DATETIME(6), + state INTEGER, + oid VARCHAR(36) CHARSET utf8 COLLATE utf8_bin NOT NULL, PRIMARY KEY (oid) ) DEFAULT CHARACTER SET utf8mb4 diff --git a/config/sql/mysql-4.2-all.sql b/config/sql/mysql-4.2-all.sql index 7d18ecb8cc7..98f94c50f6e 100644 --- a/config/sql/mysql-4.2-all.sql +++ b/config/sql/mysql-4.2-all.sql @@ -1,21 +1,21 @@ -- remove iAncestor and iDescendant index, they are the same as FK for that fields CREATE TABLE m_acc_cert_campaign ( - definitionRef_relation VARCHAR(157), - definitionRef_targetOid VARCHAR(36), - definitionRef_type INTEGER, - endTimestamp DATETIME(6), - handlerUri VARCHAR(255), - iteration INTEGER NOT NULL, - name_norm VARCHAR(255), - name_orig VARCHAR(255), - ownerRef_relation VARCHAR(157), - ownerRef_targetOid VARCHAR(36), - ownerRef_type INTEGER, - stageNumber INTEGER, - startTimestamp DATETIME(6), - state INTEGER, - oid VARCHAR(36) NOT NULL, + definitionRef_relation VARCHAR(157), + definitionRef_targetOid VARCHAR(36), + definitionRef_targetType INTEGER, + endTimestamp DATETIME(6), + handlerUri VARCHAR(255), + iteration INTEGER NOT NULL, + name_norm VARCHAR(255), + name_orig VARCHAR(255), + ownerRef_relation VARCHAR(157), + ownerRef_targetOid VARCHAR(36), + ownerRef_type INTEGER, + stageNumber INTEGER, + startTimestamp DATETIME(6), + state INTEGER, + oid VARCHAR(36) NOT NULL, PRIMARY KEY (oid) ) DEFAULT CHARACTER SET utf8 diff --git a/config/sql/mysql-upgrade-4.0-4.2-utf8mb4.sql b/config/sql/mysql-upgrade-4.0-4.2-utf8mb4.sql index fef3edf4ea8..a476a9d45ca 100644 --- a/config/sql/mysql-upgrade-4.0-4.2-utf8mb4.sql +++ b/config/sql/mysql-upgrade-4.0-4.2-utf8mb4.sql @@ -5,4 +5,8 @@ CREATE INDEX iOpExecTimestampValue UPDATE m_global_metadata SET value = '4.2' WHERE name = 'databaseSchemaVersion'; +-- 2020-06-25 11:35 + +ALTER TABLE m_acc_cert_campaign CHANGE definitionRef_type definitionRef_targetType INTEGER; + COMMIT; diff --git a/config/sql/mysql-upgrade-4.0-4.2.sql b/config/sql/mysql-upgrade-4.0-4.2.sql index fef3edf4ea8..a476a9d45ca 100644 --- a/config/sql/mysql-upgrade-4.0-4.2.sql +++ b/config/sql/mysql-upgrade-4.0-4.2.sql @@ -5,4 +5,8 @@ CREATE INDEX iOpExecTimestampValue UPDATE m_global_metadata SET value = '4.2' WHERE name = 'databaseSchemaVersion'; +-- 2020-06-25 11:35 + +ALTER TABLE m_acc_cert_campaign CHANGE definitionRef_type definitionRef_targetType INTEGER; + COMMIT; diff --git a/config/sql/oracle-4.2-all.sql b/config/sql/oracle-4.2-all.sql index b59179deb69..0f93f484e17 100644 --- a/config/sql/oracle-4.2-all.sql +++ b/config/sql/oracle-4.2-all.sql @@ -1,19 +1,19 @@ CREATE TABLE m_acc_cert_campaign ( - definitionRef_relation VARCHAR2(157 CHAR), - definitionRef_targetOid VARCHAR2(36 CHAR), - definitionRef_type NUMBER(10, 0), - endTimestamp TIMESTAMP, - handlerUri VARCHAR2(255 CHAR), - iteration NUMBER(10, 0) NOT NULL, - name_norm VARCHAR2(255 CHAR), - name_orig VARCHAR2(255 CHAR), - ownerRef_relation VARCHAR2(157 CHAR), - ownerRef_targetOid VARCHAR2(36 CHAR), - ownerRef_type NUMBER(10, 0), - stageNumber NUMBER(10, 0), - startTimestamp TIMESTAMP, - state NUMBER(10, 0), - oid VARCHAR2(36 CHAR) NOT NULL, + definitionRef_relation VARCHAR2(157 CHAR), + definitionRef_targetOid VARCHAR2(36 CHAR), + definitionRef_targetType NUMBER(10, 0), + endTimestamp TIMESTAMP, + handlerUri VARCHAR2(255 CHAR), + iteration NUMBER(10, 0) NOT NULL, + name_norm VARCHAR2(255 CHAR), + name_orig VARCHAR2(255 CHAR), + ownerRef_relation VARCHAR2(157 CHAR), + ownerRef_targetOid VARCHAR2(36 CHAR), + ownerRef_type NUMBER(10, 0), + stageNumber NUMBER(10, 0), + startTimestamp TIMESTAMP, + state NUMBER(10, 0), + oid VARCHAR2(36 CHAR) NOT NULL, PRIMARY KEY (oid) ) INITRANS 30; CREATE TABLE m_acc_cert_case ( diff --git a/config/sql/oracle-upgrade-4.0-4.2.sql b/config/sql/oracle-upgrade-4.0-4.2.sql index 1384a35dcb1..1535ede5128 100644 --- a/config/sql/oracle-upgrade-4.0-4.2.sql +++ b/config/sql/oracle-upgrade-4.0-4.2.sql @@ -5,4 +5,8 @@ CREATE INDEX iOpExecTimestampValue UPDATE m_global_metadata SET value = '4.2' WHERE name = 'databaseSchemaVersion'; +-- 2020-06-25 11:35 + +ALTER TABLE m_acc_cert_campaign RENAME COLUMN definitionRef_type TO definitionRef_targetType; + COMMIT; diff --git a/config/sql/postgresql-4.2-all.sql b/config/sql/postgresql-4.2-all.sql index b2316b22f7f..d190603fe74 100644 --- a/config/sql/postgresql-4.2-all.sql +++ b/config/sql/postgresql-4.2-all.sql @@ -1,19 +1,19 @@ CREATE TABLE m_acc_cert_campaign ( - definitionRef_relation VARCHAR(157), - definitionRef_targetOid VARCHAR(36), - definitionRef_type INT4, - endTimestamp TIMESTAMP, - handlerUri VARCHAR(255), - iteration INT4 NOT NULL, - name_norm VARCHAR(255), - name_orig VARCHAR(255), - ownerRef_relation VARCHAR(157), - ownerRef_targetOid VARCHAR(36), - ownerRef_type INT4, - stageNumber INT4, - startTimestamp TIMESTAMP, - state INT4, - oid VARCHAR(36) NOT NULL, + definitionRef_relation VARCHAR(157), + definitionRef_targetOid VARCHAR(36), + definitionRef_targetType INT4, + endTimestamp TIMESTAMP, + handlerUri VARCHAR(255), + iteration INT4 NOT NULL, + name_norm VARCHAR(255), + name_orig VARCHAR(255), + ownerRef_relation VARCHAR(157), + ownerRef_targetOid VARCHAR(36), + ownerRef_type INT4, + stageNumber INT4, + startTimestamp TIMESTAMP, + state INT4, + oid VARCHAR(36) NOT NULL, PRIMARY KEY (oid) ); CREATE TABLE m_acc_cert_case ( diff --git a/config/sql/postgresql-upgrade-4.0-4.2.sql b/config/sql/postgresql-upgrade-4.0-4.2.sql index fef3edf4ea8..6f1b5b99eb2 100644 --- a/config/sql/postgresql-upgrade-4.0-4.2.sql +++ b/config/sql/postgresql-upgrade-4.0-4.2.sql @@ -5,4 +5,8 @@ CREATE INDEX iOpExecTimestampValue UPDATE m_global_metadata SET value = '4.2' WHERE name = 'databaseSchemaVersion'; +-- 2020-06-25 11:35 + +ALTER TABLE m_acc_cert_campaign RENAME COLUMN definitionRef_type TO definitionRef_targetType; + COMMIT; diff --git a/config/sql/sqlserver-4.2-all.sql b/config/sql/sqlserver-4.2-all.sql index a0188afe05b..1765dd5ceaa 100644 --- a/config/sql/sqlserver-4.2-all.sql +++ b/config/sql/sqlserver-4.2-all.sql @@ -1,19 +1,19 @@ CREATE TABLE m_acc_cert_campaign ( - definitionRef_relation NVARCHAR(157) COLLATE database_default, - definitionRef_targetOid NVARCHAR(36) COLLATE database_default, - definitionRef_type INT, - endTimestamp DATETIME2, - handlerUri NVARCHAR(255) COLLATE database_default, - iteration INT NOT NULL, - name_norm NVARCHAR(255) COLLATE database_default, - name_orig NVARCHAR(255) COLLATE database_default, - ownerRef_relation NVARCHAR(157) COLLATE database_default, - ownerRef_targetOid NVARCHAR(36) COLLATE database_default, - ownerRef_type INT, - stageNumber INT, - startTimestamp DATETIME2, - state INT, - oid NVARCHAR(36) COLLATE database_default NOT NULL, + definitionRef_relation NVARCHAR(157) COLLATE database_default, + definitionRef_targetOid NVARCHAR(36) COLLATE database_default, + definitionRef_targetType INT, + endTimestamp DATETIME2, + handlerUri NVARCHAR(255) COLLATE database_default, + iteration INT NOT NULL, + name_norm NVARCHAR(255) COLLATE database_default, + name_orig NVARCHAR(255) COLLATE database_default, + ownerRef_relation NVARCHAR(157) COLLATE database_default, + ownerRef_targetOid NVARCHAR(36) COLLATE database_default, + ownerRef_type INT, + stageNumber INT, + startTimestamp DATETIME2, + state INT, + oid NVARCHAR(36) COLLATE database_default NOT NULL, PRIMARY KEY (oid) ); CREATE TABLE m_acc_cert_case ( diff --git a/config/sql/sqlserver-upgrade-4.0-4.2.sql b/config/sql/sqlserver-upgrade-4.0-4.2.sql index 2106cf5c0e6..ee8f978587b 100644 --- a/config/sql/sqlserver-upgrade-4.0-4.2.sql +++ b/config/sql/sqlserver-upgrade-4.0-4.2.sql @@ -7,4 +7,8 @@ BEGIN TRANSACTION UPDATE m_global_metadata SET value = '4.2' WHERE name = 'databaseSchemaVersion'; COMMIT; +-- 2020-06-25 11:35 + +UPDATE m_acc_cert_campaign SET definitionRef_type = convert(INT, definitionRef_targetType) where definitionRef_targetType is not null; + GO From e501f450e127e05909aaeab90d52af535e18e8bb Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 23 Jun 2020 14:54:29 +0200 Subject: [PATCH 15/17] Fix CacheCounterManager memleak (MID-6343) Counters are cleaned up for all tasks (not only for lightweight partitioning ones). Cherry-picked from b6ce9f3203b0f2db753f26266239a4102f67e761. --- .../midpoint/task/quartzimpl/TaskManagerQuartzImpl.java | 5 +++++ .../midpoint/task/quartzimpl/execution/JobExecutor.java | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) 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 4b0ce05a722..5a12aadd497 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 @@ -120,6 +120,7 @@ public class TaskManagerQuartzImpl implements TaskManager, BeanFactoryAware, Sys @Autowired private Tracer tracer; @Autowired private CacheDispatcher cacheDispatcher; @Autowired private CacheRegistry cacheRegistry; + @Autowired private CounterManager counterManager; private GlobalTracingOverride globalTracingOverride; @@ -2721,4 +2722,8 @@ public Collection getLocalNodeGroups() { public CacheRegistry getCacheRegistry() { return cacheRegistry; } + + public CounterManager getCounterManager() { + return counterManager; + } } diff --git a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java index dc546f9754f..8faa287b211 100644 --- a/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java +++ b/repo/task-quartz-impl/src/main/java/com/evolveum/midpoint/task/quartzimpl/execution/JobExecutor.java @@ -725,7 +725,13 @@ private TaskRunResult executeHandler(TaskHandler handler, OperationResult execut task.setResultTransient(task.createUnnamedTaskResult()); } - TaskRunResult runResult = taskManagerImpl.getHandlerExecutor().executeHandler(task, null, handler, executionResult); + TaskRunResult runResult; + try { + runResult = taskManagerImpl.getHandlerExecutor().executeHandler(task, null, handler, executionResult); + } finally { + // TEMPORARY see MID-6343; TODO implement correctly! + taskManagerImpl.getCounterManager().cleanupCounters(task.getOid()); + } // It is dangerous to start waiting for transient children if they were not told to finish! Make sure you signal them // to stop at appropriate place. From 2ee8f556acccaf882e6f10b650c1d086a4e90833 Mon Sep 17 00:00:00 2001 From: Pavol Mederly Date: Tue, 23 Jun 2020 16:31:41 +0200 Subject: [PATCH 16/17] Remove loading work items and cases (MID-6344) The loadWorkItems() and loadMyRequests() methods on PageDashboard were doing unconstrained searches for work items and cases, leading to consumption of huge amounts (hundreds of MBs) of heap. Output of the methods was not used anyway, so here we simple deleted them. Cherry-picked from 5241d3a32e9bd6590393f1c9f94fc5a0ba023cad. --- .../web/page/self/PageSelfDashboard.java | 104 +----------------- 1 file changed, 5 insertions(+), 99 deletions(-) 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 8da27ce5c9b..5fc5281532e 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 @@ -8,6 +8,7 @@ import static com.evolveum.midpoint.prism.PrismConstants.T_PARENT; import static com.evolveum.midpoint.xml.ns._public.common.common_3.CaseWorkItemType.F_CREATE_TIMESTAMP; +import static java.util.Collections.emptyList; import java.util.*; @@ -175,9 +176,8 @@ protected SecurityContextAwareCallable>> c private static final long serialVersionUID = 1L; @Override - public CallableResult> callWithContextPrepared() throws Exception { - setupContext(application, session); // TODO is this correct? [med] - return loadWorkItems(); + public CallableResult> callWithContextPrepared() { + return new CallableResult<>(emptyList(), null); // it is ignored anyway - FIXME } }; } @@ -227,9 +227,8 @@ protected SecurityContextAwareCallable>> createCal private static final long serialVersionUID = 1L; @Override - public CallableResult> callWithContextPrepared() throws Exception { - setupContext(application, session); - return loadMyRequests(); + public CallableResult> callWithContextPrepared() { + return new CallableResult<>(emptyList(), null); // it is ignored anyway - FIXME } }; } @@ -272,99 +271,6 @@ public boolean isVisible() { initAssignments(); } - private CallableResult> loadWorkItems() { - - LOGGER.debug("Loading work items."); - - AccountCallableResult callableResult = new AccountCallableResult(); - List list = new ArrayList<>(); - callableResult.setValue(list); - - if (!getWorkflowManager().isEnabled()) { - return callableResult; - } - - PrismObject user = principalModel.getObject(); - if (user == null) { - return callableResult; - } - - Task task = createSimpleTask(OPERATION_LOAD_WORK_ITEMS); - OperationResult result = task.getResult(); - callableResult.setResult(result); - - try { - // TODO try to use current state (user) instead of potentially obsolete principal - // but this requires some computation (of deputy relation) - // (Note that the current code is consistent with the other places where work items are displayed.) - S_FilterEntryOrEmpty q = getPrismContext().queryFor(CaseWorkItemType.class); - ObjectQuery query = QueryUtils.filterForAssignees(q, SecurityUtils.getPrincipalUser(), - OtherPrivilegesLimitationType.F_APPROVAL_WORK_ITEMS, getRelationRegistry()) - .desc(F_CREATE_TIMESTAMP) - .build(); - Collection> options = getOperationOptionsBuilder() - .item(T_PARENT, CaseType.F_OBJECT_REF).resolve() - .item(T_PARENT, CaseType.F_TARGET_REF).resolve() - .build(); - List workItems = getModelService().searchContainers(CaseWorkItemType.class, query, options, task, result); - callableResult.setValue(workItems); - } catch (Exception e) { - result.recordFatalError(getString("PageSelfDashboard.message.loadWorkItems.fatalError"), e); - } - - result.recordSuccessIfUnknown(); - result.recomputeStatus(); - - LOGGER.debug("Finished work items loading."); - - return callableResult; - } - - private CallableResult> loadMyRequests() { - - LOGGER.debug("Loading requests."); - - AccountCallableResult> callableResult = new AccountCallableResult<>(); - List list = new ArrayList<>(); - callableResult.setValue(list); - - if (!getWorkflowManager().isEnabled()) { - return callableResult; - } - - PrismObject focus = principalModel.getObject(); - if (focus == null) { - return callableResult; - } - - Task task = createSimpleTask(OPERATION_LOAD_REQUESTS); - OperationResult result = task.getResult(); - callableResult.setResult(result); - - try { - S_FilterEntryOrEmpty q = getPrismContext().queryFor(CaseType.class); - ObjectQuery query = QueryUtils.filterForMyRequests(q, focus.getOid()) - .build(); - Collection> options = getOperationOptionsBuilder() - .item(CaseType.F_OBJECT_REF).resolve() - .item(CaseType.F_TARGET_REF).resolve() - .build(); - List> cases = getModelService().searchObjects(CaseType.class, query, options, task, result); - cases.forEach(caseObj -> list.add(caseObj.asObjectable())); - callableResult.setValue(list); - } catch (Exception e) { - result.recordFatalError(getString("PageSelfDashboard.message.loadWorkItems.fatalError"), e); - } - - result.recordSuccessIfUnknown(); - result.recomputeStatus(); - - LOGGER.debug("Finished requests loading."); - - return callableResult; - } - - private PrismObject loadFocus() { MidPointPrincipal principal = SecurityUtils.getPrincipalUser(); Validate.notNull(principal, "No principal"); From 023def35b2718d982f5fc4c62c4df437dabeab4f Mon Sep 17 00:00:00 2001 From: kate Date: Thu, 25 Jun 2020 14:34:35 +0200 Subject: [PATCH 17/17] npe fix --- .../impl/factory/wrapper/PrismContainerWrapperFactoryImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismContainerWrapperFactoryImpl.java b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismContainerWrapperFactoryImpl.java index f0975820a2c..ce0f1d2c934 100644 --- a/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismContainerWrapperFactoryImpl.java +++ b/gui/admin-gui/src/main/java/com/evolveum/midpoint/gui/impl/factory/wrapper/PrismContainerWrapperFactoryImpl.java @@ -81,6 +81,9 @@ public PrismContainerValueWrapper createValueWrapper(PrismContainerWrapper } protected List getItemDefinitions(PrismContainerWrapper parent, PrismContainerValue value) { + if (parent == null){ + return new ArrayList<>(); + } return parent.getDefinitions(); }