package xapi.dev.ui;
import com.github.javaparser.ast.expr.CssExpr;
import com.github.javaparser.ast.expr.MethodReferenceExpr;
import com.github.javaparser.ast.expr.NameExpr;
import com.github.javaparser.ast.expr.UiAttrExpr;
import xapi.collect.impl.SimpleStack;
import xapi.fu.In1Out1;
import xapi.fu.In2;
import xapi.fu.In2Out1;
import xapi.util.api.Destroyable;
/**
* Created by James X. Nelson (james @wetheinter.net) on 6/19/16.
*/
public class ComponentMetadataQuery implements Destroyable {
private boolean visitChildContainers = false;
private boolean visitAttributeContainers = true;
private In1Out1<String, Boolean> templateNameFilter =
In2Out1.of(String::matches)
.supply2("^[$]([a-z]\\S*)?"); // strings starting with $
private final SimpleStack<In2<ComponentGraph, NameExpr>> nameListeners = new SimpleStack<>();
private final SimpleStack<In2<ComponentGraph, MethodReferenceExpr>> methodReferenceListeners = new SimpleStack<>();
private final SimpleStack<In2<ComponentGraph, UiAttrExpr>> dataFeatureListeners = new SimpleStack<>();
private final SimpleStack<In2<ComponentGraph, UiAttrExpr>> refFeatureListeners = new SimpleStack<>();
private final SimpleStack<In2<ComponentGraph, CssExpr>> cssFeatureListeners = new SimpleStack<>();
private final SimpleStack<In2<ComponentGraph, UiAttrExpr>> allFeatureListeners = new SimpleStack<>();
public boolean isVisitChildContainers() {
return visitChildContainers;
}
public ComponentMetadataQuery setVisitChildContainers(boolean visitChildContainers) {
this.visitChildContainers = visitChildContainers;
return this;
}
public boolean isVisitAttributeContainers() {
return visitAttributeContainers;
}
public ComponentMetadataQuery setVisitAttributeContainers(boolean visitAttributeContainers) {
this.visitAttributeContainers = visitAttributeContainers;
return this;
}
public boolean isTemplateName(String name) {
return templateNameFilter.io(name);
}
public ComponentMetadataQuery addNameListener(In2<ComponentGraph, NameExpr> listener) {
nameListeners.add(listener);
return this;
}
public ComponentMetadataQuery addDataFeatureListener(In2<ComponentGraph, UiAttrExpr> listener) {
dataFeatureListeners.add(listener);
return this;
}
public ComponentMetadataQuery addRefFeatureListener(In2<ComponentGraph, UiAttrExpr> listener) {
refFeatureListeners.add(listener);
return this;
}
public ComponentMetadataQuery addCssFeatureListener(In2<ComponentGraph, CssExpr> listener) {
cssFeatureListeners.add(listener);
return this;
}
public ComponentMetadataQuery addAllFeatureListener(In2<ComponentGraph, UiAttrExpr> listener) {
allFeatureListeners.add(listener);
return this;
}
public ComponentMetadataQuery addMethodReferenceListener(In2<ComponentGraph, MethodReferenceExpr> listener) {
methodReferenceListeners.add(listener);
return this;
}
@Override
public void destroy() {
nameListeners.clear();
methodReferenceListeners.clear();
dataFeatureListeners.clear();
refFeatureListeners.clear();
}
public void notifyNameExpr(ComponentGraph scope, NameExpr n) {
nameListeners.forEach(listener->listener.in(scope, n));
}
public void notifyCssExpr(ComponentGraph scope, CssExpr n) {
cssFeatureListeners.forEach(listener->listener.in(scope, n));
}
public void notifyUiAttrExpr(ComponentGraph scope, UiAttrExpr n) {
allFeatureListeners.forEach(listener -> listener.in(scope, n));
switch (n.getName().getName().toLowerCase()) {
case "ref":
refFeatureListeners.forEach(listener->listener.in(scope, n));
break;
case "data":
dataFeatureListeners.forEach(listener->listener.in(scope, n));
break;
}
}
public void notifyMethodReference(ComponentGraph scope, MethodReferenceExpr n) {
methodReferenceListeners.forEach(listener->listener.in(scope, n));
}
public String normalizeTemplateName(String name) {
return name.substring(1);
}
}