Skip to content

Commit

Permalink
search refactoring - splitting search item wrapper creation to separa…
Browse files Browse the repository at this point in the history
…ted factories. should be more readable now.
  • Loading branch information
katkav committed Dec 12, 2022
1 parent ad6818c commit 7fb8197
Show file tree
Hide file tree
Showing 30 changed files with 640 additions and 279 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
/*
* Copyright (C) 2022 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.component.search;

import java.lang.reflect.Modifier;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
/*
* Copyright (C) 2022 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.component.search;

import java.util.*;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,10 @@
/*
* Copyright (C) 2022 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.component.search;

import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,237 +1,65 @@
/*
* Copyright (C) 2022 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.component.search;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.GuiDisplayTypeUtil;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebPrismUtil;
import com.evolveum.midpoint.gui.impl.GuiChannel;
import com.evolveum.midpoint.gui.impl.component.search.wrapper.*;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.schema.ResourceShadowCoordinates;
import com.evolveum.midpoint.util.DOMUtil;
import com.evolveum.midpoint.util.DisplayableValue;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.web.component.search.SearchValue;
import com.evolveum.midpoint.xml.ns._public.common.audit_3.AuditEventRecordType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.*;
import com.evolveum.prism.xml.ns._public.types_3.ItemPathType;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;

import javax.xml.namespace.QName;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.impl.component.search.factory.*;
import com.evolveum.midpoint.gui.impl.component.search.wrapper.PropertySearchItemWrapper;
import com.evolveum.midpoint.prism.Containerable;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.schema.ResourceShadowCoordinates;
import com.evolveum.midpoint.xml.ns._public.common.common_3.SearchItemType;

public class SearchConfigurationWrapperFactory {

private static List<AbstractSearchItemWrapperFactory> factories = new ArrayList<>();

static {
factories.add(new ChoicesSearchItemWrapperFactory());
factories.add(new AutocompleteSearchItemWrapperFactory());
factories.add(new ReferenceSearchItemWrapperFactory());
factories.add(new ObjectClassSearchItemWrapperFactory());
factories.add(new DeadShadowSearchItemWrapperFactory());
factories.add(new ObjectClassSearchItemWrapperFactory());
factories.add(new ItemPathSearchItemWrapperFactory());
factories.add(new DateSearchItemWrapperFactory());
factories.add(new TextSearchItemWrapperFactory());
}

public static <C extends Containerable> PropertySearchItemWrapper createPropertySearchItemWrapper(PrismContainerDefinition<C> definition,
SearchItemType item, ResourceShadowCoordinates coordinates, ModelServiceLocator modelServiceLocator) {
// ItemPath itemPath = null;
ItemDefinition<?> itemDef = itemDef = definition.findItemDefinition(item.getPath().getItemPath());
// if (item.getPath() != null) {
// PrismContainerDefinition<C> def;
// if (ObjectType.class.isAssignableFrom(type) && modelServiceLocator != null) {
// def = PredefinedSearchableItems.findObjectDefinition((Class<? extends ObjectType>) type, coordinates, modelServiceLocator);
// } else {
// def = PrismContext.get().getSchemaRegistry().findContainerDefinitionByCompileTimeClass(type);
// }
// itemDef = def.findItemDefinition(item.getPath().getItemPath());
// }

if (itemDef == null && !hasParameter(item) && item.getFilter() == null) {
return null;
}

PropertySearchItemWrapper<?> searchItemWrapper =
createPropertySearchItemWrapper(definition, item, itemDef, modelServiceLocator); //
//type, itemDef, itemPath, valueTypeName, availableValues, lookupTable, item.getFilter());

searchItemWrapper.setVisible(BooleanUtils.isTrue(item.isVisibleByDefault()) || hasParameter(item));
searchItemWrapper.setValueTypeName(getSearchItemValueTypeName(item, itemDef));

searchItemWrapper.setName(getSearchItemName(item, itemDef));
searchItemWrapper.setHelp(getSearchItemHelp(item, itemDef));

if (hasParameter(item)) {
searchItemWrapper.setParameterName(item.getParameter().getName());
if (item.getParameter().getType() != null) {
searchItemWrapper.setParameterValueType(PrismContext.get().getSchemaRegistry().determineClassForType(item.getParameter().getType()));
}
if (searchItemWrapper instanceof DateSearchItemWrapper) {
((DateSearchItemWrapper) searchItemWrapper).setInterval(false);
}
}

if (item.isVisibleByDefault() != null) {
searchItemWrapper.setVisible(item.isVisibleByDefault());
}
if (item.getFilter() != null) {
searchItemWrapper.setPredefinedFilter(item.getFilter());
searchItemWrapper.setVisible(true);
searchItemWrapper.setApplyFilter(true);
searchItemWrapper.setFilterExpression(item.getFilterExpression());
}
return searchItemWrapper;
}
createPropertySearchItemWrapper(definition, item, modelServiceLocator); //

private static String getSearchItemName(SearchItemType searchItem, ItemDefinition<?> itemDef) {
String name = null;
if (searchItem.getDisplayName() != null) {
name = WebComponentUtil.getTranslatedPolyString(searchItem.getDisplayName());
}
if (StringUtils.isNotEmpty(name)) {
return name;
}
name = WebComponentUtil.getTranslatedPolyString(GuiDisplayTypeUtil.getLabel(searchItem.getDisplay()));
if (StringUtils.isNotEmpty(name)) {
return name;
}
name = WebComponentUtil.getItemDefinitionDisplayNameOrName(itemDef, null);
if (StringUtils.isNotEmpty(name)) {
return name;
}
return hasParameter(searchItem) ? searchItem.getParameter().getName() : "";
return searchItemWrapper;
}
private static <C extends Containerable> PropertySearchItemWrapper createPropertySearchItemWrapper(
PrismContainerDefinition<C> definition,
SearchItemType item, ModelServiceLocator modelServiceLocator) {

private static String getSearchItemHelp(SearchItemType searchItem, ItemDefinition<?> itemDef) {
String help = GuiDisplayTypeUtil.getHelp(searchItem.getDisplay());
if (StringUtils.isNotEmpty(help)) {
return help;
}
if (itemDef !=null) {
help = WebPrismUtil.getHelpText(itemDef);
if (StringUtils.isNotBlank(help)) {
Pattern pattern = Pattern.compile("<.+?>");
Matcher m = pattern.matcher(help);
help = m.replaceAll("");
}
if (StringUtils.isNotEmpty(help)) {
return help;
}
}
return hasParameter(searchItem) ? GuiDisplayTypeUtil.getHelp(searchItem.getParameter().getDisplay()) : "";
}
SearchItemContext searchItemContext = new SearchItemContext(definition, item, modelServiceLocator);

private static boolean hasParameter(SearchItemType searchItem) {
return searchItem != null && searchItem.getParameter() != null;
}

private static List<DisplayableValue<?>> getSearchItemAvailableValues(SearchItemType searchItem, ItemDefinition<?> def,
ModelServiceLocator modelServiceLocator) {
if (def instanceof PrismPropertyDefinition<?>) {
return CollectionUtils.isNotEmpty(((PrismPropertyDefinition<?>)def).getAllowedValues()) ?
(List<DisplayableValue<?>>) ((PrismPropertyDefinition<?>)def).getAllowedValues()
: getAllowedValues(ItemPath.create(def.getItemName()));
}
if (hasParameter(searchItem)) {
SearchFilterParameterType parameter = searchItem.getParameter();
return WebComponentUtil.getAllowedValues(parameter.getAllowedValuesExpression(), modelServiceLocator);
}
return new ArrayList<>();
}
AbstractSearchItemWrapperFactory<?, ? extends PropertySearchItemWrapper> searchItemFactory =
findSearchItemWrapperFactory(searchItemContext);
PropertySearchItemWrapper searchItem = searchItemFactory.create(searchItemContext);
return searchItem;

private static LookupTableType getSearchItemLookupTable(SearchItemType searchItem, ItemDefinition<?> def,
ModelServiceLocator modelServiceLocator) {
if (def != null) {
PrismObject<LookupTableType> lookupTable = WebComponentUtil.findLookupTable(def, (PageBase) modelServiceLocator);
return lookupTable != null ? lookupTable.asObjectable() : null;
}
if (hasParameter(searchItem) && searchItem.getParameter().getAllowedValuesLookupTable() != null) {
PrismObject<LookupTableType> lookupTable = WebComponentUtil.findLookupTable(
searchItem.getParameter().getAllowedValuesLookupTable().asReferenceValue(), (PageBase) modelServiceLocator);
return lookupTable != null ? lookupTable.asObjectable() : null;
}
return null;
}

private static QName getSearchItemValueTypeName(SearchItemType searchItem, ItemDefinition<?> def) {
if (def != null) {
return def.getTypeName();
}
if (hasParameter(searchItem)) {
return searchItem.getParameter().getType();
}
return null;
private static AbstractSearchItemWrapperFactory<?, ? extends PropertySearchItemWrapper> findSearchItemWrapperFactory(SearchItemContext searchItemContext) {
return factories.stream().filter(f -> f.match(searchItemContext)).findFirst().orElse(null);
}

private static <C extends Containerable> PropertySearchItemWrapper createPropertySearchItemWrapper(
PrismContainerDefinition<C> definition,
SearchItemType item, ItemDefinition<?> itemDef, ModelServiceLocator modelServiceLocator) {
// Class<C> type,
// ItemDefinition<?> itemDef, ItemPath path, QName valueTypeName, List<DisplayableValue<?>> availableValues,
// LookupTableType lookupTable, SearchFilterType predefinedFilter) {

List<DisplayableValue<?>> availableValues = getSearchItemAvailableValues(item, itemDef, modelServiceLocator);
QName valueTypeName = getSearchItemValueTypeName(item, itemDef);
LookupTableType lookupTable = getSearchItemLookupTable(item, itemDef, modelServiceLocator);

ItemPath path = null;
if (item.getPath() != null) {
path = item.getPath().getItemPath();
}

if (CollectionUtils.isNotEmpty(availableValues)) {
return new ChoicesSearchItemWrapper(path, availableValues);
}
if (lookupTable != null) {
return new AutoCompleteSearchItemWrapper(path, lookupTable);
}
if (itemDef instanceof PrismReferenceDefinition) {
ReferenceSearchItemWrapper itemWrapper = new ReferenceSearchItemWrapper((PrismReferenceDefinition)itemDef, definition.getTypeClass());
itemWrapper.setName(WebComponentUtil.getItemDefinitionDisplayNameOrName(itemDef, null));
return itemWrapper;
}
if (path != null) {
if (ShadowType.F_OBJECT_CLASS.equivalent(path)) {
return new ObjectClassSearchItemWrapper();
} else if (ShadowType.F_DEAD.equivalent(path)) {
DeadShadowSearchItemWrapper deadWrapper = new DeadShadowSearchItemWrapper(Arrays.asList(new SearchValue<>(true), new SearchValue<>(false)));
deadWrapper.setValue(new SearchValue(false));
return deadWrapper;
}
}
if (valueTypeName != null) {
if (DOMUtil.XSD_BOOLEAN.equals(valueTypeName)) {
List<DisplayableValue<Boolean>> list = new ArrayList<>();
list.add(new SearchValue<>(Boolean.TRUE, "Boolean.TRUE"));
list.add(new SearchValue<>(Boolean.FALSE, "Boolean.FALSE"));
return new ChoicesSearchItemWrapper(path, list);
} else if (QNameUtil.match(ItemPathType.COMPLEX_TYPE, valueTypeName)) {
return new ItemPathSearchItemWrapper(path);
} else if (QNameUtil.match(valueTypeName, DOMUtil.XSD_DATETIME)) {
return new DateSearchItemWrapper(path);
}
}
if (itemDef != null && itemDef.getValueEnumerationRef() != null) {
return new TextSearchItemWrapper(
path,
itemDef,
itemDef.getValueEnumerationRef().getOid(),
itemDef.getValueEnumerationRef().getTargetType());
}

if (path != null) {
return new TextSearchItemWrapper(path, itemDef);
}
return new TextSearchItemWrapper();
}

private static List<DisplayableValue<?>> getAllowedValues(ItemPath path) {
if (AuditEventRecordType.F_CHANNEL.equivalent(path)) {
List<DisplayableValue<?>> list = new ArrayList<>();
for (GuiChannel channel : GuiChannel.values()) {
list.add(new SearchValue<>(channel.getUri(), channel.getLocalizationKey()));
}
return list;
}
return null;
}

}
Original file line number Diff line number Diff line change
@@ -1,29 +1,28 @@
/*
* Copyright (C) 2010-2021 Evolveum and contributors
* Copyright (C) 2010-2022 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.component.search;

import java.util.*;
import java.util.stream.Collectors;
import javax.xml.namespace.QName;

import com.evolveum.midpoint.gui.impl.component.search.wrapper.*;

import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.jetbrains.annotations.NotNull;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.ModelServiceLocator;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.component.search.wrapper.*;
import com.evolveum.midpoint.model.api.authentication.CompiledGuiProfile;
import com.evolveum.midpoint.model.api.authentication.CompiledObjectCollectionView;
import com.evolveum.midpoint.prism.*;
import com.evolveum.midpoint.prism.path.ItemPath;
import com.evolveum.midpoint.prism.path.ObjectReferencePathSegment;
import com.evolveum.midpoint.schema.ResourceShadowCoordinates;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.FullTextSearchUtil;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
/*
* Copyright (C) 2022 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.component.search.factory;

import com.evolveum.midpoint.gui.impl.component.search.wrapper.PropertySearchItemWrapper;
import com.evolveum.midpoint.prism.PrismContext;

import javax.xml.namespace.QName;

public abstract class AbstractSearchItemWrapperFactory<T, PSW extends PropertySearchItemWrapper<T>> {

protected abstract PSW createSearchWrapper(SearchItemContext ctx);

public PSW create(SearchItemContext ctx) {
PSW searchItem = createSearchWrapper(ctx);

searchItem.setVisible(ctx.isVisible());
searchItem.setValueTypeName(ctx.getValueTypeName());

searchItem.setName(ctx.getDisplayName()); //getSearchItemName(item, itemDef)
searchItem.setHelp(ctx.getHelp()); //getSearchItemHelp(item, itemDef)

setupParameterOptions(ctx, searchItem);

if (ctx.hasPredefinedFilter()) {
searchItem.setPredefinedFilter(ctx.getPredefinedFilter());
searchItem.setVisible(true);
searchItem.setApplyFilter(true);
searchItem.setFilterExpression(ctx.getFilterExpression());
}
return searchItem;
}

protected void setupParameterOptions(SearchItemContext ctx, PSW searchItem) {
if (ctx.hasParameter()) {
searchItem.setParameterName(ctx.getParameterName());
QName parameterType = ctx.getParameterType();
if (parameterType != null) {
searchItem.setParameterValueType(PrismContext.get().getSchemaRegistry().determineClassForType(parameterType));
}
}
}

public abstract boolean match(SearchItemContext ctx);

}

0 comments on commit 7fb8197

Please sign in to comment.