Skip to content

Commit

Permalink
Merge branch 'master' into feature/mid-6303
Browse files Browse the repository at this point in the history
# Conflicts:
#	repo/repo-sql-impl/src/main/java/com/evolveum/midpoint/repo/sql/data/common/container/RAccessCertificationCase.java
  • Loading branch information
virgo47 committed Jun 10, 2020
2 parents 58f5a04 + 85a9545 commit e6dbb3a
Show file tree
Hide file tree
Showing 43 changed files with 1,290 additions and 875 deletions.
@@ -0,0 +1,33 @@
/*
* Copyright (c) 2020 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.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;

import org.apache.wicket.extensions.ajax.markup.html.autocomplete.AbstractAutoCompleteRenderer;
import org.apache.wicket.request.Response;

/**
* @author honchar
*/
public class AutoCompleteReferenceRenderer extends AbstractAutoCompleteRenderer<ObjectReferenceType> {

private static final long serialVersionUID = 1L;

@Override
protected String getTextValue(ObjectReferenceType object) {
return WebComponentUtil.getName(object);
}

@Override
protected void renderChoice(ObjectReferenceType object, Response response, String criteria) {
String textValue = getTextValue(object);
response.write(textValue);

}
}
Expand Up @@ -78,12 +78,7 @@ protected void updateAjaxAttributes(AjaxRequestAttributes attributes){
@Override
public <C> IConverter<C> getConverter(Class<C> type) {
IConverter<C> converter = super.getConverter(type);
if (lookupTable == null) {
return converter;
}

return new LookupTableConverter<>(converter, lookupTable, getBaseFormComponent(), strict);

return getAutoCompleteConverter(type, converter);
}
};

Expand Down Expand Up @@ -114,6 +109,14 @@ 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) {
return originConverter;
}

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

