package com.evolveum.midpoint.gui.api.component.path;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.ajax.form.AjaxFormComponentUpdatingBehavior;
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 org.apache.wicket.model.util.ListModel;
import com.evolveum.midpoint.gui.api.component.BasePanel;
import com.evolveum.midpoint.gui.api.page.PageBase;
import com.evolveum.midpoint.gui.api.util.WebComponentUtil;
import com.evolveum.midpoint.prism.Definition;
import com.evolveum.midpoint.prism.ItemDefinition;
import com.evolveum.midpoint.prism.PrismContainerDefinition;
import com.evolveum.midpoint.prism.PrismObjectDefinition;
import com.evolveum.midpoint.web.component.AjaxButton;
import com.evolveum.midpoint.web.component.input.DropDownChoicePanel;
import com.evolveum.midpoint.web.component.input.QNameChoiceRenderer;
import com.evolveum.midpoint.web.component.util.VisibleEnableBehaviour;
public class ItemPathPanel extends BasePanel<ItemPathDto> {
private static final long serialVersionUID = 1L;
private static final String ID_NAMESPACE = "namespace";
private static final String ID_DEFINITION = "definition";
private static final String ID_PLUS = "plus";
private static final String ID_MINUS = "minus";
Map<QName, Collection<ItemDefinition<?>>> schemaDefinitionsMap = null;
public ItemPathPanel(String id, IModel<ItemPathDto> model, PageBase parent) {
super(id, model);
setParent(parent);
initNamspaceDefinitionMap();
initLayout();
}
public ItemPathPanel(String id, ItemPathDto model, PageBase parent) {
this(id, Model.of(model), parent);
}
private void initLayout() {
final ItemPathSegmentPanel itemDefPanel = new ItemPathSegmentPanel(ID_DEFINITION,
new AbstractReadOnlyModel<ItemPathDto>() {
private static final long serialVersionUID = 1L;
public ItemPathDto getObject() {
return ItemPathPanel.this.getModelObject();
}
}) {
private static final long serialVersionUID = 1L;
@Override
protected Map<QName, Collection<ItemDefinition<?>>> getSchemaDefinitionMap() {
return schemaDefinitionsMap;
}
};
itemDefPanel.setOutputMarkupId(true);
add(itemDefPanel);
AjaxButton plusButton = new AjaxButton(ID_PLUS) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
refreshItemPathPanel(new ItemPathDto(ItemPathPanel.this.getModelObject()), true, target);
}
};
plusButton.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
if (getModelObject().getParentPath() == null) {
return true;
}
return (getModelObject().getParentPath().getItemDef() instanceof PrismContainerDefinition);
}
});
plusButton.setOutputMarkupId(true);
add(plusButton);
AjaxButton minusButton = new AjaxButton(ID_MINUS) {
private static final long serialVersionUID = 1L;
@Override
public void onClick(AjaxRequestTarget target) {
refreshItemPathPanel(ItemPathPanel.this.getModelObject().getParentPath(), false, target);
}
};
minusButton.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return getModelObject().getParentPath() != null;
}
});
minusButton.setOutputMarkupId(true);
add(minusButton);
DropDownChoicePanel<QName> namespacePanel = new DropDownChoicePanel<QName>(ID_NAMESPACE,
new PropertyModel<QName>(getModel(), "objectType"),
new ListModel<QName>(WebComponentUtil.createObjectTypeList()), new QNameChoiceRenderer());
namespacePanel.getBaseFormComponent().add(new AjaxFormComponentUpdatingBehavior("change") {
private static final long serialVersionUID = 1L;
@Override
protected void onUpdate(AjaxRequestTarget target) {
target.add(itemDefPanel);
}
});
namespacePanel.add(new VisibleEnableBehaviour() {
private static final long serialVersionUID = 1L;
@Override
public boolean isVisible() {
return getModelObject().getParentPath() == null;
}
});
namespacePanel.setOutputMarkupId(true);
add(namespacePanel);
}
private void refreshItemPathPanel(ItemPathDto itemPathDto, boolean isAdd, AjaxRequestTarget target) {
ItemPathSegmentPanel pathSegmentPanel = (ItemPathSegmentPanel) get(ID_DEFINITION);
if (isAdd && !pathSegmentPanel.validate()) {
return;
}
if (!isAdd) {
itemPathDto = itemPathDto.getParentPath();
}
// pathSegmentPanel.refreshModel(itemPathDto);
this.getModel().setObject(itemPathDto);
target.add(this);
// target.add(pathSegmentPanel);
}
private void initNamspaceDefinitionMap() {
schemaDefinitionsMap = new HashMap<>();
if (getModelObject().getObjectType() != null) {
Class clazz = WebComponentUtil.qnameToClass(getPageBase().getPrismContext(),
getModelObject().getObjectType());
if (clazz != null) {
PrismObjectDefinition<?> objectDef = getPageBase().getPrismContext().getSchemaRegistry()
.findObjectDefinitionByCompileTimeClass(clazz);
Collection<? extends ItemDefinition> defs = objectDef.getDefinitions();
Collection<ItemDefinition<?>> itemDefs = new ArrayList<>();
for (Definition def : defs) {
if (def instanceof ItemDefinition) {
ItemDefinition<?> itemDef = (ItemDefinition<?>) def;
itemDefs.add(itemDef);
}
}
schemaDefinitionsMap.put(getModelObject().getObjectType(), itemDefs);
}
}
// }
}
}