public static void main(String args[]) throws IOException, Exception {
    PhysicalGameState pgs = MapGenerator.basesWorkers8x8Obstacle();
    GameState gs = new GameState(pgs, UnitTypeTable.utt);
    int MAXCYCLES = 5000;
    boolean gameover = false;

    AI ai1 = new RandomBiasedAI();
    AI ai2 = new WorkerRush(UnitTypeTable.utt, new BFSPathFinding());

    Trace trace = new Trace();
    TraceEntry te = new TraceEntry(gs.getPhysicalGameState().clone(), gs.getTime());
    trace.addEntry(te);

    do {
      PlayerAction pa1 = ai1.getAction(0, gs);
      PlayerAction pa2 = ai2.getAction(1, gs);
      gs.issueSafe(pa1);
      gs.issueSafe(pa2);

      if (!pa1.isEmpty() || !pa2.isEmpty()) {
        te = new TraceEntry(gs.getPhysicalGameState().clone(), gs.getTime());
        te.addPlayerAction(pa1);
        te.addPlayerAction(pa2);
        trace.addEntry(te);
      }

      // simulate:
      gameover = gs.cycle();
    } while (!gameover && gs.getTime() < MAXCYCLES);

    te = new TraceEntry(gs.getPhysicalGameState().clone(), gs.getTime());
    trace.addEntry(te);

    XMLWriter xml = new XMLWriter(new FileWriter("trace.xml"));
    trace.toxml(xml);
    xml.flush();
  }
  @SuppressWarnings("static-access")
  public void process(
      String APP_NAME,
      String PARTIAL_PATH,
      long beginFecha,
      long endFecha,
      String OUTPUT,
      String frequency,
      PropertiesLoader pl,
      ExportNodes2XML exportNodes2XML)
      throws Exception {

    Utils utils = new Utils();

    XMLWriter xmlWriter = new XMLWriter();

    String FINAL_PATH, FINAL_METRIC_PATH = "";

    Document doc = null;

    int filesCount = 0;

    List<Tier> tiers =
        utils
            .getConnection(pl.CONTROLER, pl.PORT, pl.USER, pl.PASSWD, pl.ACCOUNT)
            .getTiersForApplication(APP_NAME)
            .getTiers();

    log.log(
        Level.INFO,
        "--------------------------- Processing tiers ------------------------------- ");

    log.log(Level.INFO, "Processing {0} tiers in loop.", tiers.size());

    for (Tier tier : tiers) {

      log.log(
          Level.INFO,
          "--------------------------- Processing {0} tier ------------------------------- ",
          tier.getName());

      try {
        doc = xmlWriter.initDocument();

        FINAL_PATH =
            OUTPUT
                .concat(System.getProperty("file.separator"))
                .concat(APP_NAME.concat("_"))
                .concat(tier.getName())
                .trim()
                .concat(".xml");

        FINAL_METRIC_PATH = PARTIAL_PATH.concat(tier.getName()).concat("|");

        Element element =
            xmlWriter.appendCommonValues(
                APP_NAME, tier.getName(), doc, beginFecha, endFecha, frequency);

        Element summary_element = doc.createElement("summary_data");

        for (Metrics metric : metrics)
          try {
            utils.exportData2XMLGenericMetricQuery(
                APP_NAME,
                FINAL_METRIC_PATH.concat(metric.getDescription()),
                beginFecha,
                endFecha,
                utils.getConnection(pl.CONTROLER, pl.PORT, pl.USER, pl.PASSWD, pl.ACCOUNT),
                xmlWriter,
                doc,
                summary_element,
                metric.getDescription());
          } catch (EmptyDataException e) {
            log.log(
                Level.SEVERE,
                "Couldn't excecute metric query : "
                    + FINAL_METRIC_PATH.concat(metric.getDescription()));
            break;
          }

        element.appendChild(summary_element);

        Element tier_datas = doc.createElement("tier_datas");

        for (Metrics metric : metrics)
          utils.exportData2XMLGenericMetricQueryFullInfo(
              APP_NAME,
              FINAL_METRIC_PATH.concat(metric.getDescription()),
              beginFecha,
              endFecha,
              utils.getConnection(pl.CONTROLER, pl.PORT, pl.USER, pl.PASSWD, pl.ACCOUNT),
              xmlWriter,
              doc,
              tier_datas,
              metric.getDescription());

        element.appendChild(tier_datas);

        xmlWriter.appendNodesData(
            doc,
            utils
                .getConnection(pl.CONTROLER, pl.PORT, pl.USER, pl.PASSWD, pl.ACCOUNT)
                .getNodesFromTier(APP_NAME, tier.getName())
                .getNodes());

        xmlWriter.saveAndClose(doc, FINAL_PATH.trim());

        log.log(Level.INFO, "File {0} was created successfully.", FINAL_PATH.trim());

        // export Nodes Info
        exportNodes2XML.process(
            APP_NAME, tier.getName(), PARTIAL_PATH, beginFecha, endFecha, OUTPUT, frequency, pl);

        filesCount++;

      } catch (Exception e) {

        log.log(Level.SEVERE, "ERROR to create xml file for Tier : " + tier.getName() + e);

        throw new Exception("ERROR to create xml file for Tier : " + tier.getName() + e);
      }
    }

    if (tiers.size() == filesCount)
      log.log(Level.FINE, " {0} Tier files were created.", filesCount);
    else {
      Object[] objs = {filesCount, tiers.size()};
      log.log(Level.SEVERE, " {0} Tier files were created from {1}.", objs);
    }

    log.log(
        Level.INFO,
        "--------------------------- End of tiers block ------------------------------- ");
  }