import org.jdom.*;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import java.util.List;
import java.util.Iterator;
import java.util.ArrayList;
import java.io.IOException;

public class Node
{
  private String _name;
  private ArrayList<Node> _kids;
  private boolean _isRoot = false;
  private Content _xmlContent;

  private static XMLOutputter o = new XMLOutputter(Format.getPrettyFormat());

  public Node (String name)
  {
    _name = name;
  }

  public String name ()
  {
    return _name;
  }

  public ArrayList<Node> kids ()
  {
    return _kids;
  }

  public boolean isRoot ()
  {
    return _isRoot;
  }

  public Node makeRoot ()
  {
    _isRoot = true;
    return this;
  }

  public boolean isLeaf ()
  {
    return _kids == null;
  }

  public Node add (Node node)
  {
    if (_kids == null)
      _kids = new ArrayList<Node>();

    _kids.add(node);
    return this;
  }

  public Content xmlify ()
  {
    System.out.println("----> xmlifying: "+_name);
    
    if (_xmlContent == null)
      if (isLeaf())
	_xmlContent = new Text(_name);
      else
	{
	  _xmlContent = new Element(_name);
	  for (Iterator<Node> i=_kids.iterator(); i.hasNext();)
	    ((Element)_xmlContent).addContent(i.next().xmlify());
	}

    return _xmlContent;
  }

  public void writeXml () throws IOException
    {
      o.output((Element)xmlify(),System.out);
      System.out.println();
    }

  public String toString ()
  {
    return toString(0);
  }

  public String toString (int margin)
  {
    String s = margin == 0 ? "" : "\n";
    
    for (int i=0; i<margin; i++)
      s += " ";

    s += _name;
    
    if (!isLeaf())
      for (Iterator<Node> i=_kids.iterator(); i.hasNext();)
	s += i.next().toString(margin+3);

    return s;
  }  
}