@Override
public FormComponent<T> getBaseFormComponent() {
return (FormComponent<T>) get(ID_INPUT);
Expand Down
@@ -0,0 +1,68 @@
/*
* Copyright (c) 2020 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.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.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;

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

import org.apache.commons.collections.CollectionUtils;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.util.convert.ConversionException;
import org.apache.wicket.util.convert.IConverter;

import java.util.List;
import java.util.Locale;

/**
* @author honchar
*/
public class ReferenceConverter implements IConverter<ObjectReferenceType> {

private static final long serialVersionUID = 1L;
private IConverter<ObjectReferenceType> originConverter;
private List<ObjectReferenceType> referenceList = null;
private FormComponent baseComponent;

private PageBase pageBase;

public ReferenceConverter(IConverter<ObjectReferenceType> originConverter, List<ObjectReferenceType> referenceList, FormComponent baseComponent, PageBase pageBase) {
this.originConverter = originConverter;
this.referenceList = referenceList;
this.baseComponent = baseComponent;
this.pageBase = pageBase;
}

@Override
public ObjectReferenceType convertToObject(String value, Locale locale) throws ConversionException {
ObjectQuery query = pageBase.getPrismContext().queryFor(AbstractRoleType.class)
.item(ObjectType.F_NAME)
.eq(value)
.matchingOrig()
.build();
List<PrismObject<AbstractRoleType>> objectsList = WebModelServiceUtils.searchObjects(AbstractRoleType.class, query,
new OperationResult("searchObjects"), pageBase);
if (CollectionUtils.isNotEmpty(objectsList)){
return ObjectTypeUtil.createObjectRefWithFullObject(objectsList.get(0), pageBase.getPrismContext());
}
return originConverter.convertToObject(value, locale);

}

@Override
public String convertToString(ObjectReferenceType ref, Locale arg1) {
return ref != null ? WebComponentUtil.getName(ref) : "";
}
}
Expand Up @@ -6,6 +6,11 @@
*/
package com.evolveum.midpoint.gui.impl.factory.wrapper;

import com.evolveum.midpoint.gui.api.prism.wrapper.ShadowWrapper;
import com.evolveum.midpoint.util.logging.Trace;

import com.evolveum.midpoint.util.logging.TraceManager;

import org.springframework.stereotype.Component;

import com.evolveum.midpoint.gui.api.prism.ItemStatus;
Expand All @@ -23,9 +28,14 @@
@Component
public class ShadowWrapperFactoryImpl extends PrismObjectWrapperFactoryImpl<ShadowType> {

private static final transient Trace LOGGER = TraceManager.getTrace(ShadowWrapperFactoryImpl.class);

@Override
public PrismObjectWrapper<ShadowType> createObjectWrapper(PrismObject<ShadowType> object, ItemStatus status) {
return new ShadowWrapperImpl(object, status);
LOGGER.trace("create shadow wrapper");
ShadowWrapper shadowWrapper = new ShadowWrapperImpl(object, status);
LOGGER.trace("Shadow wrapper created: {}", shadowWrapper);
return shadowWrapper;
}

@Override
Expand Down
Expand Up @@ -59,36 +59,47 @@ private void initLayout() {

try {

long attributesStart = System.currentTimeMillis();
ItemPanelSettingsBuilder attributesSettingsBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel attributesPanel = getPageBase().initItemPanel(ID_ATTRIBUTES, ShadowAttributesType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ShadowType.F_ATTRIBUTES),
attributesSettingsBuilder.build());
add(attributesPanel);
long attributesEnd = System.currentTimeMillis();
LOGGER.trace("Attributes finished in {} ms", attributesEnd - attributesStart);

long associationStart = System.currentTimeMillis();
ItemPanelSettingsBuilder associationBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel associationsPanel = getPageBase().initItemPanel(ID_ASSOCIATIONS, ShadowAssociationType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ShadowType.F_ASSOCIATION),
associationBuilder.build());
associationsPanel.add(new VisibleBehaviour(() -> checkAssociationsVisibility()));
add(associationsPanel);
long associationEnd = System.currentTimeMillis();
LOGGER.trace("Association finished in {} ms", associationEnd - associationStart);


long activationStart = System.currentTimeMillis();
ItemPanelSettingsBuilder activationBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel activationPanel = getPageBase().initItemPanel(ID_ACTIVATION, ActivationType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ShadowType.F_ACTIVATION),
activationBuilder.build());
activationPanel.add(new VisibleBehaviour(() -> isActivationSupported()));
add(activationPanel);
long activationEnd = System.currentTimeMillis();
LOGGER.trace("Activation finished in {} ms", activationEnd - activationStart);

long passwordStart = System.currentTimeMillis();
ItemPanelSettingsBuilder passwordSettingsBuilder = new ItemPanelSettingsBuilder()
.visibilityHandler(itemWrapper -> checkShadowContainerVisibility(itemWrapper, getModel()));
Panel passwordPanel = getPageBase().initItemPanel(ID_PASSWORD, PasswordType.COMPLEX_TYPE, PrismContainerWrapperModel.fromContainerWrapper(getModel(), ItemPath.create(ShadowType.F_CREDENTIALS, CredentialsType.F_PASSWORD)),
passwordSettingsBuilder.build());
passwordPanel.add(new VisibleBehaviour(() -> isCredentialsSupported()));
add(passwordPanel);
long passwordEnd = System.currentTimeMillis();
LOGGER.trace("Password finished in {} ms", passwordEnd - passwordStart);
} catch (SchemaException e) {
getSession().error("Cannot create panels for shadow, reason: " + e.getMessage());
LOGGER.error("Cannot create panels for shadow, reason: {}", e.getMessage(), e);
LOGGER.trace("Cannot create panels for shadow, reason: {}", e.getMessage(), e);

}
}
Expand Down
Expand Up @@ -29,8 +29,6 @@ public class DropDownChoicePanel<T> extends InputPanel {
private static final long serialVersionUID = 1L;
private static final String ID_INPUT = "input";

private boolean sortChoices = true;

public DropDownChoicePanel(String id, IModel<T> model, IModel<? extends List<? extends T>> choices) {
this(id, model, choices, false);
}
Expand Down Expand Up @@ -66,16 +64,6 @@ protected String getNullValidDisplayValue() {
return DropDownChoicePanel.this.getNullValidDisplayValue();
}

@Override
public IModel<? extends List<? extends T>> getChoicesModel() {
IModel<? extends List<? extends T>> choices = super.getChoicesModel();
if (sortChoices) {
return Model.ofList(WebComponentUtil.sortDropDownChoices(choices, renderer));
} else {
return choices;
}
}

@Override
public String getModelValue() {
T object = this.getModelObject();
Expand Down Expand Up @@ -108,12 +96,4 @@ public IModel<T> getModel() {
protected String getNullValidDisplayValue() {
return getString("DropDownChoicePanel.notDefined");
}

public boolean isSortChoices() {
return sortChoices;
}

public void setSortChoices(boolean sortChoices) {
this.sortChoices = sortChoices;
}
}
Expand Up @@ -475,27 +475,6 @@ private void addSelectedAccountPerformed(AjaxRequestTarget target, List<Resource
target.add(getMultivalueContainerListPanel());
}

private IModel<PrismContainerWrapper<ShadowType>> createEmptyShadowWrapperModel() {
ShadowType shadow = new ShadowType();
ShadowWrapper wrapper = null;
Task task = getPageBase().createSimpleTask("create empty shadow wrapper");
try {
getPageBase().getPrismContext().adopt(shadow);
wrapper = ((PageAdminFocus) getPage()).loadShadowWrapper(shadow.asPrismContainer(), task, task.getResult());
} catch (SchemaException e) {
getPageBase().showResult(task.getResult(), "pageAdminFocus.message.couldntCreateShadowWrapper");
LOGGER.error("Couldn't create shadow wrapper", e);
}
final ShadowWrapper ret = wrapper;
return new IModel<PrismContainerWrapper<ShadowType>>() {

@Override
public PrismContainerWrapper<ShadowType> getObject() {
return ret;
}
};
}

private List<InlineMenuItem> createShadowMenu() {
List<InlineMenuItem> items = new ArrayList<>();

Expand Down
@@ -0,0 +1,71 @@
/*
* Copyright (c) 2020 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.web.component.search;

import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteTextPanel;

import com.evolveum.midpoint.gui.api.component.autocomplete.ReferenceConverter;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.prism.PrismObject;

import com.evolveum.midpoint.prism.query.ObjectQuery;
import com.evolveum.midpoint.schema.result.OperationResult;
import com.evolveum.midpoint.schema.util.ObjectTypeUtil;
import com.evolveum.midpoint.xml.ns._public.common.common_3.AbstractRoleType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectType;

import org.apache.commons.lang.StringUtils;
import org.apache.wicket.extensions.ajax.markup.html.autocomplete.IAutoCompleteRenderer;
import org.apache.wicket.markup.html.form.FormComponent;
import org.apache.wicket.model.IModel;
import org.apache.wicket.util.convert.IConverter;

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

/**
* @author honchar
*/
public abstract class ReferenceAutocomplete<O extends ObjectType> extends AutoCompleteTextPanel<ObjectReferenceType> {
private static final long serialVersionUID = 1L;

private PageBase pageBase;

public ReferenceAutocomplete(String id, final IModel<ObjectReferenceType> model, IAutoCompleteRenderer<ObjectReferenceType> renderer, PageBase pageBase) {
super(id, model, ObjectReferenceType.class, renderer);
this.pageBase = pageBase;
}


@Override
public Iterator<ObjectReferenceType> getIterator(String input) {
FormComponent<ObjectReferenceType> inputField = getBaseFormComponent();
if (inputField == null || StringUtils.isEmpty(inputField.getRawInput())){
return null;
}
ObjectQuery query = pageBase.getPrismContext().queryFor(AbstractRoleType.class)
.item(ObjectType.F_NAME)
.containsPoly(inputField.getRawInput())
.matchingNorm()
.build();
List<PrismObject<AbstractRoleType>> objectsList = WebModelServiceUtils.searchObjects(AbstractRoleType.class, query,
new OperationResult("searchObjects"), pageBase);
return (Iterator<ObjectReferenceType>) ObjectTypeUtil.objectListToReferences(objectsList);
}

@Override
protected <C> IConverter<C> getAutoCompleteConverter(Class<C> type, IConverter<C> originConverter){
IConverter<C> converter = super.getAutoCompleteConverter(type, originConverter);
return (IConverter<C>) new ReferenceConverter((IConverter<ObjectReferenceType>)converter, new ArrayList<>(), getBaseFormComponent(), pageBase);
}

protected abstract Class<O> getReferenceTargetObjectType();

}
Expand Up @@ -13,9 +13,15 @@
<div class="form-group col-sm-12">
<label class="col-sm-4"><wicket:message key="ReferencePopupPanel.oid"/></label>
<div class="col-sm-8">
<input wicket:id=oid type="text" class="form-control input-sm" style="width: 150px; min-width: 150px;">
<input wicket:id="oid" type="text" class="form-control input-sm" style="width: 150px; min-width: 150px;" />
</div>
</div>
<!-- <div class="form-group col-sm-12">-->
<!-- <label class="col-sm-4"><wicket:message key="Name"/></label>-->
<!-- <div class="col-sm-8">-->
<!-- <div wicket:id="name" />-->
<!-- </div>-->
<!-- </div>-->
<div class="form-group col-sm-12">
<label class="col-sm-4"><wicket:message key="ReferencePopupPanel.targetType"/></label>
<div class="col-sm-8">
Expand Down

0 comments on commit e6dbb3a

Please sign in to comment.