package de.neuland.jade4j.parser.node;
import java.util.LinkedList;
import java.util.List;
import de.neuland.jade4j.compiler.IndentWriter;
import de.neuland.jade4j.exceptions.JadeCompilerException;
import de.neuland.jade4j.expression.ExpressionHandler;
import de.neuland.jade4j.model.JadeModel;
import de.neuland.jade4j.template.JadeTemplate;
public abstract class Node implements Cloneable {
protected LinkedList<Node> nodes = new LinkedList<Node>();
protected int lineNumber;
protected String name;
protected String value;
protected Node block;
protected String fileName;
public abstract void execute(IndentWriter writer, JadeModel model, JadeTemplate template) throws JadeCompilerException;
public void setLineNumber(int lineNumber) {
this.lineNumber = lineNumber;
}
public int getLineNumber() {
return lineNumber;
}
public void setValue(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void push(Node node) {
if (node == null) {
throw new RuntimeException();
}
nodes.add(node);
}
public LinkedList<Node> getNodes() {
return nodes;
}
public void setNodes(LinkedList<Node> nodes) {
this.nodes = nodes;
}
public Node pollNode() {
return nodes.isEmpty() ? null : nodes.poll();
}
public boolean hasNodes() {
return !nodes.isEmpty();
}
public boolean hasBlock() {
return block != null;
}
public Node getBlock() {
return block;
}
public void setBlock(Node block) {
this.block = block;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
@Override
public Node clone() throws CloneNotSupportedException {
Node clone = (Node) super.clone();
// Deep copy block
if (this.block != null) {
clone.block = this.block.clone();
}
clone.nodes = new LinkedList<Node>();
for (Node node : this.nodes) {
clone.nodes.add(node.clone());
}
return clone;
}
}