/**
   * Servicio de obtencion de lenguajes.
   *
   * @param type tipo de documento que se desea consultar
   * @return String
   */
  @RequestMapping(value = "/language/{lang}", method = RequestMethod.GET)
  public Object getIdiomas(@PathVariable("lang") String lang) {
    InputStream inputStream = null;
    OutputStream outputStream = null;

    try {
      System.out.println();
      return "{\"testi\":\"{\"testiSe\":\"sec\"}\"}";
    } catch (SessionTimeOutException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new SessionTimeOutException("la Sesión ha expirado.");
    } catch (InvalidInputDataException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InvalidInputDataException(e.getMessage());
    } catch (UnauthorizedException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new UnauthorizedException(e.getMessage());
    } catch (Exception e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InternalServerErrorExcepcion("Se genero un error interno.");
    } finally {
      IOUtils.closeQuietly(inputStream);
      IOUtils.closeQuietly(outputStream);
    }
  }
  /**
   * Servicio de bitacoreo de acceso.
   *
   * @param usuario usuario logeado
   * @param num numero para diferenciar la petición
   * @param pag pagina a la que se intento accesar
   * @return String
   */
  @RequestMapping(value = "/denied/{usuario}/{path}/{num}", method = RequestMethod.GET)
  public Object saveDenied(
      @PathVariable("usuario") String usuario,
      @PathVariable("num") String num,
      @PathVariable("path") String pag) {

    try {
      String mensaje = "Intento de acceso no autorizado al modulo " + pag;
      bitacoraService.insertEvent(AccionBitacora.NO_AUTORIZADO.getCodigoAccion(), usuario, mensaje);
      return "{\"response\":\"ok\"}";

    } catch (SessionTimeOutException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new SessionTimeOutException("la Sesión ha expirado.");
    } catch (InvalidInputDataException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InvalidInputDataException(e.getMessage());
    } catch (UnauthorizedException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new UnauthorizedException(e.getMessage());
    } catch (Exception e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InternalServerErrorExcepcion("Se genero un error interno.");
    }
  }
  /**
   * Servicio de obtencion de archivo PDF/XML.
   *
   * @param token token generado por el sistema para la sesion
   * @param account cuenta que se va a consultar
   * @param month mes que se desea consultar
   * @param year año del mes que se desea consultar
   * @param type tipo de documento que se desea consultar
   * @return String
   */
  @RequestMapping(value = "/pdfmethod/{token}/{archivo}/{tipo}", method = RequestMethod.GET)
  public void pdfMethod(
      @PathVariable("token") String token,
      @PathVariable("archivo") byte[] archivo,
      @PathVariable("tipo") String type,
      HttpServletRequest request,
      HttpServletResponse response) {
    InputStream inputStream = null;
    OutputStream outputStream = null;

    try {
      if (!this.utilsService.timeOutValidation(token)) {
        throw new SessionTimeOutException("No hay una sesión valida para el usuario actual.");
      }
      outputStream = response.getOutputStream();
      Properties appProperties = SystemProperties.getAppPropPath();
      if (type.equals(appProperties.getProperty("pdfType"))) {
        response.setContentType(appProperties.getProperty("pdfContentType"));
      } else if (type.equals(appProperties.getProperty("xmlType"))) {
        response.setContentType(appProperties.getProperty("xmlContentType"));
      }

      outputStream.write(archivo);
      IOUtils.copy(inputStream, outputStream);
    } catch (IOException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InternalServerErrorExcepcion("Se genero un error interno.");
    } catch (SessionTimeOutException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new SessionTimeOutException("la Sesión ha expirado.");
    } catch (InvalidInputDataException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InvalidInputDataException(e.getMessage());
    } catch (UnauthorizedException e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new UnauthorizedException(e.getMessage());
    } catch (Exception e) {
      log.error(StackTraceUtil.getStackTrace(e));
      throw new InternalServerErrorExcepcion("Se genero un error interno.");
    } finally {
      IOUtils.closeQuietly(inputStream);
      IOUtils.closeQuietly(outputStream);
    }
  }
 /**
  * Servicio login para inicio de session
  *
  * @param user nombre de usuario para acceso
  * @param password password de usuario para acceso
  * @return Objeto de autenticación que contiene nombre de usuario y token generado
  */
 @RequestMapping(value = "/login/{user}/{password}/{rand}", method = RequestMethod.GET)
 @ResponseBody
 public LoginResponse login(
     @PathVariable("user") String user,
     @PathVariable("password") String password,
     @PathVariable("rand") String nRand) {
   try {
     log.info("Solicitud login...");
     // Validamos los parametros de entrada
     if (CommonUtils.isEmpty(user) || CommonUtils.isEmpty(password)) {
       log.info("User/Password is null.");
       throw new InvalidInputDataException("User/Password is null.");
     }
     Usuario usuario =
         usuarioRepository.findByUsernameAndPassword(user, CommonUtils.encriptarCadena(password));
     if (null == usuario) {
       log.info("User/Password incorrect: " + user + ":" + password);
       throw new UnauthorizedException("User/Password incorrect.");
     }
     if (!this.utilsService.validarStatusUsuario(usuario)) {
       log.info("Usuario con status invalido");
       throw new UnauthorizedException("Usuario con status invalido");
     }
     // Genero el token de seguridad
     String token = UUID.randomUUID().toString().toUpperCase();
     // se realiza la insercion de acceso
     Acceso acceso = new Acceso();
     acceso.setToken(token);
     acceso.setLastReq(Calendar.getInstance().getTime());
     accesoRepository.save(acceso);
     // se realiza la insercion de login
     Login login = new Login();
     login.setToken(token);
     login.setUserName(user);
     this.loginRepository.save(login);
     // Retorno el token generado al usuario
     if (this.miembrosPerfilRepository.findByUsername(this.usuarioRepository.findOne(user))
         == null) {
       log.info("Usuario sin perfil asignado");
       throw new UnauthorizedException("Usuario con status invalido");
     }
     Perfil perfil =
         this.miembrosPerfilRepository
             .findByUsername(this.usuarioRepository.findOne(user))
             .getPerfil();
     this.bitacoraService.insertEvent(Long.valueOf("1"), user, "Login Success");
     this.bitacoraService.revisarBloqueo(user);
     return new LoginResponse(
         user,
         token,
         String.valueOf(perfil.getIdPerfil()),
         usuario.getBndSolPass(),
         usuario.getPersona().getNombres(),
         usuario.getPersona().getApPaterno(),
         usuario.getPersona().getApMaterno(),
         usuario.getPersona().getEmail());
   } catch (InvalidInputDataException e) {
     log.error(StackTraceUtil.getStackTrace(e));
     throw new InvalidInputDataException(e.getMessage());
   } catch (UnauthorizedException e) {
     log.error(StackTraceUtil.getStackTrace(e));
     this.bitacoraService.insertEvent(Long.valueOf("1"), user, getFailMessage());
     this.bitacoraService.revisarBloqueo(user);
     throw new UnauthorizedException(e.getMessage());
   } catch (Exception e) {
     log.error(StackTraceUtil.getStackTrace(e));
     throw new InternalServerErrorExcepcion("Se genero un error interno.");
   }
 }