Skip to content

Commit

Permalink
fixing delta computation for wrappers, adding tests, improvements for…
Browse files Browse the repository at this point in the history
… construction in GUIl
  • Loading branch information
katkav committed Aug 25, 2019
1 parent 3b85e62 commit 72c32d6
Show file tree
Hide file tree
Showing 25 changed files with 875 additions and 126 deletions.
Expand Up @@ -44,18 +44,21 @@
*
* @author semancik
* */
public abstract class AutoCompleteQNamePanel extends AbstractAutoCompletePanel {
public abstract class AutoCompleteQNamePanel<T extends QName> extends AbstractAutoCompletePanel {
private static final long serialVersionUID = 1L;

private static final String ID_INPUT = "input";
private Map<String, QName> choiceMap = null;
private Map<String, T> choiceMap = null;

public AutoCompleteQNamePanel(String id, final IModel<QName> model) {
private IModel<T> model;

public AutoCompleteQNamePanel(String id, final IModel<T> model) {
super(id);
this.model = model;
initLayout(model);
}

private void initLayout(final IModel<QName> model) {
private void initLayout(final IModel<T> model) {
setOutputMarkupId(true);

AutoCompleteSettings autoCompleteSettings = createAutoCompleteSettings();
Expand All @@ -67,7 +70,11 @@ public void setObject(String object) {
model.setObject(convertToQname(object));
}

};
@Override
public String getObject() {
return (model.getObject() != null) ? model.getObject().getLocalPart() : null;
}
};

// The inner autocomplete field is always String. Non-string auto-complete fields are problematic
final AutoCompleteTextField<String> input = new AutoCompleteTextField<String>(ID_INPUT, stringModel, String.class, autoCompleteSettings) {
Expand All @@ -87,17 +94,17 @@ protected Iterator<String> getChoices(String input) {
protected void onUpdate(AjaxRequestTarget target) {
String inputString = stringModel.getObject();
if (StringUtils.isBlank(inputString)) {
QName modelObject = model.getObject();
T modelObject = model.getObject();
if (modelObject != null) {
model.setObject(null);
AutoCompleteQNamePanel.this.onChange(target);
}
} else {
QName inputQName = convertToQname(stringModel.getObject());
T inputQName = convertToQname(stringModel.getObject());
if (inputQName == null) {
// We have some input, but it does not match any QName. Just do nothing.
} else {
QName modelObject = model.getObject();
T modelObject = model.getObject();
if (inputQName.equals(modelObject)) {
model.setObject(inputQName);
AutoCompleteQNamePanel.this.onChange(target);
Expand All @@ -112,9 +119,9 @@ protected void onUpdate(AjaxRequestTarget target) {


private Iterator<String> getIterator(String input) {
Map<String, QName> choiceMap = getChoiceMap();
Map<String, T> choiceMap = getChoiceMap();
List<String> selected = new ArrayList<>(choiceMap.size());
for (Entry<String, QName> entry: choiceMap.entrySet()) {
for (Entry<String, T> entry: choiceMap.entrySet()) {
String key = entry.getKey();
if (StringUtils.startsWithIgnoreCase(key, input.toLowerCase())) {
selected.add(key);
Expand All @@ -123,25 +130,25 @@ private Iterator<String> getIterator(String input) {
return selected.iterator();
}

private Map<String, QName> getChoiceMap() {
private Map<String, T> getChoiceMap() {
if (choiceMap == null) {
Collection<QName> choices = loadChoices();
Collection<T> choices = loadChoices();
choiceMap = new HashMap<>();
for (QName choice: choices) {
for (T choice: choices) {
// TODO: smarter initialization of the map
choiceMap.put(choice.getLocalPart(), choice);
}
}
return choiceMap;
}

private QName convertToQname(String input) {
Map<String, QName> choiceMap = getChoiceMap();
private T convertToQname(String input) {
Map<String, T> choiceMap = getChoiceMap();
return choiceMap.get(input);
}


public abstract Collection<QName> loadChoices();
public abstract Collection<T> loadChoices();

protected void onChange(AjaxRequestTarget target) {
// Nothing to do by default. For use in subclasses
Expand Down
Expand Up @@ -86,4 +86,5 @@ public interface ItemWrapper<V extends PrismValue, I extends Item<V, ID>, ID ext

<OW extends PrismObjectWrapper<O>, O extends ObjectType> OW findObjectWrapper();

ItemStatus getStatus();
}
Expand Up @@ -37,7 +37,7 @@ public class AssignmentDetailsWrapperFactoryImpl<C extends Containerable> extend
@Override
public boolean match(ItemDefinition<?> def) {
QName typeName = def.getTypeName();
return ConstructionType.COMPLEX_TYPE.equals(typeName) || PersonaConstructionType.COMPLEX_TYPE.equals(typeName) || MappingsType.COMPLEX_TYPE.equals(typeName) || PolicyRuleType.COMPLEX_TYPE.equals(typeName);
return PersonaConstructionType.COMPLEX_TYPE.equals(typeName) || MappingsType.COMPLEX_TYPE.equals(typeName) || PolicyRuleType.COMPLEX_TYPE.equals(typeName);
}

@Override
Expand Down
@@ -0,0 +1,65 @@
package com.evolveum.midpoint.gui.impl.factory;

import com.evolveum.midpoint.gui.api.prism.PrismContainerWrapper;
import com.evolveum.midpoint.gui.api.util.WebModelServiceUtils;
import com.evolveum.midpoint.gui.impl.prism.ConstructionValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapper;
import com.evolveum.midpoint.gui.impl.prism.PrismContainerValueWrapperImpl;
import com.evolveum.midpoint.model.api.ModelService;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerValue;
import com.evolveum.midpoint.prism.PrismObject;
import com.evolveum.midpoint.schema.GetOperationOptions;
import com.evolveum.midpoint.schema.SelectorOptions;
import com.evolveum.midpoint.util.exception.*;
import com.evolveum.midpoint.util.logging.Trace;
import com.evolveum.midpoint.util.logging.TraceManager;
import com.evolveum.midpoint.web.component.prism.ValueStatus;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ConstructionType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ObjectReferenceType;
import com.evolveum.midpoint.xml.ns._public.common.common_3.ResourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class ConstructionWrapperFactory extends AssignmentDetailsWrapperFactoryImpl<ConstructionType> {

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

@Autowired private ModelService model;

@Override
public int getOrder() {
return super.getOrder() - 10;
}

@Override
public boolean match(ItemDefinition<?> def) {
return ConstructionType.COMPLEX_TYPE .equals(def.getTypeName());
}


@Override
public PrismContainerValueWrapper<ConstructionType> createContainerValueWrapper(PrismContainerWrapper<ConstructionType> objectWrapper, PrismContainerValue<ConstructionType> objectValue, ValueStatus status, WrapperContext context) {
ConstructionValueWrapper constructionValueWrapper = new ConstructionValueWrapper(objectWrapper, objectValue, status);
ConstructionType constructionType = objectValue.asContainerable();
if (constructionType.getResource() != null) {
constructionValueWrapper.setResource(constructionType.getResource().asPrismObject());
return constructionValueWrapper;
}

ObjectReferenceType resourceRef = constructionType.getResourceRef();

PrismObject<ResourceType> resource = null;
try {
resource = model.getObject(ResourceType.class, resourceRef.getOid(), SelectorOptions.createCollection(GetOperationOptions.createNoFetch()), context.getTask(), context.getResult());
} catch (ObjectNotFoundException | SchemaException | SecurityViolationException | CommunicationException | ConfigurationException | ExpressionEvaluationException e) {
LOGGER.error("Problem occurred during resolving resource, reason: {}", e.getMessage(), e);
context.getResult().recordFatalError("A problem occurred during resolving resource, reason: " + e.getMessage(), e);
return constructionValueWrapper;
}

constructionValueWrapper.setResource(resource);
return constructionValueWrapper;
}
}
Expand Up @@ -211,7 +211,7 @@ public int getOrder() {

@Override
public PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper,
PrismContainerValue<C> objectValue, ValueStatus status) {
PrismContainerValue<C> objectValue, ValueStatus status, WrapperContext context) {
// TODO Auto-generated method stub
return null;
}
Expand Down
Expand Up @@ -37,7 +37,6 @@
*
*/
@Component
@Priority(1000)
public class ItemPathPanelFactory extends AbstractGuiComponentFactory<ItemPathType> implements Serializable {

private static final long serialVersionUID = 1L;
Expand Down Expand Up @@ -66,6 +65,6 @@ protected void onUpdate(ItemPathDto itemPathDto) {

}
};
}
}

}
Expand Up @@ -100,7 +100,7 @@ public int getOrder() {
@Override
public PrismContainerValueWrapper<C> createValueWrapper(PrismContainerWrapper<C> parent, PrismContainerValue<C> value, ValueStatus status, WrapperContext context)
throws SchemaException {
PrismContainerValueWrapper<C> containerValueWrapper = createContainerValueWrapper(parent, value, status);
PrismContainerValueWrapper<C> containerValueWrapper = createContainerValueWrapper(parent, value, status, context);
containerValueWrapper.setExpanded(!value.isEmpty());


Expand Down Expand Up @@ -139,7 +139,7 @@ protected PrismContainerWrapper<C> createWrapper(PrismContainerValueWrapper<?> p
}

@Override
public PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper, PrismContainerValue<C> objectValue, ValueStatus status) {
public PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper, PrismContainerValue<C> objectValue, ValueStatus status, WrapperContext context) {
return new PrismContainerValueWrapperImpl<C>(objectWrapper, objectValue, status);
}

Expand Down
Expand Up @@ -31,7 +31,7 @@
public interface PrismContainerWrapperFactory<C extends Containerable> extends ItemWrapperFactory<PrismContainerWrapper<C>, PrismContainerValueWrapper<C>, PrismContainerValue<C>>{


PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper, PrismContainerValue<C> objectValue, ValueStatus status);
PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper, PrismContainerValue<C> objectValue, ValueStatus status, WrapperContext context);


}
Expand Up @@ -85,7 +85,7 @@ public int getOrder() {
@Override
public PrismContainerValueWrapper<C> createValueWrapper(PrismContainerWrapper<C> parent, PrismContainerValue<C> value, ValueStatus status, WrapperContext context)
throws SchemaException {
PrismContainerValueWrapper<C> containerValueWrapper = createContainerValueWrapper(parent, value, status);
PrismContainerValueWrapper<C> containerValueWrapper = createContainerValueWrapper(parent, value, status, context);
containerValueWrapper.setShowEmpty(context.isShowEmpty());

List<ItemWrapper<?,?,?,?>> wrappers = new ArrayList<>();
Expand Down Expand Up @@ -141,7 +141,7 @@ protected PrismContainerWrapper<C> createWrapper(PrismContainerValueWrapper<?> p
}

@Override
public PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper, PrismContainerValue<C> objectValue, ValueStatus status) {
public PrismContainerValueWrapper<C> createContainerValueWrapper(PrismContainerWrapper<C> objectWrapper, PrismContainerValue<C> objectValue, ValueStatus status, WrapperContext context) {
return new PrismContainerValueWrapperImpl<C>(objectWrapper, objectValue, status);
}

Expand Down
Expand Up @@ -93,7 +93,7 @@ public PrismObjectWrapper<O> createObjectWrapper(PrismObject<O> object, ItemStat
}

@Override
public PrismObjectValueWrapper<O> createContainerValueWrapper(PrismContainerWrapper<O> objectWrapper, PrismContainerValue<O> objectValue, ValueStatus status) {
public PrismObjectValueWrapper<O> createContainerValueWrapper(PrismContainerWrapper<O> objectWrapper, PrismContainerValue<O> objectValue, ValueStatus status, WrapperContext context) {
return new PrismObjectValueWrapperImpl<O>((PrismObjectWrapper<O>) objectWrapper, (PrismObjectValue<O>) objectValue, status);
}

Expand Down
Expand Up @@ -109,7 +109,7 @@ protected <ID extends ItemDefinition<PrismContainer<ClassLoggerConfigurationType

@Override
public PrismContainerValueWrapper<ClassLoggerConfigurationType> createContainerValueWrapper(PrismContainerWrapper<ClassLoggerConfigurationType> objectWrapper,
PrismContainerValue<ClassLoggerConfigurationType> objectValue, ValueStatus status) {
PrismContainerValue<ClassLoggerConfigurationType> objectValue, ValueStatus status, WrapperContext context) {

ClassLoggerConfigurationType logger = (ClassLoggerConfigurationType) objectValue.getRealValue();
logger.setPackage(LOGGER_PROFILING);
Expand Down

0 comments on commit 72c32d6

Please sign in to comment.