import java.util.ArrayList;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Text;

/**
   Builds a DOM document for an array list of items.
*/
public class ItemListBuilder
{
   /**
      Constructs an item list builder.
   */
   public ItemListBuilder() 
      throws ParserConfigurationException
   {
      DocumentBuilderFactory factory 
         = DocumentBuilderFactory.newInstance();
      builder = factory.newDocumentBuilder();
   }

   /**
      Builds a DOM document for an array list of items.
      @param items the items
      @return a DOM document describing the items
   */
   public Document build(ArrayList items)
   {
      doc = builder.newDocument();
      Element root = createItemList(items);
      doc.appendChild(root);
      return doc;
   }

   /**
      Builds a DOM element for an array list of items.
      @param items the items
      @return a DOM element describing the items
   */      
   private Element createItemList(ArrayList items)
   {      
      Element itemsElement = doc.createElement("items");
      for (int i = 0; i < items.size(); i++)
      {
         Item anItem = (Item)items.get(i);
         Element itemElement = createItem(anItem);
         itemsElement.appendChild(itemElement);
      }
      return itemsElement;
   }

   /**
      Builds a DOM element for an item.
      @param anItem the item
      @return a DOM element describing the item
   */
   private Element createItem(Item anItem)
   {      
      Element itemElement = doc.createElement("item");
      Element productElement 
         = createProduct(anItem.getProduct());
      Text quantityText = doc.createTextNode(
         "" + anItem.getQuantity());
      Element quantityElement = doc.createElement("quantity");
      quantityElement.appendChild(quantityText);

      itemElement.appendChild(productElement);
      itemElement.appendChild(quantityElement);
      return itemElement;
   }

   /**
      Builds a DOM element for a product.
      @param p the product
      @return a DOM element describing the product
   */
   private Element createProduct(Product p)
   {
      Text descriptionText 
         = doc.createTextNode(p.getDescription());
      Text priceText = doc.createTextNode("" + p.getPrice());

      Element descriptionElement 
         = doc.createElement("description");
      Element priceElement = doc.createElement("price");

      descriptionElement.appendChild(descriptionText);
      priceElement.appendChild(priceText);

      Element productElement = doc.createElement("product");

      productElement.appendChild(descriptionElement);
      productElement.appendChild(priceElement);

      return productElement;
   }

   private DocumentBuilder builder;
   private Document doc;
}
