Skip to content

Commit

Permalink
autocomplete panel optimizations, mainly to avoid serializing lookup …
Browse files Browse the repository at this point in the history
…tables
  • Loading branch information
katkav committed Mar 16, 2022
1 parent b9a07a9 commit 8e8e050
Show file tree
Hide file tree
Showing 20 changed files with 350 additions and 106 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
/*
* 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.api.component.autocomplete;

import java.util.Iterator;
import java.util.List;

import org.apache.wicket.model.IModel;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.prism.wrapper.PrismPropertyWrapper;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.prism.wrapper.PrismPropertyValueWrapper;
import com.evolveum.midpoint.prism.PrismContainer;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismContainerable;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AppenderConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LoggingConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;

public class AppenderAutocompletePanel extends AutoCompleteTextPanel<String> {

private final IModel<PrismPropertyValueWrapper<String>> valueWrapperModel;

public AppenderAutocompletePanel(String id, IModel<String> model, IModel<PrismPropertyValueWrapper<String>> valueWrapperModel) {
super(id, model, String.class, false);
this.valueWrapperModel = valueWrapperModel;
}

@Override
public Iterator<String> getIterator(String input) {
return WebComponentUtil.prepareAutoCompleteList(getLookupTable(), input, ((PageBase) getPage()).getLocalizationService()).iterator();
}

@Override
protected LookupTableType getLookupTable() {
PrismPropertyWrapper<String> itemWrapper = valueWrapperModel.getObject().getParent();
if (itemWrapper == null) {
return null;
}
PrismProperty<String> item = itemWrapper.getItem();
PrismContainerValue<?> parent = item.getParent();
if (parent == null || parent.getParent() == null) {
return null;
}

//TODO change matchMethid to be able to check path istead of def???
PrismContainerable<?> parentParent = parent.getParent();
if (!(parentParent instanceof PrismContainer)) {
return null;
}

PrismContainerValue<?> parentValue = ((PrismContainer<?>) parentParent).getParent();

if(parentValue == null || isNotLoggingConfiguration(parentValue)) {
throw new IllegalArgumentException("LoggingConfigurationType not found in parent for Appender");
}

LoggingConfigurationType loggingConfig = parentValue.getRealValue();
if (loggingConfig == null) {
return null;
}

LookupTableType lookupTable = new LookupTableType();
List<LookupTableRowType> list = lookupTable.createRowList();
for (AppenderConfigurationType appender : loggingConfig.getAppender()) {
LookupTableRowType row = new LookupTableRowType();
String name = appender.getName();
row.setKey(name);
row.setValue(name);
row.setLabel(new PolyStringType(name));
list.add(row);
}
return lookupTable;

}

private boolean isNotLoggingConfiguration(PrismContainerValue<?> parentValue) {
return !(parentValue.getRealValue() instanceof LoggingConfigurationType);
}

@Override
protected void onDetach() {
valueWrapperModel.detach();
super.onDetach();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,17 @@
package com.evolveum.midpoint.gui.api.component.autocomplete;

import java.time.Duration;
import java.util.Collection;
import java.util.Iterator;

import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;

import com.evolveum.midpoint.task.api.Task;

import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.attributes.AjaxRequestAttributes;
import org.apache.wicket.ajax.attributes.ThrottlingSettings;
Expand Down Expand Up @@ -37,16 +46,30 @@ public abstract class AutoCompleteTextPanel<T> extends AbstractAutoCompletePanel

private static final String ID_INPUT = "input";

private LookupTableType lookupTable = null;
private String lookupTableOid;
private boolean strict;

public AutoCompleteTextPanel(String id, final IModel<T> model, Class<T> type,
boolean strict, LookupTableType lookupTable) {
this(id, model, type, StringAutoCompleteRenderer.INSTANCE);
this.lookupTable = lookupTable;
this.lookupTableOid = lookupTable != null ? lookupTable.getOid() : null;
this.strict = strict;
}

public AutoCompleteTextPanel(String id, final IModel<T> model, Class<T> type,
boolean strict, String lookupTableOid) {
this(id, model, type, StringAutoCompleteRenderer.INSTANCE);
this.lookupTableOid = lookupTableOid;
this.strict = strict;
}

public AutoCompleteTextPanel(String id, final IModel<T> model, Class<T> type,
boolean strict) {
this(id, model, type, StringAutoCompleteRenderer.INSTANCE);
this.strict = strict;
}


public AutoCompleteTextPanel(String id, final IModel<T> model, Class<T> type, IAutoCompleteRenderer<T> renderer) {
super(id);

Expand Down Expand Up @@ -97,13 +120,29 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes) {
public abstract Iterator<T> getIterator(String input);

protected <C> IConverter<C> getAutoCompleteConverter(Class<C> type, IConverter<C> originConverter) {
if (lookupTable == null) {
LookupTableType lookupTableType = getLookupTable();
if (lookupTableType == null) {
return originConverter;
}

return new LookupTableConverter<>(originConverter, lookupTable, getBaseFormComponent(), strict);
return new LookupTableConverter<>(originConverter, lookupTableType, getBaseFormComponent(), strict);
}

protected LookupTableType getLookupTable() {
if (lookupTableOid != null) {
Task task = getPageBase().createSimpleTask("Load lookup table");
OperationResult result = task.getResult();
Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils
.createLookupTableRetrieveOptions(getPageBase().getSchemaService());
PrismObject<LookupTableType> prismLookupTable = WebModelServiceUtils.loadObject(LookupTableType.class, lookupTableOid, options, getPageBase(), task, result);
if (prismLookupTable != null) {
return prismLookupTable.asObjectable();
}
}
return null;
}


@Override
public FormComponent<T> getBaseFormComponent() {
return (FormComponent<T>) get(ID_INPUT);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,50 +1,41 @@
/*
* Copyright (c) 2010-2018 Evolveum and contributors
* 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.factory.wrapper;

package com.evolveum.midpoint.gui.api.component.autocomplete;

import java.util.Iterator;
import java.util.List;

import org.apache.commons.lang3.EnumUtils;
import org.springframework.stereotype.Component;
import org.apache.wicket.model.IModel;

import com.evolveum.midpoint.gui.api.factory.wrapper.WrapperContext;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.page.admin.configuration.component.ComponentLoggerType;
import com.evolveum.midpoint.gui.impl.page.admin.configuration.component.StandardLoggerType;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismProperty;
import com.evolveum.midpoint.prism.PrismPropertyDefinition;
import com.evolveum.midpoint.util.QNameUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ClassLoggerConfigurationType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LoggingComponentType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringTranslationType;
import com.evolveum.prism.xml.ns._public.types_3.PolyStringType;

/**
* @author skublik
*
*/
@Component
public class LoggingPackageWrapperFactoryImpl<T> extends PrismPropertyWrapperFactoryImpl<T>{
public class LoggingPackageAutocompletePanel extends AutoCompleteTextPanel<String> {

@Override
public boolean match(ItemDefinition<?> def) {
return def instanceof PrismPropertyDefinition
&& QNameUtil.match(def.getItemName(), ClassLoggerConfigurationType.F_PACKAGE);
public LoggingPackageAutocompletePanel(String id, IModel<String> model) {
super(id, model, String.class, false);
}

@Override
public int getOrder() {
return super.getOrder() - 10;
public Iterator<String> getIterator(String input) {
return WebComponentUtil.prepareAutoCompleteList(getLookupTable(), input, ((PageBase) getPage()).getLocalizationService()).iterator();
}


public LookupTableType getPredefinedValues(PrismProperty<T> item, WrapperContext wrapperContext) {
@Override
protected LookupTableType getLookupTable() {
LookupTableType lookupTable = new LookupTableType();
List<LookupTableRowType> list = lookupTable.createRowList();

Expand All @@ -64,7 +55,7 @@ public LookupTableType getPredefinedValues(PrismProperty<T> item, WrapperContext
List<LoggingComponentType> componentLoggers = EnumUtils.getEnumList(LoggingComponentType.class);
for(LoggingComponentType componentLogger : componentLoggers) {
LookupTableRowType row = new LookupTableRowType();
String value = ComponentLoggerType.getPackageByValue(componentLogger);
String value = ComponentLoggerType.getPackageByValue(componentLogger);
row.setKey(value);
row.setValue(value);
PolyStringType label = new PolyStringType("LoggingComponentType." + componentLogger.name());
Expand All @@ -75,7 +66,6 @@ public LookupTableType getPredefinedValues(PrismProperty<T> item, WrapperContext
list.add(row);
}
return lookupTable;

}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
/*
* 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.api.component.autocomplete;

import com.evolveum.midpoint.common.LocalizationService;
import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.impl.factory.panel.TextPanelFactory;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;

import org.apache.wicket.model.IModel;

import java.util.Iterator;
import java.util.List;

public class LookupAutocompletePanel<T> extends AutoCompleteTextPanel<T> {


public LookupAutocompletePanel(String id, IModel<T> model, Class<T> type, boolean strict, String lookupTableOid) {
super(id, model, type, strict, lookupTableOid);
}

@Override
public Iterator<T> getIterator(String input) {
return (Iterator<T>) prepareAutoCompleteList(input, getLookupTable(), ((PageBase) getPage()).getLocalizationService()).iterator();
}

protected List<String> prepareAutoCompleteList(String input, LookupTableType lookupTable, LocalizationService localizationService) {
return WebComponentUtil.prepareAutoCompleteList(lookupTable, input, localizationService);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@
*/
package com.evolveum.midpoint.gui.api.component.autocomplete;

import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.task.api.Task;
import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableRowType;

import com.evolveum.midpoint.xml.ns._public.common.common_3.LookupTableType;
Expand All @@ -15,6 +22,7 @@
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;

import java.util.Collection;
import java.util.Locale;

/**
Expand All @@ -25,19 +33,20 @@ public class LookupTableConverter<C> implements IConverter<C> {

private static final long serialVersionUID = 1L;
private IConverter<C> originConverter;
private LookupTableType lookupTable = null;
private String lookupTableOid;
private FormComponent baseComponent;
private boolean strict;

public LookupTableConverter(IConverter<C> originConverter, LookupTableType lookupTable, FormComponent baseComponent, boolean strict) {
this.originConverter = originConverter;
this.lookupTable = lookupTable;
this.lookupTableOid = lookupTable != null ? lookupTable.getOid() : null;
this.baseComponent = baseComponent;
this.strict = strict;
}

@Override
public C convertToObject(String value, Locale locale) throws ConversionException {
LookupTableType lookupTable = getLookupTable();
for (LookupTableRowType row : lookupTable.getRow()) {
if (value.equals(row.getKey())
|| value.equals(WebComponentUtil.getLocalizedOrOriginPolyStringValue(row.getLabel() != null ? row.getLabel().toPolyString() : null))) {
Expand All @@ -61,6 +70,7 @@ public C convertToObject(String value, Locale locale) throws ConversionException

@Override
public String convertToString(C key, Locale arg1) {
LookupTableType lookupTable = getLookupTable();
if (lookupTable != null) {
for (LookupTableRowType row : lookupTable.getRow()) {
if (key.toString().equals(row.getKey())) {
Expand All @@ -70,4 +80,23 @@ public String convertToString(C key, Locale arg1) {
}
return key.toString();
}

private LookupTableType getLookupTable() {
if (lookupTableOid != null) {
Task task = getPageBase().createSimpleTask("Load lookup table");
OperationResult result = task.getResult();
Collection<SelectorOptions<GetOperationOptions>> options = WebModelServiceUtils
.createLookupTableRetrieveOptions(getPageBase().getSchemaService());
PrismObject<LookupTableType> prismLookupTable = WebModelServiceUtils.loadObject(LookupTableType.class, lookupTableOid, options, getPageBase(), task, result);
if (prismLookupTable != null) {
return prismLookupTable.asObjectable();
}
}
return null;
}

private PageBase getPageBase() {
return (PageBase) baseComponent.getPage();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,7 @@ private <F extends FocusType> ValuePolicyType searchValuePolicy(PrismObject<F> o
return null;
}

private PageBase getPageBase() {
public PageBase getPageBase() {
return pageBase;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
*/
public interface PrismPropertyWrapper<T> extends ItemWrapper<PrismProperty<T>, PrismPropertyValueWrapper<T>>, PrismPropertyDefinition<T> {


LookupTableType getPredefinedValues();
void setPredefinedValues(LookupTableType lookupTableType);
String getPredefinedValuesOid();
void setPredefinedValuesOid(String oid);

}

0 comments on commit 8e8e050

Please sign in to comment.