package wyklad_pl;
/*
 * Created on 2004-11-29
 */
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.namespace.QName;
import javax.xml.stream.FactoryConfigurationError;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

/**
 * @author Patryk Czarnik
 */
public class LiczbyStax2 {
  private XMLEventReader fReader;

  public static void main(String[] args) {
    LiczbyStax2 app = new LiczbyStax2();
    app.run(args);
  }
  
  public void run(String[] args) {
    if(args.length < 1) {
      System.out.println("Za malo parametrow");
      return;
    }
    
    int result = 0;
    
    try {
      XMLInputFactory factory = XMLInputFactory.newInstance();
      if(factory.isPropertySupported("javax.xml.stream.isValidating"))
        factory.setProperty("javax.xml.stream.isValidating", Boolean.FALSE);
      else
        System.out.println("walidacja nieobslugiwana");
      fReader = factory.createXMLEventReader(new FileInputStream(args[0]));
      
      while(fReader.hasNext()) {
        XMLEvent event = fReader.nextEvent();
        if(event.isStartElement()) {
          StartElement event_se = event.asStartElement(); 
          if("grupa".equals(event_se.getName().getLocalPart())) {
            Attribute attr = event_se.getAttributeByName(new QName(null, "wazne"));
            if(attr != null && "tak".equals(attr.getValue())) {
              result += this.processGroup();
            }
          }
        }
      }
      fReader.close();
    } catch (IllegalArgumentException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (FileNotFoundException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (FactoryConfigurationError e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    } catch (XMLStreamException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
    System.out.println("Result: "+result);
  }

  private int processGroup() throws XMLStreamException {
	int result = 0;
	
    while(fReader.hasNext()) {
      XMLEvent event = fReader.nextEvent();
      switch(event.getEventType()) {
      case XMLStreamConstants.START_ELEMENT :
        if("l".equals(event.asStartElement().getName().getLocalPart())) {
         String val = fReader.getElementText();
            try {
              result += Integer.parseInt(val);
            } catch (NumberFormatException e) {
              System.err.println("Błąd formatu liczby: "+val);
            }
          }
      break;
      case XMLStreamConstants.END_ELEMENT :
        if("grupa".equals(event.asEndElement().getName().getLocalPart())) {
        	return result;
        }
      break;
      }
    }
    return result;
  }
}
