package com.evolveum.midpoint.gui.api.component.path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.commons.lang.StringUtils;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.model.AbstractReadOnlyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.PropertyModel;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.component.autocomplete.AutoCompleteItemDefinitionPanel;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
import com.evolveum.midpoint.web.page.admin.configuration.component.EmptyOnBlurAjaxFormUpdatingBehaviour;
public class ItemPathSegmentPanel extends BasePanel<ItemPathDto> {
private static final long serialVersionUID = 1L;
private static final String ID_DEFINITION = "definition";
private static final String ID_PARENT = "parentPath";
public ItemPathSegmentPanel(String id, ItemPathDto model) {
this(id, Model.of(model));
}
public ItemPathSegmentPanel(String id, IModel<ItemPathDto> model) {
super(id, model);
initLayout();
}
private void initLayout() {
Label label = new Label(ID_PARENT,
new AbstractReadOnlyModel<String>() {
private static final long serialVersionUID = 1L;
@Override
public String getObject() {
if (getModelObject().getParentPath() == null) {
return null;
}
return getString("ItemPathSegmentPanel.itemToSearch", getModelObject().getParentPath().toItemPath().toString());
}
});
label.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return getModelObject().getParentPath() != null;
}
});
label.setOutputMarkupId(true);
add(label);
final AutoCompleteItemDefinitionPanel itemDefPanel = new AutoCompleteItemDefinitionPanel(
ID_DEFINITION, new PropertyModel<ItemDefinition<?>>(getModel(), "itemDef")) {
private static final long serialVersionUID = 1L;
protected Map<String, ItemDefinition<?>> listChoices(String input) {
return collectAvailableDefinitions(input);
}
};
// itemDefPanel.getBaseFormComponent().add(new EmptyOnBlurAjaxFormUpdatingBehaviour());
itemDefPanel.setOutputMarkupId(true);
add(itemDefPanel);
}
private Map<String, ItemDefinition<?>> collectAvailableDefinitions(String input) {
Map<String, ItemDefinition<?>> toSelect = new HashMap<>();
ItemPathDto parentItem = getModelObject().getParentPath();
if (parentItem != null) {
if (parentItem.getItemDef() instanceof PrismContainerDefinition<?>) {
PrismContainerDefinition<?> parentContainer = (PrismContainerDefinition<?>) parentItem.getItemDef();
collectItems(parentContainer.getDefinitions(), input, toSelect);
}
} else {
Collection<ItemDefinition<?>> definitions = getSchemaDefinitionMap().get(getModelObject().getObjectType());
collectItems(definitions, input, toSelect);
}
return toSelect;
}
private void collectItems(Collection<? extends ItemDefinition> definitions, String input, Map<String, ItemDefinition<?>> toSelect) {
if (definitions == null) {
return;
}
for (ItemDefinition<?> def : definitions) {
if (StringUtils.isBlank(input)) {
toSelect.put(def.getName().getLocalPart(), def);
} else {
if (def.getName().getLocalPart().startsWith(input)) {
toSelect.put(def.getName().getLocalPart(), def);
}
}
}
}
public void refreshModel(ItemPathDto newModel) {
getModel().setObject(newModel);
}
protected Map<QName, Collection<ItemDefinition<?>>> getSchemaDefinitionMap() {
return new HashMap<>();
}
public boolean validate() {
// AutoCompleteItemDefinitionPanel autocompletePanel = (AutoCompleteItemDefinitionPanel) get(ID_DEFINITION);
// String current = (String) autocompletePanel.getBaseFormComponent().getModelObject();
// if (getModelObject().getParentPath() != null && StringUtils.isNotBlank(current)) {
// ItemDefinition<?> def = getModelObject().getParentPath().getItemDef();
// if (def.getName().getLocalPart())
// ( !=
// }
return getModelObject().getItemDef() != null;
// return autocompletePanel.getBaseFormComponent().getModelObject() != null;
}
}