package com.kdgregory.example.xml.builder;

import java.io.StringWriter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;


public class DomBased
{
    public static void main(String[] argv)
    throws Exception
    {
        DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = db.newDocument();
        Element root = doc.createElement("albums");
        doc.appendChild(root);

        appendEntry(root, "Anderson, Laurie", 
                    "Big Science", "Home of the Brave", "Strange Angels");
        appendEntry(root, "Fine Young Cannibals",
                    "The Raw & The Cooked");

        System.out.println(generateXML(doc));
    }


    public static void appendEntry(Element root, String artist, String... albums)
    {
        Document doc = root.getOwnerDocument();
        Element eArtist = doc.createElement("artist");
        root.appendChild(eArtist);
        eArtist.setAttribute("name", artist);
        for (String album : albums)
        {
            Element eAlbum = doc.createElement("album");
            eArtist.appendChild(eAlbum);
            Text tAlbum = doc.createTextNode(album);
            eAlbum.appendChild(tAlbum);
        }
    }


    public static String generateXML(Document doc)
    throws Exception
    {
        StringWriter out = new StringWriter();
        Transformer xform = TransformerFactory.newInstance().newTransformer();
        xform.setOutputProperty(OutputKeys.INDENT, "yes");
        xform.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
        xform.transform(new DOMSource(doc), new StreamResult(out));
        return out.toString();
    }
}
