Skip to content

Commit

Permalink
MID-7758 NPE when prismcontainerwrapper can't get child container wra…
Browse files Browse the repository at this point in the history
…pper model on assignments panel
  • Loading branch information
1azyman committed Mar 23, 2022
1 parent 3caf1a7 commit 687a48a
Show file tree
Hide file tree
Showing 6 changed files with 117 additions and 123 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,10 @@ public AbstractAssignmentTypePanel(String id, IModel<PrismContainerWrapper<Assig
this.model = model;
}

protected void setModel(IModel<PrismContainerWrapper<AssignmentType>> model) {
this.model = model;
}

@Override
protected void onInitialize() {
super.onInitialize();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,29 +8,9 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.AbstractAssignmentTypePanel;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.util.logging.Trace;

import com.evolveum.midpoint.util.logging.TraceManager;

import com.evolveum.midpoint.web.component.search.SearchFactory;
import com.evolveum.midpoint.web.component.search.SearchItemDefinition;
import com.evolveum.midpoint.web.session.SessionStorage;

import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;
Expand All @@ -40,21 +20,37 @@
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.AbstractAssignmentTypePanel;
import com.evolveum.midpoint.model.api.AssignmentCandidatesSpecification;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.util.exception.ConfigurationException;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.search.SearchFactory;
import com.evolveum.midpoint.web.component.search.SearchItemDefinition;
import com.evolveum.midpoint.web.model.PrismContainerWrapperModel;
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

public abstract class AbstractAssignmentPanel<AH extends AssignmentHolderType> extends AbstractAssignmentTypePanel {

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

public AbstractAssignmentPanel(String id, IModel<PrismObjectWrapper<AH>> model, ContainerPanelConfigurationType config) {
super(id, PrismContainerWrapperModel.fromContainerWrapper(model, AssignmentHolderType.F_ASSIGNMENT), config);
super(id, null, config);

setModel(PrismContainerWrapperModel.fromContainerWrapper(model, AssignmentHolderType.F_ASSIGNMENT, () -> getPageBase()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,36 +6,36 @@
*/
package com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.inducement;

import java.util.ArrayList;
import java.util.List;
import javax.xml.namespace.QName;

import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.api.component.AssignmentPopupDto;
import com.evolveum.midpoint.gui.api.model.LoadableModel;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismObjectWrapper;
import com.evolveum.midpoint.gui.impl.page.admin.assignmentholder.component.assignmentType.AbstractAssignmentTypePanel;
import com.evolveum.midpoint.model.api.AssignmentObjectRelation;
import com.evolveum.midpoint.prism.PrismConstants;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.RefFilter;
import com.evolveum.midpoint.web.component.search.SearchItemDefinition;
import com.evolveum.midpoint.web.model.PrismContainerWrapperModel;
import com.evolveum.midpoint.web.session.SessionStorage;
import com.evolveum.midpoint.web.session.UserProfileStorage;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;

import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.IModel;
import org.jetbrains.annotations.NotNull;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ContainerPanelConfigurationType;

public class AbstractInducementPanel<AR extends AbstractRoleType> extends AbstractAssignmentTypePanel {

public AbstractInducementPanel(String id, IModel<PrismObjectWrapper<AR>> model, ContainerPanelConfigurationType config) {
super(id, PrismContainerWrapperModel.fromContainerWrapper(model, AbstractRoleType.F_INDUCEMENT), config);
super(id, null, config);

setModel(PrismContainerWrapperModel.fromContainerWrapper(model, AbstractRoleType.F_INDUCEMENT, () -> getPageBase()));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
import java.util.Arrays;
import java.util.List;

import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.web.model.PrismContainerWrapperModel;

import com.evolveum.midpoint.xml.ns._public.common.common_3.SystemConfigurationType;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.extensions.markup.html.repeater.data.table.IColumn;
import org.apache.wicket.model.IModel;
Expand Down Expand Up @@ -38,7 +43,8 @@ public GeneralTransportContentPanel(String id, AssignmentHolderDetailsModel mode

super(id, clazz, configurationType);

this.model = new MessageTransportContainerModel<>(this, model.getObjectWrapperModel(), messageTransportItem);
this.model = PrismContainerWrapperModel.fromContainerWrapper(model.getObjectWrapperModel(),
ItemPath.create(SystemConfigurationType.F_MESSAGE_TRANSPORT_CONFIGURATION, messageTransportItem), () -> getPageBase());
}

@Override
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,31 @@
*/
package com.evolveum.midpoint.web.model;

import java.util.function.Supplier;

import org.apache.wicket.model.IModel;

import com.evolveum.midpoint.gui.api.factory.wrapper.PrismContainerWrapperFactory;
import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismContainerWrapper;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.path.ItemName;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.util.exception.SystemException;

/**
* @author katka
*/
public class PrismContainerWrapperModel<C extends Containerable, T extends Containerable>
extends ItemWrapperModel<C, PrismContainerWrapper<T>> {

private Supplier<PageBase> page;

private static final long serialVersionUID = 1L;

private String identifier;
Expand All @@ -28,6 +39,11 @@ public class PrismContainerWrapperModel<C extends Containerable, T extends Conta
super(parent, path, fromContainerValue);
}

PrismContainerWrapperModel(IModel<?> parent, ItemPath path, boolean fromContainerValue, Supplier<PageBase> page) {
super(parent, path, fromContainerValue);
this.page = page;
}

PrismContainerWrapperModel(IModel<?> parent, String identifier) {
super(parent, null, false);
this.identifier = identifier;
Expand All @@ -37,6 +53,10 @@ public static <C extends Containerable, T extends Containerable> PrismContainerW
return new PrismContainerWrapperModel<>(parent, path, false);
}

public static <C extends Containerable, T extends Containerable> PrismContainerWrapperModel<C, T> fromContainerWrapper(IModel<? extends PrismContainerWrapper<C>> parent, ItemPath path, Supplier<PageBase> page) {
return new PrismContainerWrapperModel<>(parent, path, false, page);
}

public static <C extends Containerable, T extends Containerable> PrismContainerWrapperModel<C, T> fromContainerWrapper(IModel<? extends PrismContainerWrapper<C>> parent, String containerIdentfier) {
return new PrismContainerWrapperModel<>(parent, containerIdentfier);
}
Expand All @@ -45,6 +65,10 @@ public static <C extends Containerable, T extends Containerable> PrismContainerW
return new PrismContainerWrapperModel<>(parent, ItemPath.create(path), false);
}

public static <C extends Containerable, T extends Containerable> PrismContainerWrapperModel<C, T> fromContainerWrapper(IModel<? extends PrismContainerWrapper<C>> parent, ItemName path, Supplier<PageBase> page) {
return new PrismContainerWrapperModel<>(parent, ItemPath.create(path), false, page);
}

public static <C extends Containerable, T extends Containerable> PrismContainerWrapperModel<C, T> fromContainerValueWrapper(IModel<PrismContainerValueWrapper<C>> parent, ItemPath path) {
return new PrismContainerWrapperModel<>(parent, path, true);
}
Expand All @@ -63,6 +87,57 @@ public PrismContainerWrapper<T> getObject() {
PrismContainerWrapper<?> parentObject = (PrismContainerWrapper) getParent().getObject();
return parentObject.findContainer(identifier);
}

PrismContainerWrapper<T> result = getItemWrapper(PrismContainerWrapper.class);
if (result != null) {
return result;
}

// if page object is available we'll try to find and create wrapper based on path and underlying PrismContainerWrapper
PageBase page = this.page != null ? this.page.get() : null;
if (page == null) {
return null;
}

ItemPath path = this.path;
if (path == null || path.isEmpty()) {
return null;
}

PrismContainerWrapper<?> parent = (PrismContainerWrapper) getParent().getObject();
if (parent == null) {
return null;
}

ItemPath item = null;
while (!path.isEmpty()) {
try {
item = path.firstAsPath();
path = path.rest();

PrismContainerWrapper containerWrapper = parent.findContainer(item);
if (containerWrapper != null) {
parent = containerWrapper;
} else {
PrismContainerValueWrapper value = parent.getValue();
PrismContainerDefinition def = parent.findContainerDefinition(item);

PrismContainerWrapperFactory factory = page.getRegistry().findContainerWrapperFactory(def);

Task task = page.createSimpleTask("Create child containers");
WrapperContext ctx = new WrapperContext(task, task.getResult());
ctx.setCreateIfEmpty(true);

PrismContainerWrapper child = (PrismContainerWrapper) factory.createWrapper(value, def, ctx);
value.addItem(child);

parent = child;
}
} catch (SchemaException ex) {
throw new SystemException("Couldn't create container item for " + this.path + "(exact item: " + item + ")", ex);
}
}

return getItemWrapper(PrismContainerWrapper.class);
}
}

0 comments on commit 687a48a

Please sign in to comment.