Skip to content

Commit

Permalink
AssignmentPanel - Use modified targetRef for concrete panels
Browse files Browse the repository at this point in the history
Some panels are concretized by targetRef/targetType. In this panels
we can safely assume that targetRef is of static type, which allows
us to create temporary schema overlay with narrowed definition of targetRef.

This narrowed definition is used in collumns models and in search panel
to allow using concrete extension items of Role, Org or Service to serve as
columns and/or basic search fields.

This change also provides nice feature for Axiom Query language, that
user in this specific panels does not need to specify type when dereferencing.
  • Loading branch information
tonydamage committed Sep 28, 2022
1 parent 0df636c commit 362eb63
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 18 deletions.
2 changes: 1 addition & 1 deletion gui/admin-gui/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -266,7 +266,7 @@
<groupId>com.evolveum.midpoint.model</groupId>
<artifactId>model-impl</artifactId>
<version>${project.version}</version>
<scope>runtime</scope>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.evolveum.midpoint.model</groupId>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -548,11 +548,14 @@ private boolean nothingToTransform(GuiObjectColumnType customColumn) {
return customColumn.getPath() == null && (customColumn.getExport() == null || customColumn.getExport().getExpression() == null);
}

protected PrismContainerDefinition<C> getContainerDefinitionForColumns() {
return getPageBase().getPrismContext().getSchemaRegistry()
.findContainerDefinitionByCompileTimeClass(getType());
}

