-
Notifications
You must be signed in to change notification settings - Fork 188
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
search refactoring - splitting search item wrapper creation to separa…
…ted factories. should be more readable now.
- Loading branch information
Showing
30 changed files
with
640 additions
and
279 deletions.
There are no files selected for viewing
7 changes: 7 additions & 0 deletions
7
.../main/java/com/evolveum/midpoint/gui/impl/component/search/PredefinedSearchableItems.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
...main/java/com/evolveum/midpoint/gui/impl/component/search/SearchBoxConfigurationUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
7 changes: 7 additions & 0 deletions
7
.../main/java/com/evolveum/midpoint/gui/impl/component/search/SearchConfigurationMerger.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
254 changes: 41 additions & 213 deletions
254
...va/com/evolveum/midpoint/gui/impl/component/search/SearchConfigurationWrapperFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
|
||
} |
7 changes: 3 additions & 4 deletions
7
...dmin-gui/src/main/java/com/evolveum/midpoint/gui/impl/component/search/SearchFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
50 changes: 50 additions & 0 deletions
50
...evolveum/midpoint/gui/impl/component/search/factory/AbstractSearchItemWrapperFactory.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
|
||
} |
Oops, something went wrong.