/**
   * Metodo sobreescrito encargado de generar el objeto de busqueda a partir de la informacion de la
   * request.
   *
   * @return Objeto de busqueda en base de datos
   */
  @Override
  protected ComunidadAutonomaQueryBean toQuery() {

    ComunidadAutonomaQueryBean comunidadAutonomaQueryBean = new ComunidadAutonomaQueryBean();

    comunidadAutonomaQueryBean.setId(RequestUtil.getLongParameter(this.getRequest(), "id", null));
    comunidadAutonomaQueryBean.setCodigo(
        RequestUtil.getStringParameter(this.getRequest(), "codigo", null));
    comunidadAutonomaQueryBean.setDescripcion(
        RequestUtil.getStringParameter(this.getRequest(), "descripcion", null));
    comunidadAutonomaQueryBean.setActivo(
        RequestUtil.getBooleanParameter(this.getRequest(), "activo", null));
    return comunidadAutonomaQueryBean;
  }
  /**
   * Peticiones asincronas para borrar una comunidad autonoma
   *
   * @param request peticion
   * @param response respuesta
   * @return Json con la respuesta a la peticion
   */
  @ResponseBody
  @RequestMapping(value = "/comunidadAutonoma/deleteComunidadAutonoma")
  public String deleteComunidadAutonoma(HttpServletRequest request, HttpServletResponse response) {
    String result = null;
    try {
      String id = RequestUtil.getStringParameter(request, "id");
      id = id.replace(' ', '+');
      String decId = new TimestampEncrypter().decryptAndValidate(id, 1000 * viewTimeout);

      comunidadAutonomaService.bajaComunidadAutonoma(
          Long.valueOf(decId), SecurityAccess.getUserInformation());

    } catch (CoreException e) {
      // Cuando se produce una excepción técnica, se presenta
      // al usuario un mensaje de error genérico, y el error
      // se registra en un log
      LOGGER.error("Error en la aplicacion", e);
      result = "ERROR " + e.getMessage();
    } catch (Exception e) {
      LOGGER.error("Error generico", e);
      if (e.getMessage() != null) {
        result = "ERROR " + e.getMessage();
      } else {
        result = "ERROR Error generico de la aplicación";
      }
    }
    return result;
  }
  /**
   * Peticiones para cargar la visualizacion de un registro.
   *
   * @param map Contenedor de informacion para la vista
   * @param request Peticion
   * @param personaForm Formulario con los datos de la vista
   * @return Componente tile al que se redirige
   */
  @RequestMapping(value = "/persona/startViewPersona")
  public String startViewOperadorJuego(
      Map<String, Object> map, HttpServletRequest request, PersonaForm personaForm) {

    LOGGER.debug("startViewPersona");

    try {
      request.getSession().setAttribute("buscarPersona", 1);
      String id = RequestUtil.getStringParameter(request, "idPersona");
      id = id.replace(' ', '+');
      String decId = new TimestampEncrypter().decryptAndValidate(id, 1000 * viewTimeout);

      PersonaQueryBean personaQueryBean = new PersonaQueryBean();
      personaQueryBean.setIdPersona(Long.valueOf(decId));

      PersonaBean personaBean = personaService.getPersonaById(Long.valueOf(decId));

      if (personaBean == null) {

        return "redirect:/app/persona/startPersona";
      }

      personaBeanToPersonaForm(personaForm, personaBean);

      request.getSession().setAttribute("persona", personaForm);

      if ((personaForm.getListaProhibiciones() != null)
          && (personaForm.getListaProhibiciones().size() > 0)) {
        request
            .getSession()
            .setAttribute("listaProhibiciones", personaForm.getListaProhibiciones());
      } else {
        request.getSession().setAttribute("listaProhibiciones", null);
      }

      personaForm.setDetalleProhibiciones(Utilidades.processProhibicionesList(personaForm));

      // Rellenando el map de la vista
      fillInitialMap(map, "personaForm");
    } catch (Exception e) {
      LOGGER.error(e.getMessage());
      return Constantes.ERRORPAGE;
    }

    return "tiles/showPersona";
  }
  /**
   * Peticion para exportar la etiqueta de una persona
   *
   * @param request Peticion
   * @param response Respuesta
   * @return Componente tile al que se redirige (si es correcta la generación del pdf se devuelve
   *     null)
   */
  @RequestMapping(value = "/persona/etiquetaPersona")
  public String etiquetaPersona(HttpServletRequest request, HttpServletResponse response) {

    // Generar el informe en formato Excel
    PersonaQueryBean personaQueryBean = new PersonaQueryBean();
    String idPersona = (String) RequestUtil.getStringParameter(request, "idPersona");
    personaQueryBean.setIdPersona(Long.valueOf(idPersona));

    String username = (String) SecurityAccess.getUserInformation().getUsername();
    String reportName = "etiquetasPersonasReport";
    String reportTitle =
        this.messageSource.getMessage("page.breadcrumb.persona", null, WebCoreUtils.getLocale());
    String reportType = "PDF";
    String fullReportName = null;
    String contentType = null;

    try {

      fullReportName = "etiquetaPersonaReport.pdf";
      contentType = "application/pdf";

      byte[] byteArray =
          this.personaService.etiquetaPersona(
              username, personaQueryBean, reportType, reportName, reportTitle);

      response.reset();
      response.setContentType(contentType);
      response.setHeader(
          "Content-disposition", "attachment" + ";filename=\"" + fullReportName + "\"");
      response.addHeader("Pragma", "no cache");
      response.addHeader("Cache-control", "private, must-revalidate");

      ServletOutputStream outstream = response.getOutputStream();
      outstream.write(byteArray);
      outstream.flush();
      outstream.close();
    } catch (IOException e) {
      LOGGER.error(e.getMessage());
      return "app/errorPage";
    }

    return null;
  }
  /**
   * Peticion para exportar el pdf de detalle de una persona
   *
   * @param request Peticion
   * @param response Respuesta
   * @return Componente tile al que se redirige (si es correcta la generación del pdf se devuelve
   *     null)
   */
  @RequestMapping(value = "/persona/exportPersona")
  public String exportPersona(HttpServletRequest request, HttpServletResponse response) {

    // Generar el informe en formato Excel
    PersonaQueryBean personaQueryBean = new PersonaQueryBean();
    String idPersona = (String) RequestUtil.getStringParameter(request, "idPersona");
    personaQueryBean.setIdPersona(Long.valueOf(idPersona));

    String username = (String) SecurityAccess.getUserInformation().getUsername();
    String reportName = "personaDetalleReport";
    String reportTitle =
        this.messageSource.getMessage("page.breadcrumb.persona", null, WebCoreUtils.getLocale());
    String reportType = RequestUtil.getStringParameter(request, "exportType", null);
    String fullReportName = null;
    String contentType = null;

    try {
      if (reportType != null) {
        if (!reportType.equalsIgnoreCase("Exportar")) {
          if (reportType.equalsIgnoreCase("XLS")) {
            fullReportName = "personaDetalleReport.xls";
            contentType = "application/xls";
          } else if (reportType.equalsIgnoreCase("PDF")) {
            fullReportName = "personaDetalleReport.pdf";
            contentType = "application/pdf";
          } else if (reportType.equalsIgnoreCase("DOCX")) {
            fullReportName = "personaDetalleReport.doc";
            contentType = "application/doc";
          } else {
            throw new CoreException("error.export");
          }

          byte[] byteArray =
              this.personaService.exportPersona(
                  username, personaQueryBean, reportType, reportName, reportTitle);

          response.reset();
          response.setContentType(contentType);
          response.setHeader(
              "Content-disposition", "attachment" + ";filename=\"" + fullReportName + "\"");
          response.addHeader("Pragma", "no cache");
          response.addHeader("Cache-control", "private, must-revalidate");

          ServletOutputStream outstream = response.getOutputStream();
          outstream.write(byteArray);
          outstream.flush();
          outstream.close();
        } else {
          LOGGER.error("Error en el formato de tipo de exportacion; " + reportType);
          return Constantes.ERRORPAGE;
        }
      } else {
        throw new CoreException("error.request.export");
      }

    } catch (IOException e) {
      LOGGER.error(e.getMessage());
      return "app/errorPage";
    }

    return null;
  }