import org.jdom.*;
import org.jdom.input.SAXBuilder;
import org.jdom.input.DOMBuilder;
import org.jdom.output.*;
import java.util.*;

public class JDOMCount {

  public static void main(String[] args) {
    if (args.length == 0) {
      System.out.println("Usage: java Count URL");
    }

    SAXBuilder saxBuilder = new SAXBuilder();
    DOMBuilder domBuilder = new DOMBuilder();
    System.out.println("File\tElements\tAttributes\tComments\tProcessing Instructions\tCharacters");

    // start parsing...
    try {
     Document jdomDocument = saxBuilder.build(args[0]);
     DOMOutputter domOutputter = new DOMOutputter();
    
     /* Test getting DOM Document from JDOM Document
     org.w3c.dom.Document domDocument = domOutputter.output(doc); */

     // Test getting DOM Element from JDOM Element
     org.w3c.dom.Element domElement = domOutputter.output(jdomDocument.getRootElement());
 
     // Test getting JDOM Element from DOM Element
     org.jdom.Element jdomElement = domBuilder.build(domElement);
    
     count(jdomElement);
    } catch (JDOMException e) { // indica doc mal formado u otro error
     System.out.println("Documento XML mal formado o incorrecto.");
     System.out.println(e.getMessage());
    }
  }

  private static int numCharacters = 0;
  private static int numComments = 0;
  private static int numElements = 0;
  private static int numAttributes = 0;
  private static int numProcessingInstructions = 0;

  public static String count(Document doc) {
    numCharacters = 0;
    numComments = 0;
    numElements = 0;
    numAttributes = 0;
    numProcessingInstructions = 0;

    List children = doc.getMixedContent();
    Iterator iterator = children.iterator();

    while (iterator.hasNext()) {
      Object o = iterator.next();
      if (o instanceof Element) {
        numElements++;
        count((Element) o);
      }
      else if (o instanceof Comment) numComments++;
      else if (o instanceof ProcessingInstruction)
        numProcessingInstructions++;
    }
    String result = numElements + "\t" + numAttributes + "\t" +
    numComments + "\t" + numProcessingInstructions + "\t" + numCharacters;

    return result;
  }

  public static void count(Element element) {
    List attributes = element.getAttributes();
    numAttributes += attributes.size();
    List children = element.getMixedContent();
    Iterator iterator = children.iterator();

    while (iterator.hasNext()) {
      Object o = iterator.next();
      if (o instanceof Element) {
        numElements++;
        count((Element) o);
      }
      else if (o instanceof Comment) numComments++;
      else if (o instanceof ProcessingInstruction)
        numProcessingInstructions++;
      else if (o instanceof String) {
        String s = (String) o;
        numCharacters += s.length();
      }
    }
    String result = numElements + "\t" + numAttributes + "\t" +
    numComments + "\t" + numProcessingInstructions + "\t" + numCharacters;
    System.out.println(result);
  }
}
