Skip to content

Commit

Permalink
adding new resource wizard step for discovered connector configuration
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Jun 27, 2022
1 parent 9d82328 commit 8f0b732
Show file tree
Hide file tree
Showing 46 changed files with 567 additions and 256 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
*/
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 @@ -14,12 +15,14 @@
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 @@ -63,6 +66,8 @@ public class WrapperContext {
private GuiObjectDetailsPageType detailsPageTypeConfiguration;
private Collection<VirtualContainersSpecificationType> virtualContainers = new ArrayList<>();

private DiscoveredConfiguration connectorConfigurationSuggestions;

public WrapperContext(Task task, OperationResult result) {
this.task = task;
this.result = result != null ? result : new OperationResult("temporary"); // TODO !!!
Expand Down Expand Up @@ -245,6 +250,14 @@ public void setDetailsPageTypeConfiguration(GuiObjectDetailsPageType detailsPage
this.detailsPageTypeConfiguration = detailsPageTypeConfiguration;
}

public DiscoveredConfiguration getConnectorConfigurationSuggestions() {
return connectorConfigurationSuggestions;
}

public void setConnectorConfigurationSuggestions(DiscoveredConfiguration connectorConfigurationSuggestions) {
this.connectorConfigurationSuggestions = connectorConfigurationSuggestions;
}

public WrapperContext clone() {
WrapperContext ctx = new WrapperContext(task,result);
ctx.setAuthzPhase(authzPhase);
Expand All @@ -261,6 +274,7 @@ public WrapperContext clone() {
ctx.setMetadataItemProcessingSpec(metadataItemProcessingSpec);
ctx.lookupTableCache = lookupTableCache;
ctx.setDetailsPageTypeConfiguration(detailsPageTypeConfiguration);
ctx.setConnectorConfigurationSuggestions(connectorConfigurationSuggestions);
return ctx;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,11 @@
import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismPropertyValueWrapper;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;

import java.util.Collection;

/**
* @author katka
*
Expand All @@ -19,5 +22,4 @@ public interface PrismPropertyWrapper<T> extends ItemWrapper<PrismProperty<T>, P

String getPredefinedValuesOid();
void setPredefinedValuesOid(String oid);

}
Original file line number Diff line number Diff line change
Expand Up @@ -3150,6 +3150,16 @@ public static void refreshResourceSchema(@NotNull PrismObject<ResourceType> reso
target.add(pageBase.getFeedbackPanel());
}

public static void partialConfigurationTest(@NotNull PrismObject<ResourceType> resource, PageBase pageBase, Task task, OperationResult result) {
try {
pageBase.getModelService().testResourcePartialConfiguration(resource, task, result);
} catch (ObjectNotFoundException | SchemaException | ConfigurationException e) {
LoggingUtils.logUnexpectedException(LOGGER, "Error partial configuration of resource", e);
result.recordFatalError(pageBase.createStringResource("WebComponentUtil.message.partialConfigurationTest.fatalError").getString(), e);
}
result.computeStatus();
}

public static List<QName> getCategoryRelationChoices(AreaCategoryType category, List<RelationDefinitionType> defList) {
List<QName> relationsList = new ArrayList<>();
defList.sort(new Comparator<RelationDefinitionType>() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@ public Collection<? extends DisplayableValue<T>> getAllowedValues() {
return unwrapWrapperModel().getAllowedValues();
}

public Collection<? extends DisplayableValue<T>> getSuggestedValues() {
return unwrapWrapperModel().getSuggestedValues();
}

public boolean hasValueEnumerationRef() {
return unwrapWrapperModel().getValueEnumerationRef() != null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import javax.annotation.PostConstruct;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
Expand Down Expand Up @@ -76,6 +79,19 @@ public void setObject(DisplayableValue<T> object) {
return WebComponentUtil.createDropDownChoices(panelCtx.getComponentId(), convertModel, choices, true, panelCtx.getPageBase());
}

Collection<? extends DisplayableValue<T>> suggestedValues = panelCtx.getSuggestedValues();
if (CollectionUtils.isNotEmpty(suggestedValues)) {
Iterator<T> choices = suggestedValues.stream()
.map(disValue -> disValue.getValue())
.collect(Collectors.toCollection(ArrayList::new)).iterator();
return new AutoCompleteTextPanel<>(panelCtx.getComponentId(), panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false) {
@Override
public Iterator<T> getIterator(String input) {
return choices;
}
};
}

return new TextPanel<>(panelCtx.getComponentId(),
panelCtx.getRealValueModel(), panelCtx.getTypeClass(), false);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
/*
* 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.gui.impl.factory.wrapper;

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.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismPropertyWrapperImpl;
import com.evolveum.midpoint.prism.*;

import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConnectorConfigurationType;

import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Collection;

/**
* @author lskublik
*/
@Component
public class ConnectorConfigurationPropertyWrapperFactory<T> extends PrismPropertyWrapperFactoryImpl<T> {

@Override
public <C extends Containerable> boolean match(ItemDefinition<?> def, PrismContainerValue<C> parent) {
if (def instanceof PrismPropertyDefinition && parent.getDefinition().getItemName().equivalent(ItemPath.create("configurationProperties"))) {
return true;
}
return false;
}

@PostConstruct
@Override
public void register() {
getRegistry().addToRegistry(this);
}

@Override
public int getOrder() {
return Integer.MAX_VALUE - 1;
}

@Override
protected PrismPropertyWrapper<T> createWrapperInternal(PrismContainerValueWrapper<?> parent, PrismProperty<T> item,
ItemStatus status, WrapperContext wrapperContext) {
if (wrapperContext.getConnectorConfigurationSuggestions() != null) {
wrapperContext.getConnectorConfigurationSuggestions().getDiscoveredProperties().forEach(suggestion -> {
PrismPropertyDefinition<?> suggestionDef = suggestion.getDefinition();
if (suggestionDef.getItemName().equals(item.getDefinition().getItemName())) {
if (suggestionDef.getAllowedValues() != null && !suggestionDef.getAllowedValues().isEmpty()) {
item.getDefinition().toMutable().setAllowedValues((Collection<? extends DisplayableValue<T>>) suggestionDef.getAllowedValues());
}
if (suggestionDef.getSuggestedValues() != null && !suggestionDef.getSuggestedValues().isEmpty()) {
item.getDefinition().toMutable().setSuggestedValues((Collection<? extends DisplayableValue<T>>) suggestionDef.getSuggestedValues());
}
}
});
}
PrismPropertyWrapper<T> propertyWrapper = new PrismPropertyWrapperImpl<>(parent, item, status);
propertyWrapper.setPredefinedValuesOid(getPredefinedValuesOid(item));
return propertyWrapper;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public PrismContainerWrapper<ConnectorConfigurationType> createWrapper(PrismCont
return null;
}

if (childItem == null || childItem.isEmpty()) {
if (childItem == null || childItem.isEmpty() || childItem.getDefinition().getItemName().equals(ResourceType.F_CONNECTOR_CONFIGURATION)) {

PrismReference connectorRef = parent.getNewValue().findReference(ResourceType.F_CONNECTOR_REF);
if (connectorRef != null && connectorRef.getValue() != null && connectorRef.getValue().getRealValue() != null
Expand All @@ -104,7 +104,14 @@ public PrismContainerWrapper<ConnectorConfigurationType> createWrapper(PrismCont
// Fixing (errorneously) set maxOccurs = unbounded. See MID-2317 and related issues.
PrismContainerDefinition<ConnectorConfigurationType> definitionFixed = definition.clone();
definitionFixed.toMutable().setMaxOccurs(1);
childItem = definitionFixed.instantiate();

if (childItem == null) {
childItem = parent.getNewValue().findOrCreateContainer(name);
}

// childItem = definitionFixed.instantiate();
childItem.applyDefinition(definitionFixed, true);
// parent.getNewValue().addReplaceExisting(childItem);
}
} catch (Exception e) {
LOGGER.error("Couldn't get connector from reference " + connectorRef, e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ protected PrismObjectWrapper<O> load() {
WrapperContext ctx = new WrapperContext(task, result);
ctx.setCreateIfEmpty(true);
ctx.setDetailsPageTypeConfiguration(detailsPageConfigurationModel.getObject());
customizationWrapperContext(ctx);
if (isReadonly()) {
ctx.setReadOnly(isReadonly());
}
Expand Down Expand Up @@ -110,6 +111,9 @@ protected O load() {
};
}

protected void customizationWrapperContext(WrapperContext ctx) {
}

private void loadParentOrgs(PrismObject<O> object) {
Task task = getModelServiceLocator().createSimpleTask(OPERATION_LOAD_PARENT_ORG);
OperationResult subResult = task.getResult();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,7 @@
import com.evolveum.midpoint.gui.impl.page.admin.DetailsFragment;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.PageAssignmentHolderDetails;
import com.evolveum.midpoint.gui.impl.page.admin.component.ResourceOperationalButtonsPanel;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.BasicSettingStepPanel;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.ConfigurationStepPanel;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.CreateResourceTemplatePanel;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.DiscoveryStepPanel;
import com.evolveum.midpoint.gui.impl.page.admin.resource.component.*;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.security.api.AuthorizationConstants;
import com.evolveum.midpoint.authentication.api.authorization.AuthorizationAction;
Expand Down Expand Up @@ -126,7 +123,7 @@ public boolean onBackPerformed(AjaxRequestTarget target) {
}
};

ConfigurationStepPanel configuration = new ConfigurationStepPanel(getObjectDetailsModels());
PartialConfigurationStepPanel configuration = new PartialConfigurationStepPanel(getObjectDetailsModels());

DiscoveryStepPanel discover = new DiscoveryStepPanel(getObjectDetailsModels());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.AssignmentHolderDetailsModel;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.schema.PrismSchema;
import com.evolveum.midpoint.provisioning.api.DiscoveredConfiguration;
import com.evolveum.midpoint.schema.processor.ResourceSchema;
import com.evolveum.midpoint.schema.processor.ResourceSchemaFactory;
import com.evolveum.midpoint.schema.result.OperationResult;
Expand All @@ -38,6 +39,7 @@ public class ResourceDetailsModel extends AssignmentHolderDetailsModel<ResourceT
private static final String OPERATION_CREATE_CONFIGURATION_WRAPPERS = DOT_CLASS + "loadConnectorWrapper";

private final LoadableModel<PrismContainerWrapper<ConnectorConfigurationType>> configurationModel;
private DiscoveredConfiguration connectorConfigurationSuggestions;

public ResourceDetailsModel(LoadableDetachableModel<PrismObject<ResourceType>> prismObjectModel, ModelServiceLocator serviceLocator) {
super(prismObjectModel, serviceLocator);
Expand Down Expand Up @@ -135,4 +137,12 @@ protected GuiObjectDetailsPageType loadDetailsPageConfiguration() {
String connectorOid = connector != null ? connector.getOid() : null;
return getModelServiceLocator().getCompiledGuiProfile().findResourceDetailsConfiguration(connectorOid);
}

public void setConnectorConfigurationSuggestions(DiscoveredConfiguration connectorConfigurationSuggestions) {
this.connectorConfigurationSuggestions = connectorConfigurationSuggestions;
}

protected void customizationWrapperContext(WrapperContext ctx) {
ctx.setConnectorConfigurationSuggestions(this.connectorConfigurationSuggestions);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,24 +7,19 @@
package com.evolveum.midpoint.gui.impl.page.admin.resource.component;

import com.evolveum.midpoint.gui.api.component.wizard.BasicWizardPanel;
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemVisibilityHandler;
import com.evolveum.midpoint.gui.api.prism.wrapper.ItemWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.page.admin.resource.ResourceDetailsModel;
import com.evolveum.midpoint.gui.impl.prism.panel.ItemPanelSettings;
import com.evolveum.midpoint.gui.impl.prism.panel.ItemPanelSettingsBuilder;
import com.evolveum.midpoint.gui.impl.prism.panel.verticalForm.VerticalFormPanel;
import com.evolveum.midpoint.gui.impl.prism.panel.verticalForm.VerticalFormPrismPropertyValuePanel;
import com.evolveum.midpoint.web.application.PanelDisplay;
import com.evolveum.midpoint.web.application.PanelInstance;
import com.evolveum.midpoint.web.application.PanelType;
import com.evolveum.midpoint.web.component.prism.ItemVisibility;
import com.evolveum.midpoint.gui.impl.prism.panel.vertical.form.VerticalFormPanel;
import com.evolveum.midpoint.gui.impl.prism.panel.vertical.form.VerticalFormPrismPropertyValuePanel;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.OperationTypeType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;

import org.apache.wicket.MarkupContainer;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.behavior.AttributeAppender;
import org.apache.wicket.markup.html.WebMarkupContainer;
import org.apache.wicket.model.IModel;

/**
Expand All @@ -43,7 +38,7 @@ public AbstractResourceWizardStepPanel(ResourceDetailsModel model) {
@Override
protected void onInitialize() {
super.onInitialize();
iniLayout();
initLayout();
}

public ResourceDetailsModel getResourceModel() {
Expand All @@ -55,9 +50,9 @@ public String appendCssToWizard() {
return "mt-5 mx-auto col-8";
}

private void iniLayout() {
protected void initLayout() {
ItemPanelSettings settings = new ItemPanelSettingsBuilder()
.visibilityHandler(w -> checkVisibility(w))
.visibilityHandler(getVisibilityHandler())
.mandatoryHandler(w -> checkMandatory(w))
.build();
VerticalFormPanel form = new VerticalFormPanel(ID_FORM, this.resourceModel.getObjectWrapperModel(), settings, getContainerConfiguration()) {
Expand All @@ -70,11 +65,17 @@ protected String getIcon() {
protected IModel<?> getTitleModel() {
return getTitle();
}


};
form.add(AttributeAppender.append("class", "col-8"));
add(form);
}

protected ItemVisibilityHandler getVisibilityHandler() {
return null;
}

protected abstract String getIcon();

private ContainerPanelConfigurationType getContainerConfiguration() {
Expand All @@ -87,18 +88,18 @@ protected boolean checkMandatory(ItemWrapper itemWrapper) {
return itemWrapper.isMandatory();
}

protected ItemVisibility checkVisibility(ItemWrapper itemWrapper) {
return ItemVisibility.AUTO;
}

@Override
protected void updateFeedbackPanels(AjaxRequestTarget target) {
getVerticalForm().visitChildren(VerticalFormPrismPropertyValuePanel.class, (component, objectIVisit) -> {
((VerticalFormPrismPropertyValuePanel) component).updateFeedbackPanel(target);
});
}

private MarkupContainer getVerticalForm() {
return (MarkupContainer) get(ID_FORM);
private VerticalFormPanel getVerticalForm() {
return (VerticalFormPanel) get(ID_FORM);
}

protected WebMarkupContainer getFeedback() {
return getVerticalForm().getFeedbackPanel();
}
}

0 comments on commit 8f0b732

Please sign in to comment.