Skip to content

Commit

Permalink
adding support of resource object type correlation for resource wizard
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Sep 29, 2022
1 parent 8151179 commit 4ad4ea9
Show file tree
Hide file tree
Showing 30 changed files with 1,455 additions and 95 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -142,13 +142,18 @@ public void onClick(AjaxRequestTarget target) {
}
};
exit.showTitleAsLabel(true);
exit.add(new VisibleBehaviour(() -> isExitButtonVisible()));
exit.add(AttributeAppender.append("class", "btn btn-outline-primary"));
buttons.add(exit);

addCustomButtons(buttons);
buttonsContainer.add(buttons);
}

protected boolean isExitButtonVisible() {
return true;
}

protected WebMarkupContainer getButtonsContainer() {
return (WebMarkupContainer) get(ID_BUTTONS_CONTAINER);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,12 @@ public WizardChoicePanel(String id, ResourceDetailsModel resourceModel, Class<T>
@Override
protected void onInitialize() {
super.onInitialize();
initModels();
tiles = initTilesModel();
initLayout();
}

private void initModels() {
tiles = new LoadableModel<>(false) {
protected LoadableModel<List<Tile<T>>> initTilesModel() {
return new LoadableModel<>(false) {

@Override
protected List<Tile<T>> load() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,18 @@
* 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.page.admin.resource.component.wizard.objectType.synchronization;
package com.evolveum.midpoint.gui.impl.component.input;

import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext;
import com.evolveum.midpoint.gui.api.prism.ItemStatus;
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper;
import com.evolveum.midpoint.gui.impl.component.input.AutoCompleteDisplayableValueConverter;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.wizard.AbstractValueFormResourceWizardStepPanel;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismValueWrapper;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.DisplayableValue;
Expand All @@ -28,28 +26,31 @@
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnChangeAjaxFormUpdatingBehavior;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractSynchronizationActionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SynchronizationActionsType;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author lskublik
*/
public class SynchronizationActionDropDownPanel extends BasePanel<PrismContainerWrapper<SynchronizationActionsType>> {
public class ContainersDropDownPanel<C extends Containerable> extends BasePanel<PrismContainerWrapper<C>> {

private static final Trace LOGGER = TraceManager.getTrace(SynchronizationActionDropDownPanel.class);
private static final Trace LOGGER = TraceManager.getTrace(ContainersDropDownPanel.class);

private final static String ID_PANEL = "panel";

public SynchronizationActionDropDownPanel(String id, IModel<PrismContainerWrapper<SynchronizationActionsType>> model) {
private IModel<ItemName> dropDownModel;

public ContainersDropDownPanel(String id, IModel<PrismContainerWrapper<C>> model) {
super(id, model);
initDropDownModel();
}

@Override
Expand All @@ -58,19 +59,20 @@ protected void onInitialize() {
initLayout();
}

private void initLayout() {

IModel<ItemName> dropDownModel = new IModel<>() {
private void initDropDownModel() {
this.dropDownModel = new IModel<>() {
@Override
public ItemName getObject() {
PrismContainerWrapper<SynchronizationActionsType> actions = getModelObject();
PrismContainerWrapper<C> parentItem = getModelObject();
try {
List<? extends ItemWrapper<?, ?>> items = actions.getValue().getItems();
if (items.size() == 1) {
for (ItemWrapper<?, ?> item : items) {
if (AbstractSynchronizationActionType.class.isAssignableFrom(item.getTypeClass())
&& !ValueStatus.DELETED.equals(item.getValues().iterator().next().getStatus())) {
return item.getItemName();
List<PrismContainerWrapper<? extends Containerable>> containers = parentItem.getValue().getContainers()
.stream()
.filter(container -> !ValueStatus.DELETED.equals(container.getValues().iterator().next().getStatus()))
.collect(Collectors.toList());
if (containers.size() == 1) {
for (ItemWrapper<?, ?> container : containers) {
if (validateChildContainer(container.getItem().getDefinition())) {
return container.getItemName();
}
}
}
Expand All @@ -82,31 +84,34 @@ public ItemName getObject() {

@Override
public void setObject(ItemName object) {
PrismContainerWrapper<SynchronizationActionsType> actions = getModelObject();
PrismContainerWrapper<C> parentItem = getModelObject();
try {
List<ItemWrapper> itemsForRemoving = new ArrayList<>();
boolean found = false;
for (ItemWrapper<?, ?> item : actions.getValue().getItems()) {
if (!AbstractSynchronizationActionType.class.isAssignableFrom(item.getTypeClass())
for (ItemWrapper<?, ?> item : parentItem.getValue().getContainers()) {
if (!validateChildContainer(item.getItem().getDefinition())
|| item.getValues().size() != 1) {
continue;
}
boolean match = item.getItemName().equivalent(object);
switch (item.getValues().iterator().next().getStatus()) {
case DELETED:
if (match) {
found = true;
item.getValues().iterator().next().setStatus(ValueStatus.NOT_CHANGED);
}
continue;
case ADDED:
if (match) {
found = true;
continue;
}
itemsForRemoving.add(item);
actions.getValue().getNewValue().remove(item.getItem());
parentItem.getValue().getNewValue().remove(item.getItem());
break;
case NOT_CHANGED:
if (match) {
found = true;
continue;
}
item.getValues().iterator().next().setStatus(ValueStatus.DELETED);
Expand All @@ -116,62 +121,96 @@ public void setObject(ItemName object) {
found = true;
}
}
actions.getValue().getItems().removeAll(itemsForRemoving);
actions.getValue().getContainers().removeAll(itemsForRemoving);
parentItem.getValue().getItems().removeAll(itemsForRemoving);
parentItem.getValue().getContainers().removeAll(itemsForRemoving);

if (object == null) {
return;
}

if (!found) {
PrismContainer<Containerable> action = actions.getValue().getNewValue().findOrCreateContainer(object);
PrismContainer<Containerable> container = parentItem.getValue().getNewValue().findOrCreateContainer(object);
Task task = getPageBase().createSimpleTask("create_action_container");
WrapperContext ctx = new WrapperContext(task, task.getResult());
ctx.setCreateIfEmpty(true);
action.createNewValue();
ItemWrapper iw = getPageBase().createItemWrapper(action, actions.getValue(), ItemStatus.ADDED, ctx);
actions.getValue().addItem(iw);
ItemWrapper iw = getPageBase().createItemWrapper(container, parentItem.getValue(), ItemStatus.ADDED, ctx);
if (iw.isMultiValue()) {
PrismValueWrapper value = getPageBase().createValueWrapper(iw, container.createNewValue(), ValueStatus.ADDED, ctx);
iw.getValues().add(value);
}
parentItem.getValue().addItem(iw);
}
} catch (SchemaException e) {
LOGGER.error("Couldn't get value of synchronization actions", e);
}
}
};
}

public IModel<ItemName> getDropDownModel() {
return dropDownModel;
}

private void initLayout() {

IModel<? extends List<DisplayableValue<ItemName>>> choicesModel = getChoices();

DropDownChoicePanel panel = new DropDownChoicePanel(
ID_PANEL,
dropDownModel,
getDropDownModel(),
choicesModel,
new DisplayableValueChoiceRenderer(choicesModel.getObject()),
true) {
@Override
protected IConverter<?> createConverter(Class<?> type) {
return new AutoCompleteDisplayableValueConverter<>(choicesModel);
}

@Override
protected String getNullValidDisplayValue() {
return ContainersDropDownPanel.this.getNullValidDisplayValue();
}
};
panel.setOutputMarkupId(true);
panel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
panel.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change"){
@Override
protected void onUpdate(AjaxRequestTarget target) {
ContainersDropDownPanel.this.onUpdate(target);
}
});
add(panel);
}

protected void onUpdate(AjaxRequestTarget target) {
}

protected String getNullValidDisplayValue() {
return getString("DropDownChoicePanel.notDefined");
}

protected boolean validateChildContainer(ItemDefinition definition) {
return true;
}

private IModel<? extends List<DisplayableValue<ItemName>>> getChoices() {
return () -> {
List<DisplayableValue<ItemName>> containers = new ArrayList<>();
PrismContainerWrapper<SynchronizationActionsType> actions = getModelObject();
actions.getDefinitions().forEach(def -> containers.add(new ActionDisplayableValue(def)));
PrismContainerWrapper<C> parentItem = getModelObject();
parentItem.getDefinitions().stream()
.filter(def -> ((def instanceof PrismContainerDefinition) && validateChildContainer(def)))
.forEach(def -> containers.add(new ContainerDisplayableValue(def)));
return containers;
};
}

private class ActionDisplayableValue implements DisplayableValue<ItemName>, Serializable {
private class ContainerDisplayableValue implements DisplayableValue<ItemName>, Serializable {

private final String displayName;
private final String help;
private final ItemName value;

private ActionDisplayableValue(ItemDefinition itemDefinition) {
private ContainerDisplayableValue(ItemDefinition itemDefinition) {
this.displayName = itemDefinition.getDisplayName() == null ?
itemDefinition.getItemName().getLocalPart() : itemDefinition.getDisplayName();
this.help = itemDefinition.getHelp();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,12 +66,7 @@ public Collection<VariableBindingDefinitionType> toChoices(Collection<String> va
.collect(Collectors.toList());
}

public List<String> collectAvailableDefinitions(String input) {

PrismPropertyWrapper<VariableBindingDefinitionType> wrapper = rowModel.getObject();

ResourceObjectTypeDefinitionType resourceObjectType = getResourceObjectType(wrapper);

public List<String> collectAvailableDefinitions(String input, ResourceObjectTypeDefinitionType resourceObjectType) {
ComplexTypeDefinition resourceDef =
PrismContext.get().getSchemaRegistry().findComplexTypeDefinitionByType(ResourceType.COMPLEX_TYPE);

Expand Down Expand Up @@ -114,6 +109,14 @@ public List<String> collectAvailableDefinitions(String input) {
return toSelect;
}

public List<String> collectAvailableDefinitions(String input) {
PrismPropertyWrapper<VariableBindingDefinitionType> wrapper = rowModel.getObject();

ResourceObjectTypeDefinitionType resourceObjectType = getResourceObjectType(wrapper);

return collectAvailableDefinitions(input, resourceObjectType);
}

private static void collectItems(
Collection<? extends ItemDefinition> definitions,
String input,
Expand Down Expand Up @@ -143,7 +146,7 @@ private static void collectItems(
}
}

private static ResourceObjectTypeDefinitionType getResourceObjectType(PrismPropertyWrapper<VariableBindingDefinitionType> propertyWrapper) {
private ResourceObjectTypeDefinitionType getResourceObjectType(PrismPropertyWrapper<VariableBindingDefinitionType> propertyWrapper) {

if (propertyWrapper != null
&& propertyWrapper.getParent() != null
Expand Down

0 comments on commit 4ad4ea9

Please sign in to comment.