package xapi.dev.ui;
import com.github.javaparser.ast.expr.UiAttrExpr;
import com.github.javaparser.ast.expr.UiContainerExpr;
import xapi.dev.source.SourceBuilder;
import xapi.util.api.RemovalHandler;
/**
* Created by James X. Nelson (james @wetheinter.net) on 6/28/16.
*/
public abstract class AbstractUiImplementationGenerator extends UiGeneratorTools implements UiImplementationGenerator {
protected UiGeneratorService generator;
public AbstractUiImplementationGenerator() {
}
@Override
public ContainerMetadata generateComponent(ContainerMetadata metadata, ComponentBuffer buffer) {
final String pkgName = metadata.getControllerPackage();
final String className = metadata.getControllerSimpleName();
final UiContainerExpr expr = metadata.getUi();
metadata.setControllerType(pkgName, className);
String generatedName = calculateGeneratedName(pkgName, className, expr);
SourceBuilder b = new SourceBuilder("public class " + generatedName)
.setPackage(pkgName)
.setSuperClass(buffer.getBinder().getQualifiedName());
metadata.setSourceBuilder(b);
UiGeneratorVisitor visitor = createVisitor(metadata);
visitor.visit(expr, this);
return metadata;
}
@Override
public UiGeneratorVisitor createVisitor(ContainerMetadata metadata) {
final UiGeneratorVisitor visitor = super.createVisitor(metadata);
visitor.wrapScope(
handler->
scope -> {
scopes.add(scope);
final RemovalHandler undo = handler.io(scope);
return ()->{
undo.remove();
UiVisitScope popped = scopes.pop();
assert popped == scope : "Scope stack inconsistent; " +
"expected " + popped + " to be the same reference as " + scope;
};
}
);
return visitor;
}
protected abstract String getImplPrefix();
@Override
public String calculateGeneratedName(
String pkgName, String className, UiContainerExpr expr
) {
return getImplPrefix() + super.calculateGeneratedName(pkgName, className, expr);
}
public UiGeneratorService getGenerator() {
return generator;
}
@Override
public UiGeneratorTools getTools() {
return this;
}
public void setGenerator(UiGeneratorService generator) {
this.generator = generator;
}
@Override
public UiComponentGenerator getComponentGenerator(UiContainerExpr container, ContainerMetadata metadata) {
final UiComponentGenerator gen = super.getComponentGenerator(container, metadata);
if (gen == null) {
return getGenerator().getComponentGenerator(container, metadata);
}
return gen;
}
@Override
public UiFeatureGenerator getFeatureGenerator(
UiAttrExpr container, UiComponentGenerator componentGenerator
) {
final UiFeatureGenerator gen = super.getFeatureGenerator(container, componentGenerator);
if (gen == null) {
return getGenerator().getFeatureGenerator(container, componentGenerator);
}
return gen;
}
}