Skip to content

Commit

Permalink
implementation of default tenant search item for tenantRef (MID-6777)
Browse files Browse the repository at this point in the history
  • Loading branch information
skublik committed Jan 15, 2021
1 parent f1711d5 commit f7a4d8d
Show file tree
Hide file tree
Showing 11 changed files with 163 additions and 12 deletions.
Expand Up @@ -6,9 +6,8 @@
*/
package com.evolveum.midpoint.gui.api.component;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.*;
import java.util.function.Function;

import javax.xml.namespace.QName;

Expand All @@ -19,6 +18,8 @@
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.constants.ObjectTypes;
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchItem;
import com.evolveum.midpoint.web.component.util.VisibleBehaviour;

import org.apache.wicket.Component;
Expand Down Expand Up @@ -209,11 +210,24 @@ protected ObjectQuery getCustomizeContentQuery() {
protected List<O> getPreselectedObjectList(){
return selectedObjectsList;
}

@Override
protected Search createSearch(Class<? extends O> type) {
Search search = super.createSearch(type);
getSpecialSearchItemFunctions().forEach(function -> {
search.addSpecialItem(function.apply(search));
});
return search;
}
};
listPanel.setOutputMarkupId(true);
return listPanel;
}

protected Set<Function<Search, SearchItem>> getSpecialSearchItemFunctions() {
return Collections.emptySet();
}

protected void addPerformed(AjaxRequestTarget target, QName type, List<O> selected) {
parentPage.hideMainPopup(target);
}
Expand Down
Expand Up @@ -7,17 +7,21 @@
package com.evolveum.midpoint.gui.api.prism.wrapper;

import java.util.List;
import java.util.Set;
import java.util.function.Function;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismReferenceValueWrapperImpl;
import com.evolveum.midpoint.prism.PrismReference;
import com.evolveum.midpoint.prism.PrismReferenceDefinition;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchItem;
import com.evolveum.midpoint.web.component.search.SpecialSearchItem;

/**
* @author katka
*
*/
public interface PrismReferenceWrapper<R extends Referencable> extends ItemWrapper<PrismReference, PrismReferenceValueWrapperImpl<R>>, PrismReferenceDefinition {

Expand All @@ -26,6 +30,6 @@ public interface PrismReferenceWrapper<R extends Referencable> extends ItemWrapp

List<QName> getTargetTypes();



Set<Function<Search, SearchItem>> getSpecialSearchItemFunctions();
void setSpecialSearchItemFunctions(Set<Function<Search, SearchItem>> specialItems);
}
Expand Up @@ -6,18 +6,21 @@
*/
package com.evolveum.midpoint.gui.impl.factory.panel;

import com.evolveum.midpoint.prism.*;
import java.util.Set;
import java.util.function.Function;

import org.apache.wicket.model.IModel;

import com.evolveum.midpoint.gui.api.prism.wrapper.PrismReferenceWrapper;
import com.evolveum.midpoint.prism.Referencable;
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchItem;

