/**
   * Obtém a hierarquia superior da opção desejada (incluindo ela)
   *
   * @param objAtributoTalentoOpcao Opção de atributo de talento desejada
   * @return List Contendo os registros
   * @throws CDException se ocorrer algum erro relacionado ao negócio
   */
  public List obterAtributoTalentoOpcaoHierarquiaSuperior(
      AtributoTalentoOpcao objAtributoTalentoOpcao) throws CDException {
    if (log.isDebugEnabled()) {
      log.debug("Entrada no metodo");
    }

    // Instancia DAO e obtém o registro pela chave
    AtributoTalentoOpcaoDAO objAtributoTalentoOpcaoDAO = new AtributoTalentoOpcaoDAO();
    AtributoTalentoOpcaoFacade objAtributoTalentoOpcaoFacade = new AtributoTalentoOpcaoFacade();
    List lstAtributoTalentoOpcoesHierarquiaSuperior = new ArrayList();
    try {
      objAtributoTalentoOpcao =
          (AtributoTalentoOpcao)
              objAtributoTalentoOpcaoDAO.obterPelaChave(
                  String.valueOf(objAtributoTalentoOpcao.getIdentificador()));
      lstAtributoTalentoOpcoesHierarquiaSuperior =
          objAtributoTalentoOpcaoFacade.obterHierarquiaSuperior(objAtributoTalentoOpcao);
      lstAtributoTalentoOpcoesHierarquiaSuperior.add(objAtributoTalentoOpcao);

    } catch (Exception daoe) {
      CDException.dispararExcecao(daoe);
    } finally {
      DAO.desconectar();
    }
    return lstAtributoTalentoOpcoesHierarquiaSuperior;
  }
  /**
   * Obtém as opções de um determinado atributo talento
   *
   * @param objAtributoTalento Atributo de talento desejado
   * @return List Contendo os registros
   * @throws CDException se ocorrer algum erro relacionado ao negócio
   */
  public List obterOpcoesAtributoTalento(AtributoTalento objAtributoTalento) throws CDException {
    if (log.isDebugEnabled()) {
      log.debug("Entrada no metodo");
    }

    // Instancia DAO
    AtributoTalentoOpcaoDAO objAtributoTalentoOpcaoDAO = new AtributoTalentoOpcaoDAO();
    List lstAtributoTalentoOpcoes = null;
    try {
      lstAtributoTalentoOpcoes =
          objAtributoTalentoOpcaoDAO.obterPorAtributoTalento(objAtributoTalento);
    } catch (Exception daoe) {
      CDException.dispararExcecao(daoe);
    } finally {
      DAO.desconectar();
    }
    return lstAtributoTalentoOpcoes;
  }
  /**
   * Obtém as opções filhas de determinada opção pai
   *
   * @param objAtributoTalento Atributo de talento desejado
   * @return List Contendo os registros
   * @throws CDException se ocorrer algum erro relacionado ao negócio
   */
  public List obterOpcoesPeloPai(AtributoTalentoOpcao objAtributoTalentoOpcaoPai)
      throws CDException {
    if (log.isDebugEnabled()) {
      log.debug("Entrada no metodo");
    }

    // Instancia DAO e obtém o registro pela chave
    AtributoTalentoOpcaoDAO objAtributoTalentoOpcaoDAO = new AtributoTalentoOpcaoDAO();
    List lstAtributoTalentoOpcoes = null;
    try {
      lstAtributoTalentoOpcoes =
          objAtributoTalentoOpcaoDAO.obterPeloPai(objAtributoTalentoOpcaoPai);
    } catch (DAOException daoe) {
      throw new CDException(daoe);
    } finally {
      DAO.desconectar();
    }
    return lstAtributoTalentoOpcoes;
  }
  /**
   * Obtém uma opção de talento a partir da chave
   *
   * @param strChave Chave do registro a ser obtido
   * @return AtributoTalentoOpcao POJO representando o registro obtido
   * @throws CDException se ocorrer algum erro relacionado ao negócio
   */
  public AtributoTalentoOpcao obterAtributoTalentoOpcaoPelaChave(String strChave)
      throws CDException {
    if (log.isDebugEnabled()) {
      log.debug("Entrada no metodo");
    }

    // Instancia DAO e obtém o registro pela chave
    AtributoTalentoOpcaoDAO objAtributoTalentoOpcaoDAO = new AtributoTalentoOpcaoDAO();
    AtributoTalentoOpcao objAtributoTalentoOpcao = null;
    try {
      objAtributoTalentoOpcao =
          (AtributoTalentoOpcao) objAtributoTalentoOpcaoDAO.obterPelaChave(strChave);
    } catch (Exception daoe) {
      CDException.dispararExcecao(daoe);
    } finally {
      DAO.desconectar();
    }
    return objAtributoTalentoOpcao;
  }
  private void incluirValoracoes(Talento objTalento, List lstAtributosTalentoValorados)
      throws CDException {
    // Declarações
    CategoriaAtributoTalentoDAO objCategoriaAtributoTalentoDAO = new CategoriaAtributoTalentoDAO();
    AtributoTalentoOpcaoDAO objAtributoTalentoOpcaoDAO = new AtributoTalentoOpcaoDAO();
    AtributoTalentoValoradoDAO objAtributoTalentoValoradoDAO = new AtributoTalentoValoradoDAO();

    try {

      // Inclui valorações
      Iterator itrAtributosTalentoValorados = lstAtributosTalentoValorados.iterator();
      while (itrAtributosTalentoValorados.hasNext()) {
        // Obtém valoração
        AtributoTalentoValorado objAtributoTalentoValorado =
            (AtributoTalentoValorado) itrAtributosTalentoValorados.next();

        // INICIO - Lucene no Banco de Talentos
        if (objAtributoTalentoValorado.getValoracao() == null
            || "".equals(objAtributoTalentoValorado.getValoracao())) {
          continue;
        }
        // FIM - Lucene no Banco de Talentos

        // Seta talento
        objAtributoTalentoValorado.setTalento(objTalento);

        // Obtém categoria/atributo relacionado
        CategoriaAtributoTalento objCategoriaAtributoTalento =
            (CategoriaAtributoTalento)
                objCategoriaAtributoTalentoDAO.obterPelaChave(
                    String.valueOf(
                        objAtributoTalentoValorado
                            .getCategoriaAtributoTalento()
                            .getIdentificador()));

        // INICIO - Lucene no Banco de Talentos
        objAtributoTalentoValorado.setCategoriaAtributoTalento(objCategoriaAtributoTalento);
        // Obtem o AtributoTalento correspondente a CategoriaAtributoTalento porque sera necessario
        // usar no Lucene depois
        // objCategoriaAtributoTalentoDAO.inicializarAtributoTalento(objAtributoTalentoValorado.getCategoriaAtributoTalento());
        // O codigo acima tambem nao funcionou, mas neste caso pode ser porque nem mesmo o id de
        // AtributoTalento estava na classe CategoriaAtributoTalento
        // Para resolver alterei o mapeamento e tornei o atributo AtributoTalento não lazy na classe
        // CategoriaAtributoTalento
        // FIM - Lucene no Banco de Talentos

        // Verifica o nome do atributo de talento
        String strNomeCampo;
        if (objCategoriaAtributoTalento.getApelido() == null
            || "".equals(objCategoriaAtributoTalento.getApelido())) {
          strNomeCampo = objCategoriaAtributoTalento.getAtributoTalento().getNome();
        } else {
          // TODO Analisar se deve prevalecer o código do Christian que está abaixo
          // strNomeCampo = objAtributoTalentoValorado.getCategoriaAtributoTalento().getApelido();

          strNomeCampo = objCategoriaAtributoTalento.getApelido();
        }

        // Trata atributo virtual
        if (GerenciadorAtributoVirtual.isAtributoVirtual(
            objCategoriaAtributoTalento.getAtributoTalento().getNome())) {
          // se for um atributo virtual já tem que ir direto para inclusão
        }
        // Verifica se a categoria/atributo recebido tem opções, e se tiver, cria o objeto
        // AtributoTalentoOpcao
        // e o relaciona, se não tiver, valida o tipo de dado
        else if ("U"
                .equals(
                    objCategoriaAtributoTalento
                        .getAtributoTalento()
                        .getTipoHTML()
                        .getMultiplicidade())
            || "M"
                .equals(
                    objCategoriaAtributoTalento
                        .getAtributoTalento()
                        .getTipoHTML()
                        .getMultiplicidade())) {
          if (objAtributoTalentoValorado.getValoracao() != null
              && !"".equals(objAtributoTalentoValorado.getValoracao())) {
            AtributoTalentoOpcao objAtributoTalentoOpcao = new AtributoTalentoOpcao();
            objAtributoTalentoOpcao.setIdentificador(
                Integer.valueOf(objAtributoTalentoValorado.getValoracao()));
            objAtributoTalentoOpcao =
                (AtributoTalentoOpcao)
                    objAtributoTalentoOpcaoDAO.obterPelaChave(
                        String.valueOf(objAtributoTalentoOpcao.getIdentificador()));
            objAtributoTalentoValorado.setAtributoTalentoOpcao(objAtributoTalentoOpcao);
            objAtributoTalentoValorado.setValoracao(objAtributoTalentoOpcao.getDescricao());
          }
        } else {
          // Valida o tipo de dado
          if ("T".equals(objCategoriaAtributoTalento.getAtributoTalento().getTipoDado())) {
            if (objCategoriaAtributoTalento.getAtributoTalento().getMascara() != null
                && !"".equals(objCategoriaAtributoTalento.getAtributoTalento().getMascara())
                && objAtributoTalentoValorado.getValoracao() != null
                && !"".equals(objAtributoTalentoValorado.getValoracao())) {
              if (!ExpressaoRegular.validar(
                  objCategoriaAtributoTalento.getAtributoTalento().getMascara(),
                  objAtributoTalentoValorado.getValoracao())) {
                throw new CDException("O atributo " + strNomeCampo + " deve ser numérico");
              }
            }
          }
          if ("N".equals(objCategoriaAtributoTalento.getAtributoTalento().getTipoDado())) {
            if (objAtributoTalentoValorado.getValoracao() != null
                && !"".equals(objAtributoTalentoValorado.getValoracao())
                && !Numero.validarNumero(objAtributoTalentoValorado.getValoracao())) {
              throw new CDException("O atributo " + strNomeCampo + " deve ser numérico");
            }
          }
          if ("D".equals(objCategoriaAtributoTalento.getAtributoTalento().getTipoDado())) {
            if (objAtributoTalentoValorado.getValoracao() != null
                && !"".equals(objAtributoTalentoValorado.getValoracao())
                && (objAtributoTalentoValorado.getValoracao().trim().length() != 10
                    || !DataNova.validarData(objAtributoTalentoValorado.getValoracao()))) {
              throw new CDException("O atributo " + strNomeCampo + " deve ser uma data válida");
            }
          }
        }

        // Inclui valoração
        objAtributoTalentoValoradoDAO.incluir(objAtributoTalentoValorado);

        // INICIO - Lucene no Banco de Talentos
        // Trata insercao no Lucene
        // Se der algum problema, a transacao no banco vai continuar e um log com o
        // erro no Lucene será gerado
        IndexaTalento idx = null;
        try {
          // Tenta excluir campos do tipo "D"ata e "N"umero
          // Nem sempre o tipo de dado esta preenchido
          if (objAtributoTalentoValorado
                      .getCategoriaAtributoTalento()
                      .getAtributoTalento()
                      .getTipoDado()
                  == null
              || "T"
                  .equals(
                      objAtributoTalentoValorado
                          .getCategoriaAtributoTalento()
                          .getAtributoTalento()
                          .getTipoDado())) {
            // Incluir no Lucene
            idx = IndexaTalento.getInstance();
            idx.addTalento(
                objTalento.getPessoa().getIdentificador().toString(),
                objAtributoTalentoValorado.getValoracao());
          }
        } catch (IOException e) {
          if (log.isErrorEnabled()) {
            log.error(e);
          }
        } finally {
          if (idx != null) {
            try {
              idx.close();
            } catch (Exception e) {
            }
          }
        }
        // FIM - Lucene no Banco de Talentos

      }
    } catch (Exception daoe) {
      DAO.desfazerTransacao();
      CDException.dispararExcecao(daoe);
    } finally {
      DAO.desconectar();
    }
  }