P4.java

import java.io.*;
import java.util.*;
import org.xml.sax.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.sax.*;
import javax.xml.transform.stream.*;

/**
Build and output a DOM tree.
*/
public class P4
{
    public static void main(String[] argv)
    {
        String topdir = "D:/CIS370/Web/demo/";
        try {
            // Create a new DOM document.
            DocumentBuilderFactory factory = 
                DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = 
                factory.newDocumentBuilder();
            Document doc = 
                builder.newDocument();

            // Build a DOM tree describing a directory hierarchy.
            Element root = doc.createElement("root");
            root.setAttribute("name",topdir);
            doc.appendChild(root);
            File f = new File(topdir);
            if (f.exists() && f.isDirectory())
                oneLevel(doc,root,f);
            else
                System.out.println("Can't find root.");

            // Spit out this DOM as an HTML file.
            File styleSheet = new File("P4.xsl");
            StreamSource styleSource = new StreamSource(styleSheet);
            Transformer t = 
                TransformerFactory.
                    newInstance().
                        newTransformer(styleSource);
            t.transform(new DOMSource(doc),
                new StreamResult(
                    new FileOutputStream(
                        new File("P4.html"))));
            }
        catch (Exception e) {
            e.printStackTrace();
            }
    }

    /**
    Recursively generate a DOM tree describing a directory hierarchy.
    */
    private static void oneLevel(Document doc,Element node,File f)
    {
        if (f.isDirectory()) {
            File[] files = f.listFiles();
            Element e = doc.createElement("directory");
            e.setAttribute("name",f.getName());
            node.appendChild(e);
            for (int i=0; i<files.length; i++)
                oneLevel(doc,e,files[i]);
            }
        else {
            Element e = doc.createElement("file");
            e.setAttribute("name",f.getName());
            e.setAttribute("length",
                (new Long(f.length()).toString()));
            node.appendChild(e);
            }
    }
}