package xapi.dev.ui; import xapi.collect.X_Collect; import xapi.collect.api.ClassTo; import xapi.dev.source.DomBuffer; import xapi.dev.source.SourceBuilder; import xapi.dev.ui.InterestingNodeFinder.InterestingNodeResults; import xapi.fu.Lazy; import xapi.fu.Out1; import static xapi.fu.Immutable.immutable1; import static xapi.inject.X_Inject.instance; import javax.lang.model.element.TypeElement; /** * Created by james on 6/17/16. */ public class ComponentBuffer { private final Out1<ContainerMetadata> root; private Out1<SourceBuilder<ContainerMetadata>> componentBinder = Lazy.deferred1(this::defaultSourceBuilder); private final ClassTo<ContainerMetadata> implementations; private Out1<DomBuffer> domBuffer = Lazy.deferred1(this::defaultDomBuffer); private TypeElement element; private InterestingNodeResults interestingNodes; public ComponentBuffer() { this(immutable1(instance(ContainerMetadata.class)), true); } public ComponentBuffer(ContainerMetadata metadata) { this(immutable1(metadata), true); } public ComponentBuffer(Out1<ContainerMetadata> metadata) { this(Lazy.deferred1(metadata), false); } public ComponentBuffer(Out1<ContainerMetadata> root, boolean immediate) { this.root = immediate ? immutable1(root.out1()) : Lazy.deferred1(root); implementations = X_Collect.newClassMap(ContainerMetadata.class); } protected SourceBuilder<ContainerMetadata> defaultSourceBuilder() { return root.out1().getSourceBuilder(); } protected DomBuffer defaultDomBuffer() { return instance(DomBuffer.class); } private Out1<DomBuffer> dom = Lazy.deferred1(DomBuffer::new); public SourceBuilder<ContainerMetadata> getBinder() { return componentBinder.out1(); } public ContainerMetadata getRoot() { return root.out1(); } public DomBuffer getDom() { return domBuffer.out1(); } public TypeElement getElement() { return element; } public void setElement(TypeElement element) { this.element = element; } public void setInterestingNodes(InterestingNodeResults interestingNodes) { this.interestingNodes = interestingNodes; } public InterestingNodeResults getInterestingNodes() { return interestingNodes; } public boolean hasDataNodes() { return interestingNodes != null && interestingNodes.hasDataNodes(); } public boolean hasCssNodes() { return interestingNodes != null && interestingNodes.hasCssNodes(); } public boolean hasCssOrClassname() { return interestingNodes != null && interestingNodes.hasCssOrClassname(); } public boolean hasTemplateReferences() { return interestingNodes != null && interestingNodes.hasTemplateReferences(); } public ContainerMetadata getImplementation(Class<? extends UiImplementationGenerator> implType) { final ContainerMetadata r = getRoot(); // TODO use a ClassTo... implementations.getOrCompute(implType, t->r.createImplementation(implType)); return r; } }