@Override
 public void close() throws IOException {
   try {
     if (xmlWriter != null) xmlWriter.close();
   } catch (XMLStreamException ignore) {
   } finally {
     super.close();
   }
 }
  private void processAggregatedMessage(Message aggregatedMessage, Message currentMessage) {
    long avRunTime = aggregatedMessage.getRunTime() / aggregatedMessage.getRunNum();
    long avStartTime =
        (aggregatedMessage.getStartTime()
                + (currentMessage.getStartTime() + currentMessage.getRunTime()))
            / 2; // first message start time + last message end time / 2

    Message writenMessage =
        new Message(
            aggregatedMessage.getThreadName(),
            200,
            aggregatedMessage.getRunNum(),
            avStartTime,
            avRunTime,
            currentMessage.getConcurrentConnections());
    writer.writeStats(writenMessage);
    // we need to now actually write this averaged value out

  }
  @Override
  public void close() throws WriterException {
    // flush all remaining aggregated messages

    List<Entry<String, Message>> entries =
        new ArrayList<Entry<String, Message>>(aggregatedMap.entrySet());
    Collections.sort(
        entries,
        new Comparator<Entry<String, Message>>() {

          @Override
          public int compare(Entry<String, Message> o1, Entry<String, Message> o2) {
            return (int) (o1.getValue().getStartTime() - o2.getValue().getStartTime());
          }
        });

    for (Entry<String, Message> entry : entries) {
      processAggregatedMessage(entry.getValue(), entry.getValue());
    }
    aggregatedMap.clear();
    writer.close();
  }