package com.hubspot.jinjava.tree.output; import java.util.LinkedList; import java.util.List; import com.hubspot.jinjava.interpret.OutputTooBigException; public class OutputList { private final List<OutputNode> nodes = new LinkedList<>(); private final List<BlockPlaceholderOutputNode> blocks = new LinkedList<>(); private final long maxOutputSize; private long currentSize; public OutputList(long maxOutputSize) { this.maxOutputSize = maxOutputSize; } public void addNode(OutputNode node) { if (maxOutputSize > 0 && currentSize + node.getSize() > maxOutputSize) { throw new OutputTooBigException(maxOutputSize, currentSize + node.getSize()); } currentSize += node.getSize(); nodes.add(node); if (node instanceof BlockPlaceholderOutputNode) { BlockPlaceholderOutputNode blockNode = (BlockPlaceholderOutputNode) node; if (maxOutputSize > 0 && currentSize + blockNode.getSize() > maxOutputSize) { throw new OutputTooBigException(maxOutputSize, currentSize + blockNode.getSize()); } currentSize += blockNode.getSize(); blocks.add(blockNode); } } public List<BlockPlaceholderOutputNode> getBlocks() { return blocks; } public String getValue() { StringBuilder val = new StringBuilder(); long valueSize = 0; for (OutputNode node : nodes) { if (maxOutputSize > 0 && valueSize + node.getSize() > maxOutputSize) { throw new OutputTooBigException(maxOutputSize, valueSize + node.getSize()); } valueSize += node.getSize(); val.append(node.getValue()); } return val.toString(); } @Override public String toString() { return getValue(); } }