/** ***************************************************************************** */
  synchronized boolean handleTestState(Element e) {
    boolean chng = false;

    class_name = IvyXml.getAttrString(e, "CLASS");
    method_name = IvyXml.getAttrString(e, "METHOD");
    test_name = IvyXml.getAttrString(e, "NAME");
    test_class = IvyXml.getAttrString(e, "TCLASS");

    TestStatus osts = test_status;
    TestState ost = test_state;

    boolean ignore = false;
    annotation_types.clear();
    for (Element ane : IvyXml.children(e, "ANNOT")) {
      String ant = IvyXml.getText(ane);
      annotation_types.add(ant);
      if (ant.startsWith("@org.junit.Ignore")) ignore = true;
    }
    if (IvyXml.getAttrBool(e, "EMPTY")) ignore = true;

    String sts = IvyXml.getAttrString(e, "STATUS");
    if (sts.equals("FAILURE")) {
      test_status = TestStatus.FAILURE;
      if (test_state == TestState.RUNNING || test_state == TestState.UNKNOWN)
        test_state = TestState.UP_TO_DATE;
    } else if (sts.equals("SUCCESS")) {
      test_status = TestStatus.SUCCESS;
      if (test_state == TestState.RUNNING || test_state == TestState.UNKNOWN)
        test_state = TestState.UP_TO_DATE;
    } else {
      if (ignore) test_state = TestState.IGNORED;
      test_status = TestStatus.UNKNOWN;
      count_data = null;
    }
    if (osts != test_status) chng = true;

    if (test_status == TestStatus.FAILURE) {
      String omsg = fail_message;
      fail_message = IvyXml.getTextElement(e, "EXCEPTION");
      fail_trace = IvyXml.getTextElement(e, "TRACE");
      if (fail_trace != null && fail_message == null) {
        int idx = fail_trace.indexOf("\n");
        if (idx < 0) fail_message = fail_trace;
        else fail_message = fail_trace.substring(0, idx);
      }
      if (omsg == null && fail_message != null) chng = true;
      else if (omsg != null && fail_message == null) chng = true;
      else if (omsg != null && !omsg.equals(fail_message)) chng = true;
    } else {
      fail_message = null;
      fail_trace = null;
    }

    String st = IvyXml.getAttrString(e, "STATE");
    if (st != null) {
      try {
        test_state = TestState.valueOf(st);
      } catch (IllegalArgumentException ex) {
      }
    }

    if (ost != test_state) chng = true;

    Element xe = IvyXml.getChild(e, "COVERAGE");
    if (xe != null) count_data = new CountData(xe);

    if (chng) update();

    return chng;
  }