@Override
  public String toString() {

    String ret = "";

    for (int i = 0; i < kloFiles.size(); i++) {
      KloFile kloFile = kloFiles.get(i);
      ret += "Error n�" + (i + 1) + " " + kloFile.toString();
    }

    return ret;
  }
  public KloReport parse(final File file) throws IOException {

    if (file == null) {
      throw new IllegalArgumentException("File input is mandatory.");
    }

    if (!file.exists()) {
      throw new IllegalArgumentException("File input " + file.getName() + " must exist.");
    }

    KloReport report = new KloReport();

    List<ValidationError> list = KlocworkModel.OUTPUT_KLOCWORK_9_2.validate(file);
    if (!list.isEmpty()) {
      StringBuilder sb = new StringBuilder("XML Validation failed. See errors below :\n");
      for (ValidationError val : list) {
        sb.append(val.toString()).append("\n");
      }
      throw new IllegalArgumentException(sb.toString());
    }

    try {

      ErrorList errList = getErrorList(file);
      List<KloFile> lowSeverities = new ArrayList<KloFile>();
      List<KloFile> highSeverities = new ArrayList<KloFile>();
      List<KloFile> errors = new ArrayList<KloFile>();
      int i = 0;
      for (Problem problem : errList.getProblem()) {
        KloFile kloFile;
        kloFile = new KloFile();
        kloFile.setKey(i + 1);

        /** Using reflection to get the tags' name and value and to put them in kloFile map */
        for (Field f : problem.getClass().getDeclaredFields()) {
          f.setAccessible(true);
          try {
            String name = f.getName();
            Object value = f.get(problem);
            if (value != null) {
              String valueToString = value.toString();
              // Changing the default value returned by Object.toString() by an empty value
              if (valueToString.startsWith("com.thalesgroup.hudson.plugins.klocwork.model")
                  && valueToString.contains("@")) {
                kloFile.store(name, "");
              } else {
                kloFile.store(name, valueToString);
              }

              // Treating the trace tag
              if (name.equals("trace")) {
                Trace trace = (Trace) value;
                for (TraceBlock tracelt : trace.getTraceBlock()) {

                  kloFile.addTraceBlock(
                      tracelt.getFile(), tracelt.getMethod(), tracelt.getName(), tracelt.getId());

                  for (TraceLine traceLinelt : tracelt.getTraceLine()) {

                    // Element traceLinelt = (Element) listTraceLine.get(k);
                    String refId = null;
                    if (problem.getRefID() != null
                        && (refId = problem.getRefID().toString()) != null) {
                      kloFile.addTraceLine(
                          tracelt.getId(),
                          traceLinelt.getLine(),
                          traceLinelt.getText(),
                          traceLinelt.getType().charAt(0),
                          Integer.parseInt(refId));
                    } else {
                      kloFile.addTraceLine(
                          tracelt.getId(),
                          traceLinelt.getLine(),
                          traceLinelt.getText(),
                          traceLinelt.getType().charAt(0));
                    }
                  }
                }
              }
            }
          } catch (IllegalArgumentException e) {
            e.printStackTrace();
          } catch (IllegalAccessException e) {
            e.printStackTrace();
          }
          f.setAccessible(false);
        }
        // Adding a new entry in the map corresponding to the file name without its path
        String fileName = kloFile.get("file");
        String fileNameWithoutPath = extractFileName(fileName, "\\");
        if (fileName.equals(fileNameWithoutPath)) {
          fileNameWithoutPath = extractFileName(fileName, "/");
        }
        kloFile.store("fileNameOnly", fileNameWithoutPath);

        if (Integer.parseInt((String) kloFile.get("severitylevel")) > 3) {
          highSeverities.add(kloFile);
        } else {
          lowSeverities.add(kloFile);
        }

        errors.add(kloFile);

        agregateMap.put(kloFile.getKey(), kloFile);

        kloFiles.add(kloFile);

        i++;
      }

      if (!lowSeverities.isEmpty()) {
        report.setLowSeverities(lowSeverities);
      }

      if (!highSeverities.isEmpty()) {
        report.setHighSeverities(highSeverities);
      }

      report.setErrors(errors);

    } catch (JAXBException e) {
      e.printStackTrace();
    }

    return report;
  }