public void parse() throws BadLocationException {

    final List<OutlineNodeDefinition<?>> nodeDefinitions =
        configuration.getAllOutlineLevelDefinitions();
    final List<ShowInOutlineInstruction> showInOutlineInstructions =
        configuration.getInstructions(ShowInOutlineInstruction.class);

    String entry = null, header = null;

    for (int lineNumber = 0; lineNumber < numberOfLines; lineNumber++) {

      IRegion region = document.getLineInformation(lineNumber);
      String line = getLine(document, region);

      if (line.equals(MyContentOutlinePage.CONFIG_MARKER) || hasConfigSection) {
        onConfigLine(lineNumber, line, region);
        continue;
      }

      if (ParsingUtils.isLogEntryStart(line)) {
        header = line;
        entry = ParsingUtils.getLogEntry(document, lineNumber);
      }

      onAnyLine(lineNumber, line, entry, header, region);
      if (ParsingUtils.isLogEntryStart(line)) {
        onLogEntryLine(lineNumber, line, entry, region);
      }

      if (showInOutline(showInOutlineInstructions, line, entry, header)) {
        for (OutlineNodeDefinition<?> nodeDefinition : nodeDefinitions) {
          OutlineNodeContent content =
              nodeDefinition.recognize(lineNumber, line, entry, header, region, document);
          if (content != null) {
            @SuppressWarnings({"unchecked", "rawtypes"})
            OutlineNode<?> node =
                new OutlineNode(nodeDefinition, content, region, lineNumber, line, document);
            outlineNodesMap.put(lineNumber, node);
          }
        }
      }
    }

    sortOutlineNodes();
    dumpInfoToConfigSection();
  }