def __init__(self, xml_content):
    """Inicializador que instancia um objeto de alguma classe "concreta"
       relacionada ao Freemind.

       Argumentos
       -----------

       xml_content é o conteúdo do mapa mental em formato string.

       Exceções
       ---------

       UnsupportedVersionException - lançada caso nenhuma classe dê suporte à
       versão do Freemind utilizada para criar o mapa mental. A checagem de
       suporte à versão precisa ser repetida neste nível porque pode haver um
       esquema RelaxNG, mas as operações podem não estar implementadas na
       hierarquia de classes do gerador.

    """
    base_class = BaseFreemind(xml_content)
    self._map_version = base_class.extract_map_version()

    try:
      cls_object = self._search_concrete_class()
      self._freemind_instance = cls_object(xml_content)

    except UnsupportedVersionException, exception:
      raise exception.__class__(exception.message)
  def _extract_graph_node_attributes(self, xml_node):
    """Retorna os dados que devem ser atribuídos a um nó no grafo.

       Argumentos
       -----------

       xml_node é o nó a ser analisado.

    """
    # Para saber como extrair os dados do nó é necessário conhecer seu tipo.
    node_type = BaseFreemind.guess_node_type(xml_node)
    node_data = None

    if node_type == LinkNode.TYPE:
      node_data = GenericNode.has_structure(BaseFreemind.extract_node_text(xml_node), LinkNode.GLOBAL_STRUCTURE).groupdict()
    elif node_type == InfoNode.TYPE:
      node_data = GenericNode.has_structure(BaseFreemind.extract_node_text(xml_node), InfoNode.GLOBAL_STRUCTURE).groupdict()
    else:
      node_data = GenericNode.has_structure(BaseFreemind.extract_node_text(xml_node), StepNode.GLOBAL_STRUCTURE).groupdict()
      node_data['notes'] = self._freemind_instance.extract_comments(xml_node)

    return node_data
  def build_graphs(self):
    """Constrói um grafo para cada cenário/caso de uso existente no mapa mental."""
    self._graph_list = []
    scenario_list = self._freemind_instance.extract_scenarios()

    for scenario in scenario_list:
      # Extrai os dados do caso de uso para adicionar como dados do primeiro nó do grafo.
      scenario_data = GenericNode.has_structure(BaseFreemind.extract_node_text(scenario), UCNode.GLOBAL_STRUCTURE)

      # Cria o grafo, adicionando os dados do cenário/caso de uso no primeiro
      # nó (raiz) e adiciona os demais nós recursivamente, utilizando busca em
      # profundidade.
      self._graph_list.append(ScenarioGraph(scenario_data.groupdict()))
      self._depth_first_builder(scenario, self._graph_list[-1], 0)