package xapi.dev.ui;
import com.github.javaparser.ast.expr.Expression;
import com.github.javaparser.ast.expr.StringLiteralExpr;
import com.github.javaparser.ast.expr.TemplateLiteralExpr;
import com.github.javaparser.ast.expr.UiContainerExpr;
import com.github.javaparser.ast.plugin.Transformer;
import xapi.dev.source.DomBuffer;
import xapi.dev.source.SourceBuilder;
import xapi.fu.Lazy;
import xapi.fu.Out1;
import static xapi.reflect.X_Reflect.className;
import java.util.ArrayList;
import java.util.List;
/**
* @author James X. Nelson (james@wetheinter.net)
* Created on 5/3/16.
*/
public class UiComponentGenerator {
protected Lazy<DomBuffer> shadowDomBuffer;
protected Lazy<SourceBuilder<ContainerMetadata>> classBuffer;
private ContainerMetadata metadata;
private List<UiFeatureGenerator> featureGenerators;
private boolean printCommentsAllowed;
private Transformer transformer;
public UiComponentGenerator() {
this(DomBuffer::new);
}
public UiComponentGenerator(Out1<DomBuffer> factory) {
shadowDomBuffer = Lazy.deferred1(factory);
classBuffer = Lazy.deferBoth(SourceBuilder<ContainerMetadata>::new, this::getMetadata);
featureGenerators = new ArrayList<>();
transformer = createTransformer();
}
protected Transformer createTransformer() {
return new Transformer();
}
public String convertToSource(Expression value) {
if (value instanceof StringLiteralExpr) {
return ((StringLiteralExpr)value).getValue();
} else if (value instanceof TemplateLiteralExpr) {
return ((TemplateLiteralExpr)value).getValueWithoutTicks();
} else {
throw new IllegalArgumentException("Cannot convert " + className(value) +" into source: " + value);
}
}
public DomBuffer dom() {
return shadowDomBuffer.out1();
}
public SourceBuilder<ContainerMetadata> java() {
return classBuffer.out1();
}
public ContainerMetadata getMetadata() {
return metadata;
}
public void setMetadata(ContainerMetadata metadata) {
this.metadata = metadata;
if (classBuffer.isImmutable()) {
classBuffer.out1().setPayload(metadata);
}
}
public boolean isPrintCommentsAllowed() {
return printCommentsAllowed;
}
public void setPrintCommentsAllowed(boolean printCommentsAllowed) {
this.printCommentsAllowed = printCommentsAllowed;
}
public UiVisitScope startVisit(UiGeneratorTools service, ContainerMetadata me, UiContainerExpr n) {
return UiVisitScope.DEFAULT_CONTAINER;
}
public void endVisit(UiGeneratorTools service, ContainerMetadata me, UiContainerExpr n, UiVisitScope scope) {
}
public Transformer getTransformer() {
return transformer;
}
}