Skip to content

Commit

Permalink
implementing logic of proccessing delta for ResourceAttributeMapping
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Aug 25, 2022
1 parent 8b72973 commit 1e0b0c1
Show file tree
Hide file tree
Showing 17 changed files with 934 additions and 138 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -12,16 +12,12 @@
import com.evolveum.midpoint.gui.impl.page.admin.resource.ResourceDetailsModel;
import com.evolveum.midpoint.web.component.AjaxIconButton;
import com.evolveum.midpoint.web.component.breadcrumbs.Breadcrumb;
import com.evolveum.midpoint.web.component.util.EnableBehaviour;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;
import com.evolveum.midpoint.web.page.admin.resources.PageResources;

import org.apache.commons.lang3.StringUtils;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.markup.html.AjaxLink;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.list.ListItem;
import org.apache.wicket.markup.html.list.ListView;
Expand Down Expand Up @@ -59,7 +55,7 @@ protected void onInitialize() {
}

private void addBreadcrumb() {
List<Breadcrumb> breadcrumbs = getBreadcrumbsModel().getObject();
List<Breadcrumb> breadcrumbs = getBreadcrumb();
IModel<String> breadcrumbLabelModel = getBreadcrumbLabel();
String breadcrumbLabel = breadcrumbLabelModel.getObject();

Expand All @@ -79,12 +75,14 @@ private void addBreadcrumb() {
@NotNull protected abstract IModel<String> getBreadcrumbLabel();

private void removeLastBreadcrumb() {
int index = getBreadcrumbsModel().getObject().size() - 1;
getBreadcrumbsModel().getObject().remove(index);
int index = getBreadcrumb().size() - 1;
getBreadcrumb().remove(index);
}

private void initLayout() {
ListView<Breadcrumb> breadcrumbs = new ListView<>(ID_BREADCRUMB, getBreadcrumbsModel()) {

IModel<List<Breadcrumb>> breadcrumb = () -> getBreadcrumb();
ListView<Breadcrumb> breadcrumbs = new ListView<>(ID_BREADCRUMB, breadcrumb) {

private static final long serialVersionUID = 1L;

Expand All @@ -102,7 +100,7 @@ protected void populateItem(ListItem<Breadcrumb> item) {
}
};
add(breadcrumbs);
breadcrumbs.add(new VisibleBehaviour(() -> getBreadcrumbsModel().getObject().size() > 1));
breadcrumbs.add(new VisibleBehaviour(() -> getBreadcrumb().size() > 1));

Label mainText = new Label(ID_TEXT, getTextModel());
mainText.add(new VisibleBehaviour(() -> getTextModel().getObject() != null));
Expand Down Expand Up @@ -132,12 +130,12 @@ public void onClick(AjaxRequestTarget target) {
add(buttons);
}

private IModel<List<Breadcrumb>> getBreadcrumbsModel() {
private List<Breadcrumb> getBreadcrumb() {
PageBase page = getPageBase();
if (page instanceof PageResource) {
return ((PageResource)page).getWizardBreadcrumbs();
}
return Model.ofList(List.of());
return List.of();
}

protected IModel<String> getExitLabel() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@
*/
package com.evolveum.midpoint.gui.api.factory.wrapper;

import com.evolveum.midpoint.provisioning.api.DiscoveredConfiguration;
import com.evolveum.midpoint.schema.ResourceShadowCoordinates;
import com.evolveum.midpoint.schema.processor.ResourceAssociationDefinition;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
Expand All @@ -15,14 +14,12 @@
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.util.annotation.Experimental;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.NotNull;

import javax.xml.namespace.QName;
import java.util.*;

/**
Expand Down Expand Up @@ -66,6 +63,15 @@ public class WrapperContext {
private List<ContainerPanelConfigurationType> detailsPageTypeConfiguration;
private Collection<VirtualContainersSpecificationType> virtualContainers = new ArrayList<>();

//Attribute mapping related attributes
public enum AttributeMappingType {
INBOUND,
OUTBOUND,
OVERRIDE
}
private AttributeMappingType attributeMappingType;
private boolean configureMappingType;

public WrapperContext(Task task, OperationResult result) {
this.task = task;
this.result = result != null ? result : new OperationResult("temporary"); // TODO !!!
Expand Down Expand Up @@ -250,6 +256,22 @@ public void setDetailsPageTypeConfiguration(List<ContainerPanelConfigurationType
this.detailsPageTypeConfiguration = detailsPageTypeConfiguration;
}

public void setAttributeMappingType(AttributeMappingType attributeMappingType) {
this.attributeMappingType = attributeMappingType;
}

public AttributeMappingType getAttributeMappingType() {
return attributeMappingType;
}

public void setConfigureMappingType(boolean configureMappingType) {
this.configureMappingType = configureMappingType;
}

public boolean isConfigureMappingType() {
return configureMappingType;
}

public WrapperContext clone() {
WrapperContext ctx = new WrapperContext(task,result);
ctx.setAuthzPhase(authzPhase);
Expand All @@ -266,6 +288,8 @@ public WrapperContext clone() {
ctx.setMetadataItemProcessingSpec(metadataItemProcessingSpec);
ctx.lookupTableCache = lookupTableCache;
ctx.setDetailsPageTypeConfiguration(detailsPageTypeConfiguration);
ctx.setAttributeMappingType(attributeMappingType);
ctx.setConfigureMappingType(configureMappingType);
return ctx;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
package com.evolveum.midpoint.gui.impl.factory.panel;

import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
Expand Down Expand Up @@ -85,10 +86,9 @@ protected Panel getPanel(PrismPropertyPanelContext<ItemPathType> panelCtx) {
PrismObjectWrapper<ResourceType> objectWrapper = panelCtx.unwrapWrapperModel().findObjectWrapper();
if (objectWrapper != null) {

ResourceSchema schema = ResourceDetailsModel.getResourceSchema(objectWrapper, panelCtx.getPageBase());
if (schema != null) {
IModel<List<DisplayableValue<ItemPathType>>> values = getChoices(panelCtx.getValueWrapperModel(), panelCtx.getPageBase());

IModel<List<DisplayableValue<ItemPathType>>> values = getChoices(panelCtx.getValueWrapperModel(), schema);
if(!values.getObject().isEmpty()) {

if (CollectionUtils.isNotEmpty(values.getObject())) {

Expand All @@ -107,16 +107,16 @@ protected String getTextValue(ItemPathType itemPathType) {
}
};

Iterator<ItemPathType> choices = values.getObject().stream()
List<ItemPathType> choices = values.getObject().stream()
.map(disValue -> disValue.getValue())
.collect(Collectors.toList()).iterator();
.collect(Collectors.toList());

AutoCompleteTextPanel panel = new AutoCompleteTextPanel<>(
panelCtx.getComponentId(), panelCtx.getRealValueModel(), panelCtx.getTypeClass(), renderer) {
@Override
public Iterator<ItemPathType> getIterator(String input) {
if (StringUtils.isBlank(input)) {
return choices;
return choices.iterator();
}
return values.getObject().stream()
.filter(v -> v.getLabel().contains(input))
Expand All @@ -127,7 +127,7 @@ public Iterator<ItemPathType> getIterator(String input) {

@Override
protected <C> IConverter<C> getAutoCompleteConverter(Class<C> type, IConverter<C> originConverter) {
return (IConverter<C>) new AutoCompleteDisplayableValueConverter<ItemPathType>(values);
return (IConverter<C>) new AutoCompleteDisplayableValueConverter<>(values);
}
};
panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
Expand All @@ -140,21 +140,30 @@ protected <C> IConverter<C> getAutoCompleteConverter(Class<C> type, IConverter<C

}

private IModel<List<DisplayableValue<ItemPathType>>> getChoices(IModel<? extends PrismValueWrapper<ItemPathType>> propertyWrapper, ResourceSchema schema) {
private IModel<List<DisplayableValue<ItemPathType>>> getChoices(
IModel<? extends PrismValueWrapper<ItemPathType>> propertyWrapper, PageBase pageBase) {
return new LoadableDetachableModel<>() {
@Override
protected List<DisplayableValue<ItemPathType>> load() {
return getAllAttributes(propertyWrapper, schema);
return getAllAttributes(propertyWrapper, pageBase);
}
};
}

private List<DisplayableValue<ItemPathType>> getAllAttributes(
IModel<? extends PrismValueWrapper<ItemPathType>> propertyWrapperModel, ResourceSchema schema) {
IModel<? extends PrismValueWrapper<ItemPathType>> propertyWrapperModel, PageBase pageBase) {

List<DisplayableValue<ItemPathType>> allAttributes = new ArrayList<>();

PrismValueWrapper<ItemPathType> propertyWrapper = propertyWrapperModel.getObject();

ResourceSchema schema = ResourceDetailsModel.getResourceSchema(
propertyWrapper.getParent().findObjectWrapper(), pageBase);

if (schema == null) {
return allAttributes;
}

ResourceObjectTypeDefinitionType objectType = getResourceObjectType(propertyWrapper);
if (objectType != null) {
@Nullable ResourceObjectTypeDefinition objectTypeDef = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,12 @@
import org.springframework.stereotype.Component;

import javax.xml.namespace.QName;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;

@Component
public class SourceOrTargetOfMappingPanelFactory extends VariableBindingDefinitionTypePanelFactory {
public class SourceOrTargetOfMappingPanelFactory extends VariableBindingDefinitionTypePanelFactory implements Serializable {

@Override
public <IW extends ItemWrapper<?, ?>> boolean match(IW wrapper) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -81,13 +81,13 @@ public void setObject(DisplayableValue<T> object) {

Collection<? extends DisplayableValue<T>> suggestedValues = panelCtx.getSuggestedValues();
if (CollectionUtils.isNotEmpty(suggestedValues)) {
Iterator<T> choices = suggestedValues.stream()
ArrayList<T> choices = suggestedValues.stream()
.map(disValue -> disValue.getValue())
.collect(Collectors.toCollection(ArrayList::new)).iterator();
.collect(Collectors.toCollection(ArrayList::new));
return new AutoCompleteTextPanel<>(panelCtx.getComponentId(), panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false) {
@Override
public Iterator<T> getIterator(String input) {
return choices;
return choices.iterator();
}
};
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -189,7 +189,7 @@ protected PrismContainerWrapper<C> createWrapperInternal(PrismContainerValueWrap
return containerWrapper;
}

private ItemStatus recomputeStatus(PrismContainer<C> containerWrapper, ItemStatus defaultStatus, WrapperContext ctx) {
ItemStatus recomputeStatus(PrismContainer<C> containerWrapper, ItemStatus defaultStatus, WrapperContext ctx) {
if (isShadowCredentialsOrPassword(containerWrapper.getDefinition(), ctx)) {
return ItemStatus.NOT_CHANGED;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
* Copyright (c) 2010-2022 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.gui.impl.factory.wrapper;

import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext;
import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext.AttributeMappingType;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper;
import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismContainerWrapperImpl;
import com.evolveum.midpoint.gui.impl.prism.wrapper.ResourceAttributeMappingValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.wrapper.ResourceAttributeMappingWrapper;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.jetbrains.annotations.Nullable;
import org.springframework.stereotype.Component;

/**
* @author lskublik
*/
@Component
public class ResourceAttributeMappingWrapperFactory extends PrismContainerWrapperFactoryImpl<ResourceAttributeDefinitionType> {

@Override
public boolean match(ItemDefinition<?> def) {
return QNameUtil.match(def.getTypeName(), ResourceAttributeDefinitionType.COMPLEX_TYPE);
}

@Override
public int getOrder() {
return 100;
}

@Override
public PrismContainerValueWrapper<ResourceAttributeDefinitionType> createContainerValueWrapper(
PrismContainerWrapper<ResourceAttributeDefinitionType> objectWrapper,
PrismContainerValue<ResourceAttributeDefinitionType> objectValue,
ValueStatus status,
WrapperContext context) {
ResourceAttributeMappingValueWrapper value = new ResourceAttributeMappingValueWrapper(objectWrapper, objectValue, status);
@Nullable ResourceAttributeDefinitionType realValue = objectValue.getRealValue();
if (context.isConfigureMappingType()) {
if (status.equals(ValueStatus.NOT_CHANGED) && realValue != null) {
value.addAttributeMappingType(AttributeMappingType.OVERRIDE);
if (!realValue.getInbound().isEmpty()) {
value.addAttributeMappingType(AttributeMappingType.INBOUND);
}
if (realValue.getOutbound() != null) {
value.addAttributeMappingType(AttributeMappingType.OUTBOUND);
}
} else if (status.equals(ValueStatus.ADDED) && context.getAttributeMappingType() != null) {
value.addAttributeMappingType(context.getAttributeMappingType());
}
}
return value;
}

@Override
protected PrismContainerWrapper<ResourceAttributeDefinitionType> createWrapperInternal(
PrismContainerValueWrapper<?> parent,
PrismContainer<ResourceAttributeDefinitionType> childContainer,
ItemStatus status,
WrapperContext ctx) {

status = recomputeStatus(childContainer, status, ctx);

ResourceAttributeMappingWrapper containerWrapper =
new ResourceAttributeMappingWrapper(parent, childContainer, status);
VirtualContainersSpecificationType virtualContainerSpec = ctx.findVirtualContainerConfiguration(containerWrapper.getPath());
if (virtualContainerSpec != null) {
containerWrapper.setVirtual(true);
containerWrapper.setShowInVirtualContainer(true);
}

return containerWrapper;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ public class PageResource extends PageAssignmentHolderDetails<ResourceType, Reso

private static final String ID_WIZARD_FRAGMENT = "wizardFragment";
private static final String ID_WIZARD = "wizard";
private IModel<List<Breadcrumb>> wizardBreadcrumbs = Model.ofList(new ArrayList<>());
private List<Breadcrumb> wizardBreadcrumbs = new ArrayList<>();

public PageResource(PageParameters pageParameters) {
super(pageParameters);
Expand Down Expand Up @@ -211,7 +211,7 @@ protected void onExitPerformed(AjaxRequestTarget target) {
target.add(fragment);
}

public IModel<List<Breadcrumb>> getWizardBreadcrumbs() {
public List<Breadcrumb> getWizardBreadcrumbs() {
return wizardBreadcrumbs;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,9 @@ protected void collectVirtualContainers(@NotNull Collection<ContainerPanelConfig
};
ctx.setCreateIfEmpty(true);
ctx.setDetailsPageTypeConfiguration(getPanelConfigurations());
if (getModelServiceLocator() instanceof PageResource) {
ctx.setConfigureMappingType(!((PageResource)getModelServiceLocator()).isEditObject());
}
return ctx;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -140,14 +140,6 @@ protected Collection<SelectorOptions<GetOperationOptions>> getOptionsToUse() {
// return getAvailableData().iterator();
// }

@Override
protected @NotNull List<ObjectOrdering> createObjectOrderings(SortParam<String> sortParam) {
List<ObjectOrdering> orderings = new ArrayList<>();
orderings.add(PrismContext.get().queryFactory().createOrdering(ConnectorType.F_DISPLAY_NAME, OrderDirection.ASCENDING));
orderings.addAll(super.createObjectOrderings(sortParam));
return orderings;
}

@Override
protected ObjectQuery getCustomizeContentQuery() {
S_FilterEntryOrEmpty query = PrismContext.get().queryFor(AssignmentHolderType.class);
Expand Down

0 comments on commit 1e0b0c1

Please sign in to comment.