/**
  * Retorna uma lista de permissoes a partir de um usuario. Caso seja um superusuario retornar
  * todas as permissoes. Casa seja nao seja superusuario, retornar as permissoes dos perfis dele.
  *
  * @param usuario
  * @return
  */
 public List getPermissoes(Usuario usuario) {
   List<Permissao> permissoes = new ArrayList<Permissao>();
   if (usuario != null) {
     if (usuario.isSuperUsuario()) {
       permissoes = permissaoDAO.getTodasPermissoesComFilhos();
     } else {
       permissoes = permissaoDAO.getPermissoesComFilhos(usuario);
     }
   }
   permissoes = getChildren(permissoes);
   return permissoes;
 }
  /**
   * Cria um relatorio
   *
   * @param dataSource lista de objetos que criarao o data source do relatorio
   * @param parameters map de parametros a serem adicionados no relatorio
   * @param path caminho do relatorio
   * @param fileName Nome do Arquivo gerado
   * @param template Caminho do template (ao informar o template o reltorio sera inserido como
   *     subrelatorio do template)
   * @param usuario usuario que sera passado por parametro ao relatorio
   * @param entityManager
   */
  public static void createJasperReport(
      List dataSource,
      Map parameters,
      String path,
      String fileName,
      String template,
      Usuario usuario,
      EntityManager entityManager) {
    PartialViewContext partialViewContext =
        FacesContext.getCurrentInstance().getPartialViewContext();

    // verificar se eh requisicao ajax, caso seja, informar warning
    if (partialViewContext != null && partialViewContext.isAjaxRequest()) {
      logger.warning(
          "Relatorio sendo gerado a partir de uma requisicao ajax. Uma requisicao Ajax nao gera download de arquivos, para isso coloque ajax='false'.");
    }

    if (parameters == null) {
      parameters = new HashMap();
    }

    String logo = FacesContext.getCurrentInstance().getExternalContext().getRealPath(LOGO);
    if (new File(logo).exists()) {
      parameters.put("logo", logo);
    } else {
      logger.warning("Logo do nao encontrado no caminho " + LOGO);
      parameters.put("logo", null);
    }

    // parametros padrao do relatorio
    parameters.put(
        REPORT_PATH, FacesContext.getCurrentInstance().getExternalContext().getRealPath(path));
    parameters.put("usuario", usuario.getNome());
    parameters.put("ip", FacesUtils.getIP());
    parameters.put(JRParameter.REPORT_LOCALE, I18N.getLocale());
    parameters.put("titulo", TITULO);
    parameters.put("subtitulo", SUBTITULO);

    try {
      // criar do template deve ser inserido o data source nos parametros
      if (template != null && !template.trim().isEmpty()) {
        parameters.put(
            "REPORT_DATA_SOURCE_CLONE", new JRBeanCollectionDataSource(dataSource, entityManager));
        FacesJasper.createJasperReport(null, parameters, template, fileName, entityManager);
      } else {
        FacesJasper.createJasperReport(dataSource, parameters, path, fileName, entityManager);
      }
    } catch (Exception ex) {
      throw new RuntimeException(ex);
    }
  }