private boolean noItemDefinitionFor(ItemPath columnPath, GuiObjectColumnType customColumn) {
if (columnPath != null) {
ItemDefinition itemDefinition = getPageBase().getPrismContext().getSchemaRegistry()
.findContainerDefinitionByCompileTimeClass(getType())
.findItemDefinition(columnPath);
ItemDefinition itemDefinition = getContainerDefinitionForColumns().findItemDefinition(columnPath);
if (itemDefinition == null) { // TODO check && expression == null) {
LOGGER.warn("Unknown path '{}' in a definition of column '{}'", columnPath, customColumn.getName());
return true;
Expand Down Expand Up @@ -1187,6 +1190,7 @@ public void clearCache() {
WebComponentUtil.clearProviderCache(getDataProvider());
}

@Override
public StringResourceModel createStringResource(String resourceKey, Object... objects) {
return PageBase.createStringResourceStatic(resourceKey, objects);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ public enum PanelType {
private String fullText;

private SearchConfigurationWrapper searchConfigurationWrapper;
private PrismContainerDefinition<C> containerDefinitionOverride;

public Search(SearchConfigurationWrapper searchConfigurationWrapper) {
this.searchConfigurationWrapper = searchConfigurationWrapper;
Expand Down Expand Up @@ -125,11 +126,10 @@ private ObjectFilter createAdvancedObjectFilter(PrismContext ctx) throws SchemaE
return null;
}
var parser = ctx.createQueryParser(ctx.getSchemaRegistry().staticNamespaceContext().allPrefixes());
PrismContainerDefinition<?> containerDef = null; // FIXME: Find way to provide PCD.
if (containerDef == null) {
if (containerDefinitionOverride == null) {
return parser.parseFilter(getTypeClass(), dslQuery);
}
return parser.parseFilter(containerDef, dslQuery);
return parser.parseFilter(containerDefinitionOverride, dslQuery);
}

return null;
Expand Down Expand Up @@ -475,5 +475,9 @@ public String toString() {
'}';
}

public void setContainerDefinition(PrismContainerDefinition<C> typeDefinitionForSearch) {
containerDefinitionOverride = typeDefinitionForSearch;
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -1103,21 +1103,23 @@ public static <C extends Containerable> List<AbstractSearchItemWrapper> createSe

public static <C extends Containerable> List<AbstractSearchItemWrapper> createSearchableExtensionWrapperList(
PrismContainerDefinition<C> objectDef, ModelServiceLocator modelServiceLocator, ItemPath extensionPath) {

List<AbstractSearchItemWrapper> searchItemWrappers = new ArrayList<>();
PrismContainerDefinition ext = objectDef.findContainerDefinition(ObjectType.F_EXTENSION);
PrismContainerDefinition ext = objectDef.findContainerDefinition(extensionPath);
if (ext == null) {
return searchItemWrappers;
}
if (ext != null && ext.getDefinitions() != null) {
List<ItemDefinition<?>> defs = ((List<ItemDefinition<?>>) ext.getDefinitions()).stream()
.filter(def -> (def instanceof PrismReferenceDefinition || def instanceof PrismPropertyDefinition)
&& isIndexed(def)).collect(Collectors.toList());
List<SearchItemType> searchItems = new ArrayList<>();
defs.forEach(def -> searchItems.add(new SearchItemType()
.path(new ItemPathType(ItemPath.create(extensionPath, def.getItemName())))
.displayName(WebComponentUtil.getItemDefinitionDisplayNameOrName(def, null))));
searchItems.forEach(searchItem -> searchItemWrappers.add(createPropertySearchItemWrapper(objectDef.getCompileTimeClass(),
searchItem, null, null, modelServiceLocator)));
for(ItemDefinition<?> def : defs) {
var searchItem = new SearchItemType()
.path(new ItemPathType(ItemPath.create(extensionPath, def.getItemName())))
.displayName(WebComponentUtil.getItemDefinitionDisplayNameOrName(def, null));
searchItemWrappers.add(createPropertySearchItemWrapper(objectDef.getCompileTimeClass(),
searchItem, def, null, modelServiceLocator));
}
}
return searchItemWrappers;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

import com.evolveum.midpoint.gui.impl.component.data.column.PrismContainerWrapperColumn;
import com.evolveum.midpoint.gui.impl.component.search.AbstractSearchItemWrapper;

import com.evolveum.midpoint.gui.impl.component.search.Search;
import com.evolveum.midpoint.web.component.data.column.ColumnUtils;

import org.apache.commons.collections4.CollectionUtils;
Expand Down Expand Up @@ -41,8 +41,11 @@
import com.evolveum.midpoint.gui.impl.component.MultivalueContainerListPanelWithDetailsPanel;
import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismReferenceValueWrapperImpl;
import com.evolveum.midpoint.model.impl.schema.transform.TransformableContainerDefinition;
import com.evolveum.midpoint.model.impl.schema.transform.TransformableReferenceDefinition;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.prism.query.RefFilter;
Expand Down Expand Up @@ -82,12 +85,13 @@ public abstract class AbstractAssignmentTypePanel extends MultivalueContainerLis
protected static final String OPERATION_LOAD_ASSIGNMENTS_LIMIT = DOT_CLASS + "loadAssignmentsLimit";
protected static final String OPERATION_LOAD_ASSIGNMENTS_TARGET_OBJ = DOT_CLASS + "loadAssignmentsTargetRefObject";
protected static final String OPERATION_LOAD_ASSIGNMENT_TARGET_RELATIONS = DOT_CLASS + "loadAssignmentTargetRelations";

private IModel<PrismContainerWrapper<AssignmentType>> model;
protected int assignmentsRequestsLimit = -1;

private Class<? extends Objectable> objectType;
private String objectOid;
private PrismContainerDefinition<AssignmentType> searchDefinition;


public AbstractAssignmentTypePanel(String id, IModel<PrismContainerWrapper<AssignmentType>> model, ContainerPanelConfigurationType config, Class<? extends Objectable> type, String oid) {
super(id, AssignmentType.class, config);
Expand Down Expand Up @@ -584,6 +588,13 @@ protected boolean isEntitlementAssignment() {
@Override
protected abstract UserProfileStorage.TableId getTableId();

@Override
protected Search createSearch(Class<AssignmentType> type) {
Search search = super.createSearch(type);
search.setContainerDefinition(getTypeDefinitionForSearch());
return search;
}

@Override
protected List<SearchItemDefinition> initSearchableItems(PrismContainerDefinition<AssignmentType> containerDef) {
return createSearchableItems(containerDef);
Expand Down Expand Up @@ -619,10 +630,47 @@ protected List<? super AbstractSearchItemWrapper> createSearchableItemWrappers(P

defs.addAll(SearchFactory.createSearchableExtensionWrapperList(containerDef, getPageBase()));

if (getAssignmentType() != null) {
var targetExtensionPath = ItemPath.create(AssignmentType.F_TARGET_REF, new ObjectReferencePathSegment(getAssignmentType()), ObjectType.F_EXTENSION);
var objectExt = SearchFactory.createSearchableExtensionWrapperList(containerDef, getPageBase(), targetExtensionPath);
LOGGER.info("Adding extension properties from targetRef/@: {}", objectExt);
defs.addAll(objectExt);
}
return defs;

}


@Override
protected PrismContainerDefinition<AssignmentType> getTypeDefinitionForSearch() {
if (searchDefinition != null) {
return searchDefinition;
}
PrismContainerDefinition<AssignmentType> orig = super.getTypeDefinitionForSearch();
if (getAssignmentType() == null) {
searchDefinition = orig;
} else {
// We have more concrete assignment type, we should replace targetRef definition
// with one with concrete assignment type.
var transformed = TransformableContainerDefinition.of(orig);
var targetRef = TransformableReferenceDefinition.of(orig.getComplexTypeDefinition().findReferenceDefinition(AssignmentType.F_TARGET_REF));
targetRef.setTargetTypeName(getAssignmentType());
transformed.getComplexTypeDefinition().replaceDefinition(AssignmentType.F_TARGET_REF, targetRef);
searchDefinition = transformed;
}

return searchDefinition;
}


@Override
protected PrismContainerDefinition<AssignmentType> getContainerDefinitionForColumns() {
// In columns model we can benefit for same targetType expansion as in container model.
return getTypeDefinitionForSearch();
}



@Deprecated
protected abstract void addSpecificSearchableItems(PrismContainerDefinition<AssignmentType> containerDef, List<SearchItemDefinition> defs);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ public <ID extends ItemDefinition<?>> ID findItemDefinition(@NotNull ItemPath pa
if (rest.isEmpty()) {
return clazz.cast(firstChild);
}
return firstChild.findItemDefinition(path, clazz);
return (ID) firstChild.findItemDefinition(path, clazz);

}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ protected TransformableReferenceDefinition(PrismReferenceDefinition delegate) {
}

@Override
public <T extends ItemDefinition> T findItemDefinition(@NotNull ItemPath path, @NotNull Class<T> clazz) {
public <T extends ItemDefinition<?>> T findItemDefinition(@NotNull ItemPath path, @NotNull Class<T> clazz) {
if (!path.startsWithObjectReference()) {
return super.findItemDefinition(path, clazz);
} else {
Expand Down

0 comments on commit 362eb63

Please sign in to comment.