AbstractSyntaxTree.java

package edu.udel.cis.vsl.tass.ast.impl;

import java.io.File;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import edu.udel.cis.vsl.tass.ast.IF.ASTFactoryIF;
import edu.udel.cis.vsl.tass.ast.IF.ASTNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.AbstractSyntaxTreeIF;
import edu.udel.cis.vsl.tass.ast.IF.FileNodeIF;
import edu.udel.cis.vsl.tass.ast.IF.RootNodeIF;

public class AbstractSyntaxTree implements AbstractSyntaxTreeIF {

    private final ASTFactoryIF factory;

    private RootNodeIF rootNode = null;

	private Map<File,FileNodeIF> files = new HashMap<File,FileNodeIF>();

    public AbstractSyntaxTree() {
        factory = new ASTFactory();
	}

	@Override
	public Collection<FileNodeIF> files() {
		return files.values();
	}

	@Override
	public void setFiles(Collection<FileNodeIF> mFiles) {
		files.clear();
		for (FileNodeIF file : mFiles) {
			files.put(file.getFile(),file);
		}
	}
    
	@Override
    public ASTFactoryIF factory() {
        return factory;
    }

	@Override
	public FileNodeIF getFileNode(File file) {
		return files.get(file);
	}

	@Override
	public void setRootNode(RootNodeIF mRootNode) {
		rootNode = mRootNode;
	}

	@Override
    public RootNodeIF rootNode() {
        return rootNode;
    }
	
	@Override
    public long numberOfNodes() {
		return countNodes(rootNode);
    }

	@Override
	public void print(PrintWriter out) {
		rootNode().print("",out);
	}

	private int countNodes(ASTNodeIF node) {
		if (node == null) {
			return 0;
		}

		int retVal = 1;
		Iterator<ASTNodeIF> it = node.children();
		while (it.hasNext()) {
			retVal += countNodes(it.next());
		}
		return retVal;
	}
}