/**
* @author katka
*
*/
public class PrismReferencePanelContext<R extends Referencable> extends ItemPanelContext<R, PrismReferenceWrapper<R>>{
public class PrismReferencePanelContext<R extends Referencable> extends ItemPanelContext<R, PrismReferenceWrapper<R>> {

public PrismReferencePanelContext(IModel<PrismReferenceWrapper<R>> itemWrapper) {
super(itemWrapper);
Expand All @@ -27,4 +30,8 @@ public ObjectFilter getFilter() {
return unwrapWrapperModel().getFilter();
}

public Set<Function<Search, SearchItem>> getSpecialSearchItems() {
return unwrapWrapperModel().getSpecialSearchItemFunctions();
}

}
Expand Up @@ -17,6 +17,7 @@
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
Expand All @@ -33,6 +34,7 @@
*
*/
@Component
@Primary
public class PrismReferenceWrapperFactory<R extends Referencable> extends ItemWrapperFactoryImpl<PrismReferenceWrapper<R>, PrismReferenceValue, PrismReference, PrismReferenceValueWrapperImpl<R>>{

private static final Trace LOGGER = TraceManager.getTrace(PrismReferenceWrapperFactory.class);
Expand Down
@@ -0,0 +1,73 @@
/*
* Copyright (c) 2010-2019 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.PrismReferenceWrapper;
import com.evolveum.midpoint.prism.*;

import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.web.component.search.*;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AssignmentType;

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

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

import org.springframework.stereotype.Component;

import java.io.Serializable;
import java.util.Collections;
import java.util.function.Function;

/**
* @author skublik
*/

@Component
public class TenantRefWrapperFactory extends PrismReferenceWrapperFactory<ObjectReferenceType> implements Serializable{

private static final long serialVersionUID = 1L;

@Override
public <C extends Containerable> boolean match(ItemDefinition<?> def, PrismContainerValue<C> parent) {
return match(def) && QNameUtil.match(AssignmentType.F_TENANT_REF, def.getItemName());
}

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

@Override
protected PrismReferenceWrapper<ObjectReferenceType> createWrapperInternal(PrismContainerValueWrapper<?> parent, PrismReference item, ItemStatus status, WrapperContext ctx) {
PrismReferenceWrapper<ObjectReferenceType> wrapper = super.createWrapperInternal(parent, item, status, ctx);

wrapper.setSpecialSearchItemFunctions(Collections.singleton((Function<Search, SearchItem> & Serializable) search -> createTenantSearchItem(search)));
return wrapper;
}

private SearchItem createTenantSearchItem(Search search) {
PrismPropertyDefinition tenantDef = getPrismContext().getSchemaRegistry().findComplexTypeDefinitionByCompileTimeClass(OrgType.class)
.findPropertyDefinition(OrgType.F_TENANT);
PropertySearchItem<Boolean> item = new PropertySearchItem<>(search, new SearchItemDefinition(OrgType.F_TENANT, tenantDef, null)) {
@Override
protected boolean canRemoveSearchItem() {
return false;
}

@Override
public boolean isEnabled() {
return false;
}
};
item.setValue(new SearchValue<Boolean>(Boolean.TRUE, "Boolean.TRUE"));
return item;
}
}
Expand Up @@ -18,6 +18,8 @@
import com.evolveum.midpoint.prism.query.ObjectFilter;
import com.evolveum.midpoint.util.exception.SchemaException;
import com.evolveum.midpoint.web.component.form.ValueChoosePanel;
import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchItem;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.RoleType;
Expand All @@ -30,6 +32,8 @@
import javax.xml.namespace.QName;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import java.util.function.Function;

public class PrismReferenceValuePanel<R extends Referencable> extends PrismValuePanel<R, PrismReferenceWrapper<R>, PrismReferenceValueWrapperImpl<R>> {

Expand Down Expand Up @@ -71,6 +75,11 @@ protected boolean isEditButtonEnabled() {

}

@Override
protected Set<Function<Search, SearchItem>> getSpecialSearchItemFunctions() {
return getParentWrapper().getSpecialSearchItemFunctions();
}

@Override
protected <O extends ObjectType> void choosePerformed(AjaxRequestTarget target, O object) {
super.choosePerformed(target, object);
Expand Down
Expand Up @@ -6,9 +6,15 @@
*/
package com.evolveum.midpoint.gui.impl.prism.wrapper;

import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchItem;

import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
Expand All @@ -27,6 +33,7 @@ public class PrismReferenceWrapperImpl<R extends Referencable>
implements PrismReferenceWrapper<R> {

private ObjectFilter filter;
private Set<Function<Search, SearchItem>> specialItemFunctions = Collections.emptySet();

public PrismReferenceWrapperImpl(PrismContainerValueWrapper<?> parent, PrismReference item, ItemStatus status) {
super(parent, item, status);
Expand Down Expand Up @@ -81,6 +88,16 @@ public List<QName> getTargetTypes() {
return WebComponentUtil.createSupportedTargetTypeList(getTargetTypeName());
}

@Override
public Set<Function<Search, SearchItem>> getSpecialSearchItemFunctions() {
return specialItemFunctions;
}

@Override
public void setSpecialSearchItemFunctions(Set<Function<Search, SearchItem>> functions) {
this.specialItemFunctions = functions;
}

@Override
public boolean isEmpty() {
if (super.isEmpty()) { return true; }
Expand Down
Expand Up @@ -7,9 +7,15 @@
package com.evolveum.midpoint.web.component.form;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.web.component.search.Search;
import com.evolveum.midpoint.web.component.search.SearchItem;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
Expand Down Expand Up @@ -199,12 +205,20 @@ protected void onSelectPerformed(AjaxRequestTarget target, O object) {
ValueChoosePanel.this.choosePerformed(target, object);
}

@Override
protected Set<Function<Search, SearchItem>> getSpecialSearchItemFunctions() {
return ValueChoosePanel.this.getSpecialSearchItemFunctions();
}
};

getPageBase().showMainPopup(objectBrowserPanel, target);

}

protected Set<Function<Search, SearchItem>> getSpecialSearchItemFunctions() {
return Collections.emptySet();
}

public List<QName> getSupportedTypes() {
return WebComponentUtil.createObjectTypeList();
}
Expand Down
Expand Up @@ -326,7 +326,7 @@ private ObjectQuery createQueryFromDefaultItems(PageBase pageBase, ExpressionVar

List<ObjectFilter> conditions = new ArrayList<>();
for (SearchItem item : specialItems){
if (item.isEnabled() && item.isApplyFilter()) {
if (item.isApplyFilter()) {
if (item instanceof SpecialSearchItem) {
ObjectFilter filter = ((SpecialSearchItem) item).createFilter(pageBase, variables);
if (filter != null) {
Expand Down
Expand Up @@ -12,12 +12,14 @@
import java.util.Collections;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Predicate;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.component.icon.CompositedIconBuilder;
import com.evolveum.midpoint.gui.impl.component.icon.IconCssStyle;
import com.evolveum.midpoint.gui.impl.component.icon.LayeredIconCssStyle;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPathCollectionsUtil;
import com.evolveum.midpoint.web.component.AjaxCompositedIconSubmitButton;
import com.evolveum.midpoint.web.component.input.TextPanel;
import com.evolveum.midpoint.web.util.InfoTooltipBehavior;
Expand Down Expand Up @@ -841,9 +843,13 @@ public void onClick(AjaxRequestTarget target) {
private List<SearchItemDefinition> createPropertiesList() {
List<SearchItemDefinition> list = new ArrayList<>();

Search search = getModelObject();
list.addAll(search.getAllDefinitions());
List<ItemPath> specialItemPaths = new ArrayList<>();
getModelObject().getSpecialItems().stream().filter(specItem -> (specItem instanceof PropertySearchItem))
.forEach(specItem -> specialItemPaths.add(((PropertySearchItem<?>) specItem).getPath()));

Search search = getModelObject();
search.getAllDefinitions().stream().filter((Predicate<SearchItemDefinition>) def -> !ItemPathCollectionsUtil.containsEquivalent(specialItemPaths, def.getPath()))
.forEach((Consumer<SearchItemDefinition>) def -> list.add(def));
Collections.sort(list);

return list;
Expand Down
Expand Up @@ -595,6 +595,11 @@ protected boolean canRemoveSearchItem() {
public boolean isEnabled() {
return !dto.isResourceEmpty();
}

@Override
public boolean isApplyFilter() {
return isEnabled();
}
};
if (dto.getObjectClass() != null) {
item.setValue(new SearchValue<>(dto.getObjectClass()));
Expand Down

0 comments on commit f7a4d8d

Please sign in to comment.