package com.github.javaparser.ast.expr;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.visitor.GenericVisitor;
import com.github.javaparser.ast.visitor.VoidVisitor;
import xapi.collect.api.IntTo;
import xapi.collect.api.StringTo;
import xapi.fu.In1Out1;
import static xapi.collect.X_Collect.newStringMultiMap;
import java.util.List;
import java.util.Optional;
/**
* @author James X. Nelson (james@wetheinter.net)
* Created on 4/10/16.
*/
public class UiContainerExpr extends UiExpr {
private boolean inTemplate;
private NameExpr name;
private UiBodyExpr body;
private StringTo.Many<UiAttrExpr> attrs;
public UiContainerExpr(final int beginLine, final int beginColumn, final int endLine, final int endColumn,
NameExpr name, List<UiAttrExpr> attributes, UiBodyExpr body, boolean isInTemplate) {
super(beginLine, beginColumn, endLine, endColumn);
attrs = newStringMultiMap(UiAttrExpr.class);
this.name = name;
this.body = body;
this.inTemplate = isInTemplate;
setAsParentNodeOf(body);
setAttributes(attributes);
}
public List<UiAttrExpr> getAttributes() {
return attrs.flatten().asList();
}
public void addAttribute(boolean replace, UiAttrExpr attr) {
final List<Node> children = getChildrenNodes();
final IntTo<UiAttrExpr> into = attrs.get(attr.getNameString());
if (replace) {
into.forEachValue(children::remove);
into.clear();
}
into.add(attr);
children.add(attr);
setAsParentNodeOf(attr);
}
public IntTo<UiAttrExpr> getAttributes(String name) {
return attrs.get(name);
}
public UiAttrExpr getAttributeNotNull(String name) {
return getAttribute(name).orElseThrow(()->new NullPointerException("No feature named " + name + " found in " + this));
}
public Optional<UiAttrExpr> getAttribute(String name) {
final IntTo<UiAttrExpr> avail = attrs.get(name);
assert avail.size() < 2 : "Asked for a single attribute, but value of " + name +" had more than 1 item: " + avail;
return avail.isEmpty() ? Optional.empty() : Optional.ofNullable(avail.at(0));
}
public void setAttributes(List<UiAttrExpr> attributes) {
final In1Out1<UiAttrExpr, String> mapper = UiAttrExpr::getNameString;
attrs.clear();
attrs.addManyMapped(attributes, mapper);
setAsParentNodeOf(attributes);
}
public UiBodyExpr getBody() {
return body;
}
public void setBody(UiBodyExpr body) {
this.body = body;
}
@Override public <R, A> R accept(final GenericVisitor<R, A> v, final A arg) {
return v.visit(this, arg);
}
@Override public <A> void accept(final VoidVisitor<A> v, final A arg) {
v.visit(this, arg);
}
public String getName() {
return name.getName();
}
public NameExpr getNameExpr() {
assert name != null : "Null names are not allowed!";
return name;
}
public void setNameExpr(NameExpr name) {
assert name != null : "Null names are not allowed!";
this.name = name;
}
public void setName(String name) {
assert name != null : "Null names are not allowed!";
this.name = new NameExpr(name);
}
public boolean isInTemplate() {
return inTemplate;
}
public void setInTemplate(boolean inTemplate) {
this.inTemplate = inTemplate;
}
public boolean removeAttribute(UiAttrExpr attr) {
final IntTo<UiAttrExpr> list = attrs.get(attr.getNameString());
getChildrenNodes().remove(attr);
if (list.findRemove(attr, false)) {
if (list.isEmpty()) {
attrs.remove(attr.getNameString());
}
return true;
}
return false;
}
}